什么是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 | # wget -c https://storage.googleapis.com/kubernetes-helm/helm-v2.12.3-linux-amd64.tar.gz |
解压
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 |
确认服务端tiller
1 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,如查找mysql
1 | # 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 . |
查看部署的release
1 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 4 | dependencies: - name: mariadb version: 0.6.0 repository: https://kubernetes-charts.storage.googleapis.com |
使用helm lint .命令可以检查依赖和模板配置是否正确。
使用第三方chat库
添加fabric8库
1 | # helm repo add fabric8 https://fabric8.io/helm |
搜索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