参考文档:

https://helm.sh/zh/docs/

https://zhuanlan.zhihu.com/p/350328164

helm概念s

helm是kubernetes生态系统中的一个软件包管理工具,类似ubuntu的apt,centos的yum或python的pip一样,专门负责管理kubernetes应用资源;使用helm可以对kubernetes应用进行统一打包、分发、安装、升级以及回退等操作。

Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。

解决的问题:

  • 难管理,每个服务都有若干配置,缺乏更高层次的组织方式。
  • 不容易将这些服务作为一个整体发布,部署人员需要理解都包含哪些服务、服务间的逻辑顺序,缺少依赖关系的管理。
  • 不能高效的共享和重用。
  • 没有应用级别的版本管理,现有的回滚是针对 deployment的,不支持整个应用。
  • 不支持应用状态的验证,kubernetes的健康检查是针对单个容器的,我们需要应用级别的检查。

helm的核心流程

  • 从chart仓库中获取chart;
  • 使用者配置自己的values文件,根据自己的运行环境对values进行修改;
  • 默认values文件和使用者values文件会进行一个merge,形成最终的values文件;
  • 使用最终的values文件,渲染chart的template,形成可以被kubernetes执行的yaml;
  • 调用kube apply提交yaml到kubernetes

安装helm (二进制版)

1
2
3
4
1、wget https://get.helm.sh/helm-v3.8.1-linux-amd64.tar.gz
2、tar -zxvf helm-v3.8.1-linux-amd64.tar.gz
3、mv linux-amd64/helm /usr/local/bin/helm
4、helm repo add bitnami https://charts.bitnami.com/bitnami

基本命令

在repo 或 hub中搜索一个chart

1
helm search repo redis / helm search hub redis

安装一个helm包

1
2
helm install bitnami/redis --generate-name (helm自动生成名字)
helm install test-redis bitnami/redis

查看release状态

1
helm status test-redis

想配置选项前 先查看chart中可配置的选项

1
helm show values bitnami/redis

安装过程中覆盖原始配置

1
2
3
4
5
6
7
8
# 两种方式:
1、helm install -f values.yaml bitnami/redis --generate-name (-f == --values, 可以指定多次,右边优先级高)
2、helm install --set servers[0].port=80,servers[0].host=example bitnami/redis --generate-name
# 需要注意的点:
1、两种方式可以重用,set的值会被合并到--values中且优先级更高
2、set中的内容会被保存到configmap中
3、helm get values <release-name>,可查看--set的值
4、运行 helm upgrade 并指定 --reset-values 字段来清除 --set 中设置的值

升级release

1
2
helm upgrade -f test.yaml test-redis bitnami/redis
# 可通过helm get values查看是否真的生效

回滚版本

1
2
3
helm rollback test-redis 1
# 1是最初的REVISION,以下命令可以查看版本号
helm history [RELEASE]

卸载release

1
helm uninstall test-redis

打印出已上传到server的K8S资源

1
helm get manifest [release name]

Chart模板

想测试模板渲染内容,不想安装应用命令

1
helm install --debug --dry-run name ./xxx

创建模板命令

1
helm create mychart

已存在文件:

  • NOTES.txt: chart的”帮助文本”。这会在你的用户执行helm install时展示给他们。
  • deployment.yaml: 创建Kubernetes 工作负载的基本清单
  • service.yaml: 为你的工作负载创建一个 service终端基本清单。
  • _helpers.tpl: 放置可以通过chart复用的模板辅助对象
内置对象列表:

https://helm.sh/zh/docs/chart_template_guide/builtin_objects/

Values文件

可以来自于多个位置(优先级依次变高):

  • chart中的values.yaml文件
  • 如果是子chart,就是父chart中的values.yaml文件
  • 使用-f参数(helm install -f myvals.yaml ./mychart)传递到 helm install 或 helm upgrade的values文件
  • 使用–set (比如helm install –set foo=bar ./mychart)传递的单个参数

Notes: 如果想删除默认的key,就把默认的key指定为null

常用函数:

https://helm.sh/zh/docs/chart_template_guide/functions_and_pipelines/
https://helm.sh/zh/docs/chart_template_guide/function_list/

流控制:

https://helm.sh/zh/docs/chart_template_guide/control_structures/

变量:

https://helm.sh/zh/docs/chart_template_guide/variables/
赋值以及引用:

1
2
3
4
5
{{ $name := "test" }}
{{ $name }}

# $ 变量一直指向根的上下文
{{ $.Release.Name}}
命名模板

https://helm.sh/zh/docs/chart_template_guide/named_templates/

定义以及使用:

1
2
3
4
5
6
7
8
# 定义:
{{- define "mychart.labels" }}
labels:
generator: helm
date: {{ now | htmlDate }}
{{- end }}
# 使用:
{{- template/include "mychart.labels" }}

一般模板放在局部文件中,通常是在_helpers.tpl

访问文件

https://helm.sh/zh/docs/chart_template_guide/accessing_files/

helm通过.Files访问文件。需要注意:

  • 可以添加额外的文件到chart中。虽然这些文件会被绑定。但是要小心,由于Kubernetes对象的限制,Chart必须小于1M。
  • 通常处于安全考虑,一些文件无法通过.Files对象访问:
    • 无法访问templates/中的文件
    • 无法访问使用.helmignore排除的文件
    • helm应用 subchart之外的文件,包括父级中的,不能被访问的
  • Chart不能保留UNIX模式信息,因此当文件涉及到.Files对象时,文件级权限不会影响文件的可用性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 把文件内容写到configMap中
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
{{- $files := .Files }}
{{- range tuple "config1.toml" "config2.toml" "config3.toml" }}
{{ . }}: |-
{{ $files.Get . }}
{{- end }}

# 通过.Files.Glob 以及 range来读文件内容
{{ range $path, $_ := .Files.Glob "**.yaml" }}
{{ $.Files.Get $path }}
{{ end }}

# 使用Glob的方法把文件内容写在configmap或secret中
apiVersion: v1
kind: ConfigMap
metadata:
name: conf
data:
{{ (.Files.Glob "foo/*").AsConfig | indent 2 }}
---
apiVersion: v1
kind: Secret
metadata:
name: very-secret
type: Opaque
data:
{{ (.Files.Glob "bar/*").AsSecrets | indent 2 }}
子chart和全局值

https://helm.sh/zh/docs/chart_template_guide/subcharts_and_globals/

  • 子chart被认为是“独立的”,意味着子chart从来不会显示依赖它的父chart。
  • 子chart无法访问父chart的值。
  • 父chart可以覆盖子chart的值。
  • Helm有一个 全局值 的概念,所有的chart都可以访问。
调试模板命令

https://helm.sh/zh/docs/chart_template_guide/debugging/

更多Helm相关介绍

https://helm.sh/zh/docs/topics/