在2016
年,随着k8s
成为编排领域事实上的标准,很多公司的PaaS
平台都转向以k8s
为基础容器化平台,但是Deis
(helm
公司)是一个地地道道的PaaS
服务商,在这片云原生的红海中步履维艰,幸运的是,凭借敏锐的技术嗅觉最终还是拯救了这个的团队。2016
年底,Deis
开始全面转向k8s
体系,它不像其它公司一样把k8s
作为PaaS
基础设施工具,而是围绕k8s
产生的编排文件做了应用包管理器helm
。
我们知道,k8s
是工业级的编排平台,要想服务在这个编排平台上运行,编排文件必不可缺,常见的有svc.yaml、config.yaml、deployment.yaml、ingress.yaml
,正常情况下服务正常运行起来,要执行四次kubectl apply -f
,这个处理起来比较简单,可以通过脚本或者合并编排文件,执行一次启动服务,但是如何管理这些编排文件呢?开发、测试、生产...不同环境运行的编排文件大致相同,但是会有所区别,特别对于微服务场景下,存在大量的服务,很多配置环境配置,比如副本数量、资源配置都是一样的,如何进行管理?且看下文。
Helm
提出了一种非常简单的思路,首先它提出了应用的概念,它把k8s
编排文件打包为Chart
,而这个Chart
对应的正是我们应用安装包。具体格式如下所示:
其中Chart
中会存储应用的元信息:
apiVersion: v2
name: hello-world
description: A Helm chart for Kubernetes
# 包类型可以 'application' 或者 'library'
type: application
# chart版本号
version: 0.1.0
# 应用版本号
appVersion: 1.16.0
在template
目录下面则存放着我们熟悉的编排文件,比如下面的deployment
的编排文件,里面把replicas
定义为变量,helm
进行注入和渲染。
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
labels:
hello-world
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
......
values
则提供了默认的参数配置,如下所示:
replicaCount: 1
image:
repository: nginx
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: ""
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
......
通过上面的chart
,就可以通过修改外层values
中的变量,helm
把变量注入到模板中,从而完成了配置的修改。你可以直接直接helm install app app/helloword
就完成了服务配置的修改和编排文件的启动,当然helm
允许你打成压缩包,上传到Helm Hub
,别人就可以把Chart
应用直接下载,启动。所以Helm Hub
成了类似于docker Hub
的应用分发中心。成为了云原生技术体系中被广泛使用的开源项目之一。2019 kubeCON
大会,Kubernetes、Prometheus、Helm
被评为最受关注的开源项目。
最为显著的变化删除了tiller
。从上面背景介绍可以看出helm
所在公司作为一个PaaS
提供商,仍然幻想在PaaS
占有一席之地,但是随着k8s
的强势崛起,这个梦想也跟随着破灭。另外还有Release
名字可缩小至Namespace
范围,需要显示启用选项 --generate-name
,这进一步规范和完善了Helm
应用的名称问题;合并描述应用依赖的requirements.yaml
到Chart.yaml
,进一步减小用户的学习负担;支持helm push
到远端Helm Hub
,支持登陆认证;支持在容器镜像 Registry
中存储Charts
,消除Helm Hub
和DockerHub
的重合定位,命令方面由helm fetch
也改成了helm pull
,为下一步像docker pull
拉取镜像一样拉取chart
做准备;对values.yaml
里的内容进行验证等变化。
总而言之,就像python2
和python3
一样,选择helm3
就对了,如果之前使用的v2
版本,其实也没关系,helm
官方提供的有转换升级工具。
下载 https://github.com/helm/helm/releases
解压
tar xf helm-v3.2.4-linux-amd64.tar.gz & mv linux-amd64/helm /usr/local/bin/helm
配置仓库
helm repo add stable https://kubernetes-charts.storage.googleapis.com/
安装完成helm
之后,就可以进行应用的创建,打包和运行。
模板创建
helm create my-app
模板修改
初看helm
模板,有点懵,不知怎么回事,而且模板里面用了go
的模板语法,仔细分析下就会发现非常简单,请看下图:
这两张图,左边的是deployment.yaml
编排模板,右边的是values.yaml
,如上图所示deployment
中有很多以{{}}
包裹起来的变量,这些变量大多是以.Values
或者.Chart
开头的变量,这些变量都是从Chart.yaml
或者values.yaml
获取出来的。
例如:上图所示replicas
中副本数量没有写在编排文件中,而是定义在了values.yaml
中,其中的replicaCount
就是Pod
运行后的副本数量,同样的,镜像也是一样的方式暴露在values.yaml
中。Helm
在执行安装的时候,首先会取出values
和chart
中的值渲染到模板中,然后执行渲染后的k8s编排文件,渲染由Helm
帮助我们去做,我们只需要在values
中填写变化的配置部分即可。
这部分也是很多人困惑的地方,没有写过这种编排模板语法,甚至连k8s yaml
编排文件的格式还没搞明白,忽然上手感觉别扭,虽然helm
提供的有创建模板功能,但这种创建的helloword
编排文件不能满足自己需求,不要担心,比葫芦画瓢即可。
第一步你要先创建一个chart
应用;
第二步修改镜像中的内容;
第三步如果应用和创建简单的helloword
编排文件不相符合,举个例子,自己应用是有状态应用,基于statefulset
的编排,或者包含各种数据卷定义,执行如下命令,拉取到本地,解压后,模仿下即可。
当然,如何学习和参考chart
仓库,建议直接去helm
官方学习,具体参考地址如下所示:
https://helm.sh/docs/intro/using_helm/
https://hub.helm.sh
官方网站包含详细安装,如何使用helm完成应用管理。harbor里面会包含常见应用的编排,比如MySQL、redis、ES等等。
打包
打包之前可以先检查下有没有语法上错误,如果没有就可以执行如下命令进行打包。
运行
我们可以执行helm install
来安装我们应用,另外使用kubectl
查看应用是否正常运行,当然在helm install
使用--set
来修改values
中配置信息,也可以使用新编写一个values.yaml
,使用-f
命令覆盖压缩包中的values.yaml
如上图所示,可以看出Pod
已经正启动,而且helm
给出友好提示,有些场景下,我们的chart
应用是根据别的应用改造而来,这个时候会出现提示语不合适的问题,我们可以通过修改模板下的NOTES.txt订正提示语。当然,应用的打包肯定是周期性进行的,当我们修改镜像或者更改编排文件中的内容的时候,只需要修改下Chart.yaml
中的version
,然后执行helm upgrade myapp *.tgz
即可完成应用的升级。
应用上传
官方提供的有CHARTMUSEUM
,通过这个工具可以构建自己的chart
仓库,当然也可以复用现有docker harbor
,新版本的harbor
支持chart
压缩包上传与下载,当然也可以使用公有云上镜像仓库,比如:阿里云等这部分不过多赘述。
k8s
把应用抽象成各种资源对象,通过编排文件的形式体现出来。Helm
建立在k8s
编排文件之上,把编排文件制作成模板,模板中的配置信息放置到模板之外,在安装过程中动态注入到模板中,从而抽象出了应用的概念即chart
,通过chart
实现了应用的部署、测试、发布等全生命周期的管理。以上就是我对helm
使用过程中的一点心得总结,如有问题或者想深入讨论的同学请关注公众号,加我微信,希望能够帮助到大家,谢谢。
基于helm部署Kubernetes下的高可用redis
Kustomize 轻松解决多环境 yaml 编排文件的管理
原创不易,随手关注或者”在看“,诚挚感谢!