Helm使得对软件进行版本化,打包,发布,以及对部署,删除,升级甚至回滚都非常容易。
Helm 包含两个组件:Helm 客户端和 Tiller 服务器,如下图所示

Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。Helm 有两个重要的概念:chart 和 release
-
chart
是helm打包软件的包的格式,charts中包含了kubernetes所需的配置好的资源信息。 -
Tiler
是Helm的服务端,运行在kubernetes中,它用来响应helm客户端的请求,完成一系列charts操作。
使用helm部署release到kubernetes
1.构建helm chart
1 2 |
可以使用 helm crater [chart_name] |
chart的文件结构
1 2 3 4 5 6 7 8 9 |
├── charts ├── Chart.yaml ├── templates │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── ingress.yaml │ ├── NOTES.txt │ └── service.yaml └── values.yaml |
-
Chart.yaml
描述了chart的信息,包括名字,版本,描述信息等等。 -
values.yaml
存储变量,给templates
文件中定义的资源使用。 -
templates
文件夹中使用go语言的模版语法,定义了各类kubernetes资源,结合values.yaml
中的变量值,声称实际的资源声明文件。NOTES.txt
:在执行helm instll安装此Chart之后会被输出到屏幕的一些自定义信息
本次我们不使用helm create去创建,手动创建各个文件
1.创建存放文件夹
1 2 3 |
创建存放文件夹 $ mkdir ./hello-world $ cd ./hello-world |
2.创建自描述文件 Chart.yaml , 这个文件必须有 name 和 version 定义,必须这样写,必须包含name和version字段
1 2 3 4 |
cat <<'EOF' > ./Chart.yaml name: hello-world version: 1.0.0 EOF |
3.创建模板文件, 用于生成 Kubernetes 资源清单(manifests)
1 |
mkdir ./templates |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
cat <<'EOF' > ./templates/deployment.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: hello-world spec: replicas: 1 template: metadata: labels: app: hello-world spec: containers: - name: hello-world image: hub.atshooter.com/k8s/nginx:v1.0 ports: - containerPort: 80 protocol: TCP EOF |
4.创建service(svc)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
cat <<'EOF' > ./templates/service.yaml apiVersion: v1 kind: Service metadata: name: hello-world spec: type: NodePort ports: - port: 80 targetPort: 80 protocol: TCP selector: app: hello-world EOF |
5.使用命令 helm install RELATIVE_PATH_TO_CHART 创建一次Release
release理解:
1 |
release 是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成 一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release |
1 |
helm install . |
6.常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#查看helm列表(列出已经部署的 Release) helm list NAME REVISION UPDATED STATUS CHART APP VERSION NAMESPACE dapper-wolf 1 Tue Mar 17 13:45:38 2020 DEPLOYED hello-world-1.0.0 default #helm更新(重新读取配置文件安装) helm upgrade [release_name] #历史信息(可以查看更新前版本) helm history [release_name] #查看状态(可以查看到pod,svc,deployment) helm status [release_name] #回滚到指定版本 # helm rollback [release_name] [版本号] #移除所有与这个 Release 相关的 Kubernetes 资源(注意这里的移除时扔到了回收站,假如你反悔了还可以找回) $ helm delete [release_name] #彻底移除,使用helm delete --purge [release_name] 移除所有与指定 Release 相关的 Kubernetes 资源和所有这个elease 的记录 $ helm delete --purge [release_name] #查看删除历史记录(彻底移除后这里记录就会被清空) $ helm ls --deleted |
查看release

更新release
如果想更新release,那么可以通过配置文件values.yaml
创建values.yaml
1 2 3 4 5 |
cat <<'EOF' > ./values.yaml image: repository: nginx tag: '1.16.1' EOF |
values.yaml 这个文件中定义的值,在模板文件中可以通过[ .Values ]对象访问到
修改templates/deployment.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: hello-world spec: replicas: 1 template: metadata: labels: app: hello-world spec: containers: - name: hello-world image: {{ .Values.image.repository }}:{{ .Values.image.tag }} #修改deployment的此处使其动态获取value.yaml文件中定义的镜像和标签 ports: - containerPort: 8080 protocol: TCP |
然后执行更新命令
1 |
helm upgrade [release_name] . |

进入pod查看nginx版本是否已经更替为1.16.1

查看更新历史
1 |
helm history dapper-wolf |

回滚到上一个版本
1 |
# helm rollback [release_name] [版本号] |
等等…
1 2 3 4 5 6 7 8 9 |
#在 values.yaml 中的值,可以被部署 release 时用到的参数 --values YAML_FILE_PATH 或 --set key1=value1, key2=value2 覆盖掉. helm install --set image.tag='latest' . #升级版本 helm upgrade [release_name] . helm upgrade -f values.yaml [release_name] . helm upgrade [release_name] --set image.tag='latest' 更多helm变量这些,去看官方文档 |
Debug[测试脚本是否可以正常运行]
1 2 3 4 |
# 使用模板动态生成K8s资源清单,非常需要能提前预览生成的结果。 # 使用--dry-run --debug 选项来打印出生成的清单文件内容,而不执行部署 helm install . --dry-run --debug helm install . --dry-run --debug --set image.tag=latest |
- 本文固定链接: https://www.yoyoask.com/?p=2412
- 转载请注明: shooter 于 SHOOTER 发表