概念

Helm是什么?
- 对于应用发布者而言,可以通过Helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。
- 对于使用者而言,使用Helm后不用需要了解Kubernetes的Yaml语法并编写应用部署文件,可以通过Helm下载并在kubernetes上安装需要的应用。

Helm还提供了kubernetes上的软件部署,删除,升级,回滚应用的功能。Helm 对于 Kubernetes 来说就相当于 yum 对于 Centos 。

重要概念

  • Chart,应用的信息集合,包括各种对象的配置模板、参数定义、依赖关系、文档说明等。
  • Repoistory,chart仓库,存储chart的地方,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。
  • Release, 当 chart 被安装到 kubernetes 集群,就生成了一个 release ,是 chart 的运行实例,代表了一个正在运行的应用。

kubernetes 管理的对象叫做资源(比如 pod)。helm 将互相关联的多个资源统一打包成一个整体,交给 Kubernetes 去运行。这个被打包的整体叫做 chart 。

安装

基于一个可用的 Kubernetes 集群,然后在使用 Helm 的节点上已经配置好可通过 kubectl 访问集群,因为 Helm 是读取 kubeconfig 文件来访问集群。

安装
$ wget https://mirrors.huaweicloud.com/helm/v3.6.0/helm-v3.6.0-linux-amd64.tar.gz
$ tar -zxf helm-v3.6.0-linux-amd64.tar.gz
$ cd linux-amd64/
$ mv helm /usr/sbin/

验证
$ helm version
version.BuildInfo{Version:”v3.6.0”, GitCommit:”7f2df6467771a75f5646b7f12afb408590ed1755”, GitTreeState:”clean”, GoVersion:”go1.16.3”}

同步最新charts信息到本地(因官方的 charts 仓库地址需要科学上网)
$ helm repo add stable http://mirror.azure.cn/kubernetes/charts/
$ helm repo update

查看仓库列表
$ helm repo list

从仓库中把chart包下载到本地
$ helm pull stable/mysql
$ tar -axvf mysql-1.6.9.tgz
$ tree mysql
mysql
├── Chart.yaml
├── README.md
├── templates
│ ├── configurationFiles-configmap.yaml
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── initializationFiles-configmap.yaml
│ ├── NOTES.txt
│ ├── pvc.yaml
│ ├── secrets.yaml
│ ├── serviceaccount.yaml
│ ├── servicemonitor.yaml
│ ├── svc.yaml
│ └── tests
│ ├── test-configmap.yaml
│ └── test.yaml
└── values.yaml

2 directories, 15 files

示例

使用 helm 安装应用

  1. # helm 搜索chart包
  2. $ helm search repo mysql
  3. # 从仓库安装
  4. $ helm install mysql stable/mysql
  5. # 查看
  6. $ helm ls
  7. NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
  8. mysql default 1 2021-12-01 14:50:19.636178449 +0800 CST deployed mysql-1.6.9 5.7.30
  9. # 根据标签筛选
  10. $ kubectl get all -l release=mysql
  11. NAME READY STATUS RESTARTS AGE
  12. pod/mysql-54bbdd8f86-x9nhw 0/1 Pending 0 2m43s
  13. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  14. service/mysql ClusterIP 10.97.148.99 <none> 3306/TCP 2m43s
  15. NAME READY UP-TO-DATE AVAILABLE AGE
  16. deployment.apps/mysql 0/1 1 0 2m43s
  17. NAME DESIRED CURRENT READY AGE
  18. replicaset.apps/mysql-54bbdd8f86 1 1 0 2m43s
  19. # 查看chart包(mysql)特性
  20. $ helm show chart stable/mysql
  21. apiVersion: v1
  22. appVersion: 5.7.30
  23. deprecated: true
  24. description: DEPRECATED - Fast, reliable, scalable, and easy to use open-source relational
  25. database system.
  26. home: https://www.mysql.com/
  27. icon: https://www.mysql.com/common/logos/logo-mysql-170x115.png
  28. keywords:
  29. - mysql
  30. - database
  31. - sql
  32. name: mysql
  33. sources:
  34. - https://github.com/kubernetes/charts
  35. - https://github.com/docker-library/mysql
  36. version: 1.6.9
  37. # 查看更多信息
  38. $ helm show all stable/mysql
  39. # 删除
  40. $ helm uninstall mysql
  41. $ helm status mysql
  42. Error: release: not found
  43. # uninstall 命令会从 Kubernetes 中删除与 release 相关的所有 Kubernetes 资源以及 release 历史记录。
  44. # 在删除的时候使用 --keep-history 参数,则会保留 release 的历史记录
  45. $ helm uninstall mysql --keep-history
  46. $ helm status mysql
  47. NAME: mysql
  48. LAST DEPLOYED: Wed Dec 1 16:53:45 2021
  49. NAMESPACE: default
  50. STATUS: uninstalled
  51. REVISION: 1
  52. ...
  53. $ helm ls -a
  54. NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
  55. mysql default 1 2021-12-01 16:53:45.300748666 +0800 CST uninstalled mysql-1.6.9 5.7.30

