Kubernetes Helm使用

什么是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。
image

解决本地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

0%