什么是Helm
在没使用helm之前,向kubernetes部署应用,我们要依次部署deployment、svc等,步骤较繁琐。况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用的部署和管理.
Helm本质就是让K8s的应用管理(Deployment,Service等)可配置,能动态生成。通过动态生成K8s资源清单文件(deployment.yaml,service.yaml)。然后调用Kubectl自动执行K8s资源部署。
Helm和charts的主要作用
- 应用程序封装
- 版本管理
- 依赖检查
- 便于应用程序分发
组成
helm客户端
- 制作、拉取、查找和验证 Chart
- 安装服务端Tiller
- 指示服务端Tiller做事,比如根据chart创建一个Release
helm服务端 tiller
- 安装在Kubernetes集群内的一个应用, 用来执行客户端发来的命令,管理Release
安装Helm客户端
下载期望的版本1
解压1
# tar -zxvf helm-v2.12.3-linux-amd64.tar.gz
在解压后的文件夹中找到Helm命令所在位置, 将它移动到期望位置1
mv linux-amd64/helm /usr/local/bin/helm
安装helm服务端tiller
执行命令1
# helm init --upgrade --tiller-image registry.cn-beijing.aliyuncs.com/minminmsn/tiller:v2.12.3 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
确认服务端tiller1
2# kubectl get pods -n kube-system |grep tiller
tiller-deploy-99dcdbf5f-ddwbg 1/1 Running 0 4m28s
确认客户端和服务端连接成功。如果只显示了客户端版本,说明没有连上服务端。 它会自动去K8s上kube-system命名空间下查找是否有Tiller的Pod在运行。1
2
3# helm version
Client: &version.Version{SemVer:"v2.12.3", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.12.3", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
查找helm仓库中可用chart,如查找mysql1
helm search mysql
默认安装的 tiller 权限很小,我们执行下面的脚本给它加最大权限,这样方便我们可以用 helm 部署应用到任意 namespace 下:1
2
3
4
5# kubectl create serviceaccount --namespace=kube-system tiller
# kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
# kubectl patch deploy --namespace=kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
创建自己的chart
我们创建一个名为mychart的chart,看一看chart的文件结构。1
2
3
4
5
6
7
8
9
10
11
12$ helm create mongodb
$ tree mongodb
mongodb
├── Chart.yaml #Chart本身的版本和配置信息
├── charts #依赖的chart
├── templates #配置模板目录
│ ├── NOTES.txt #helm提示信息
│ ├── _helpers.tpl #用于修改kubernetes objcet配置的模板
| |—— ingress.yaml #用于服务暴露或访问
│ ├── deployment.yaml #kubernetes Deployment object
│ └── service.yaml #kubernetes Serivce
└── values.yaml #kubernetes object configuration
如此,我们可以按需编辑自动生成的yaml文件。templates目录下的yaml文件中的变量是从values.yaml文件中获取的。
使用命令验证chart配置。该输出中包含了模板的变量配置与最终渲染的yaml文件。1
# helm install --dry-run --debug mongodb
部署到kubernetes
在mongodb目录下执行下面的命令将nginx部署到kubernetes集群上。1
helm install .
查看部署的release1
2
3# helm list
NAME REVISION UPDATED STATUS CHART NAMESPACE
garish-gopher 1 Wed Feb 27 11:24:36 2019 DEPLOYED mongodb-0.1.0 default
打包分享
我们可以修改Chart.yaml中的helm chart配置信息,然后使用下列命令将chart打包成一个压缩文件。1
# helm package .
打包出mongodb-0.1.0.tgz文件。
依赖
我们可以在requirements.yaml中定义应用所依赖的chart,例如定义对mariadb的依赖:1
2
3
4dependencies:
- name: mariadb
version: 0.6.0
repository: https://kubernetes-charts.storage.googleapis.com
使用helm lint .命令可以检查依赖和模板配置是否正确。
使用第三方chat库
添加fabric8库1
搜索fabric8提供的工具(主要就是fabric8-platform工具包,包含了CI、CD的全套工具)1
helm search fabric8
我们在前面打包的chart可以通过HTTP server的方式提供。1
2
3# helm serve --address 172.16.0.180:8879
Regenerating index. This may take a moment.
Now serving you on 172.16.0.180:8879
访问http://172.16.0.180:8879可以看到刚刚安装的chart。
解决本地chart依赖
打开另外一个终端,在本地当前chart配置的目录下,将该repo加入到repo list中。1
helm repo add local http://172.16.0.180:8879
在浏览器中访问http://172.16.0.180:8879,可以看到所有本地的chart。
然后下载依赖到本地。1
helm dependency update
这样所有的chart都会下载到本地的charts目录下。
设置helm命令自动补全
为了方便helm命令的使用,helm提供了自动补全功能,如果使用bash请执行:1
source <(helm completion bash)
Example: 安装Mysql
执行命令1
2
3 helm repo update
helm install stable/mysql
Released smiling-penguin
每次安装都有一个Release被创建, 所以一个Chart可以在同一个集群中被安装多次,每一个都是独立管理和升级的。其中 stable/mysql是Chart名, smiling-penguid 是Release名,后面管理Release时都是用的这个名字。
在使用一个Chart前,查看它的默认配置,然后使用配置文件覆盖它的默认设置1
helm inspect values stable/mariadb
使用一个YAML文件,内含要覆盖Chart的配置值。1
2 echo '{mariadbUser: user0, mariadbDatabase: user0db}' > config.yaml
helm install -f config.yaml stable/mariadb
values.yaml中的值可以被部署release时用到的参数–values YAML_FILE_PATH 或 –set key1=value1, key2=value2覆盖掉, 比如1
helm install --set image.tag='latest' .
优先级: –set设置的值会覆盖–value设置的值, –value设置的值会覆盖 values.yaml中定义的值
helm一些常用命令
Charts:
helm search 查找可用的Charts
helm inspect 查看指定Chart的基本信息
helm install 根据指定的Chart 部署一个Release到K8s
helm create 创建自己的Chart
helm package 打包Chart,一般是一个压缩包文件
release:
helm list 列出已经部署的Release
helm delete [RELEASE] 删除一个Release. 并没有物理删除, 出于审计需要,历史可查。
helm status [RELEASE] 查看指定的Release信息,即使使用helm delete命令删除的Release.
helm upgrade 升级某个Release
helm rollback [RELEASE] [REVISION] 回滚Release到指定发布版本
helm get values [RELEASE] 查看Release的配置文件值
helm ls –deleted 列出已经删除的Release
repo:
helm repo list
helm repo add [RepoName] [RepoUrl]
helm repo update