使用 helm 按需配置应用

使用 helm install 命令安装的 chart 包,只会使用 chart 的默认配置选项。根据自己需求定制 chart 包配置参数也是一种使用场景。

命令查看 chart 包所有可配置参数选项

  1. $ helm pull stable/mysql
  2. $ helm show values stable/mysql
  3. ## mysql image version
  4. ## ref: https://hub.docker.com/r/library/mysql/tags/
  5. ##
  6. image: "mysql"
  7. imageTag: "5.7.30"
  8. ...
  9. ...
  10. ## Create a database user
  11. ##
  12. # mysqlUser:
  13. ## Default: random 10 character string
  14. # mysqlPassword:
  15. ## Allow unauthenticated access, uncomment to enable
  16. ##
  17. # mysqlAllowEmptyPassword: true
  18. ## Create a database
  19. ##
  20. # mysqlDatabase:
  21. ...
  22. ...
  23. ## Persist data to a persistent volume
  24. persistence:
  25. enabled: true
  26. ## database data Persistent Volume Storage Class
  27. ## If defined, storageClassName: <storageClass>
  28. ...


#所有参数都可以覆盖,通过 YAML 格式文件传递

  1. # 将 values 可配置参数通过文件传入,原文件默认注释
  2. $ cat config.yaml
  3. mysqlUser: user0
  4. mysqlPassword: user0pwd
  5. mysqlDatabase: user0db
  6. persistence:
  7. enabled: false
  8. $ helm install -f config.yaml stable/mysql --generate-name
  9. WARNING: This chart is deprecated
  10. NAME: mysql-1638349802
  11. LAST DEPLOYED: Wed Dec 1 17:10:04 2021
  12. NAMESPACE: default
  13. STATUS: deployed
  14. ...

查看

  1. $ kubectl get pod
  2. NAME READY STATUS RESTARTS AGE
  3. mysql-1638349802-76b958c-d7cw9 1/1 Running 0 83s
  4. $ kubectl get pod -l release=mysql-1638349802
  5. NAME READY STATUS RESTARTS AGE
  6. mysql-1638349802-76b958c-d7cw9 1/1 Running 0 93s
  7. $ kubectl describe pod mysql-1638349802-76b958c-d7cw9
  8. ...
  9. Environment:
  10. MYSQL_ROOT_PASSWORD: <set to the key 'mysql-root-password' in secret 'mysql-1638349802'> Optional: false
  11. MYSQL_PASSWORD: <set to the key 'mysql-password' in secret 'mysql-1638349802'> Optional: false
  12. MYSQL_USER: user0
  13. MYSQL_DATABASE: user0db
  14. ...


在安装过程中,有两种方法可以传递配置数据:

  • —values(或者 -f):指定一个 YAML 文件来覆盖 values 值,可以指定多个值,最后边的文件优先
  • —set:在命令行上指定覆盖的配置。
  1. --set 选项接收零个或多个 name/value 对,最简单的用法就是 --set name=value,相当于 YAML 文件中的:
  2. name: value
  3. 多个值之间用字符串“,”隔开,用法就是 --set a=b,c=d,相当于 YAML 文件中的:
  4. a: b
  5. c: d
  6. 也支持更加复杂的表达式,例如 --set outer.inner=value,对应 YAML
  7. outer:
  8. inner: value
  9. 对于列表数组可以用 {} 来包裹,比如 --set name={a, b, c},对应 YAML
  10. name:
  11. - a
  12. - b
  13. - c
  14. 数组索引语法访问列表中某个项,比如 --set servers[0].port=80,对应的 YAML 为:
  15. servers:
  16. - port: 80
  17. 也可以设置多个值,比如 --set servers[0].port=80,servers[0].host=example,对应的 YAML 为:
  18. servers
  19. - port: 80
  20. host: example
  21. 特殊字符用反斜杠来转义字符,比如 --set name=value1,value2,对应的 YAML 为:
  22. name: "value1,value2"

使用 helm 创建定制应用

定制流程

执行命令 helm create myapp 创建模板
修改对应内容,验证charts格式 cd myapp && helm lint

查看charts文件内容 helm inspect chart myapp
查看value文件内容 helm inspect values myapp
查看charts模板渲染后生成的kubernetes yaml资源内容 helm template myapp

chart

  1. # helm create myapp
  2. # tree myapp/
  3. myapp/ # chart 包目录名
  4. Chart.yaml # 包含了chart信息的YAML文件
  5. LICENSE # 可选: 包含chart许可证的纯文本文件
  6. README.md # 可选: 可读的README文件
  7. values.yaml # chart 默认的配置值
  8. values.schema.json # 可选: 一个使用JSON结构的values.yaml文件
  9. charts/ # 包含chart依赖的其他chart
  10. crds/ # 自定义资源的定义
  11. templates/ # 模板目录, 当和values 结合时,可生成有效的Kubernetes manifest文件
  12. templates/NOTES.txt # 可选: 包含简要使用说明的纯文本文件

在 Kubernetes 中部署一个应用,通常需要编写deployment、service、ingress三个配置文件,通过 helm create 命令会默认创建。

Chart.yaml 文件是 chart 必需的,包含字段:

  1. apiVersion: chart API 版本 (必需)
  2. name: chart名称 (必需)
  3. version: 版本(必需)
  4. kubeVersion: 兼容Kubernetes版本的语义化版本(可选)
  5. description: 一句话对这个项目的描述(可选)
  6. type: chart类型 (可选)
  7. keywords:
  8. - 关于项目的一组关键字(可选)
  9. home: 项目home页面的URL (可选)
  10. sources:
  11. - 项目源码的URL列表(可选)
  12. dependencies: # chart 必要条件列表 (可选)
  13. - name: chart名称 (nginx)
  14. version: chart版本 ("1.2.3")
  15. repository: 仓库URL ("https://example.com/charts") 或别名 ("@repo-name")
  16. condition: (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )
  17. tags: # (可选)
  18. - 用于一次启用/禁用 一组charttag
  19. enabled: (可选) 决定是否加载chart的布尔值
  20. import-values: # (可选)
  21. - ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项
  22. alias: (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用
  23. maintainers: # (可选)
  24. - name: 维护者名字 (每个维护者都需要)
  25. email: 维护者邮箱 (每个维护者可选)
  26. url: 维护者URL (每个维护者可选)
  27. icon: 用做iconSVGPNG图片URL (可选)
  28. appVersion: 包含的应用版本(可选)。不需要是语义化的
  29. deprecated: 不被推荐的chart (可选,布尔值)
  30. annotations:
  31. example: 按名称输入的批注列表 (可选).

values

Values 对象是为 Chart 模板提供值,此对象的值有4个来源,后面的可以覆盖前面的。

  • chart 包中的 values.yaml 文件
  • 父 chart 包的 values.yaml 文件
  • 通过 helm install 或者 helm upgrade 的 -f 传入的自定义 yaml 文件
  • 通过 —set 参数传入的值

在模板文件中,通过 {{.Values}} 对象来访问设置的值。