Helm 常用命令

命令 描述
create 创建一个 chart 并指定名字
dependency 管理 chart 依赖
get 下载一个 release。可用子命令:all、hooks、manifest、notes、values
history 获取 release 历史
install 安装一个 chart
list 列出 release
package 将 chart 目录打包到 chart 存档文件中
pull 从远程仓库中下载 chart 并解压到本地 helm pull stable/mysql –untar
repo 添加,列出,移除,更新和索引 chart 仓库。可用子命令:add、index、list、remove、update
rollback 从之前版本回滚
search 根据关键字搜索 chart。可用子命令:hub、repo
show 查看 chart 详细信息。可用子命令:all、chart、readme、values
status 显示已命名版本的状态
template 本地呈现模板
uninstall 卸载一个 release
upgrade 更新一个 release
version 查看 helm 客户端版本

配置国内 Chart 仓库

1 添加存储库

1
2
3
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
helm repo update

2 查看配置的存储库

1
2
helm repo list
helm search repo stable

3 删除存储库

1
helm repo remove aliyun

Helm 基本使用

主要介绍几个命令:

  • chart install

  • chart status

  • chart upgrade

  • chart history

  • chart rollback

  • chart uninstall

1 使用 chart 部署一个应用

1.1 查找 chart

1
2
helm search repo
helm search repo bitnami/nginx

1.2 查看 chart 信息

1
helm show chart bitnami/nginx -n $namespace

1.3 安装包

1
helm install my-release bitnami/nginx -n $namespace

1.4 查看发布状态

1
helm status my-release -n $namespace

1.5 更新配置

更新过程中有两种方法可以传递配置数据:

  • –values(或-f):指定带有覆盖的 YAML 文件。这可以多次指定,最右边的文件优先
  • –set:在命令行上指定替代。如果两者都用,–set 优先级高
1
helm upgrade my-release bitnami/nginx -n $namespace --set image.tag="1.23.0-debian-11-r0"

1.6 查看历史版本

1
helm history my-release -n $namespace

1.7 回滚

1
helm rollback my-release 1 -n $namespace

1.8 删除

1
helm uninstall my-release -n $namespace

构建一个 Chart

先给学员自动生成目录讲解,然后再手动给学员创建目录和各个文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
helm create mychart

tree mychart/
mychart/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ └── service.yaml
└── values.yaml
  • Chart.yaml:用于描述这个 Chart 的基本信息,包括名字、描述信息以及版本等。
  • values.yaml :用于存储 templates 目录中模板文件中用到变量的值。
  • Templates: 目录里面存放所有 yaml 模板文件。
  • charts:目录里存放这个 chart 依赖的所有子 chart。
  • NOTES.txt :用于介绍 Chart 帮助信息, helm install 部署后展示给用户。例如:如何使用这个 Chart、列出缺省的设置等。
  • _helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用

创建 Chart 后,接下来就是将其部署:

1
helm install web mychart/

也可以打包推送的 charts 仓库共享别人使用。

1
2
helm package mychart/
mychart-0.1.0.tgz

1 内置对象

常用的内置对象:

变量名 描述
Release.Name release 名称
Release.Time release 的时间
Release.Namespace release 的 namespace(如果清单未覆盖)
Release.Service release 服务的名称
Release.Revision 此 release 的修订版本号,从 1 开始累加
Release.IsUpgrade 如果当前操作是升级或回滚,则将其设置为 true。
Release.IsInstall 如果当前操作是安装,则设置为 true。

常用语法

1 管道与函数

  • | 表示追加操作

  • default 表示如果 .Values.name 没有配置,他的值为 nginx

1
- name: {{ .Values.name | default "nginx" }}

2 值转换字符串

可以不用管道符直接写到函数前面

1
- name: {{ quote .Values.name }}

3 判断是 true 函数

1
2
3
4
5
6
7
8
# cat templates/vault-configmap.yaml
entryPoints:
- {{ .Values.argo.web.https | ternary "https" "http" }}

# cat values.yaml
argo:
web:
https: true

4 列表函数

  • toYaml: 获取列表

  • nindent 10: 缩进十个空格

1
2
3
4
5
6
7
8
9
10
11
12
13
# cat templates/vault-configmap.yaml
resources:
{{- toYaml .Values.argo.resources | nindent 10 }}

# cat values.yaml
argo:
resources:
limits:
cpu: 4
memory: 8192Mi
requests:
cpu: 100m
memory: 128Mi

5 流程控制

流程控制是为模板提供了一种能力,满足更复杂的数据逻辑处理。

Helm 模板语言提供以下流程控制语句:

  • if/else 条件块
  • with 指定范围
  • range 循环块

5.1 if

if/else块是用于在模板中有条件地包含文本块的方法,条件块的基本结构如下:

1
2
3
4
5
6
7
{{ if PIPELINE }}
# Do something
{{ else if OTHER PIPELINE }}
# Do something else
{{ else }}
# Default case
{{ end }}

条件判断就是判断条件是否为真,如果值为以下几种情况则为 false:

  • 一个布尔类型的

  • 一个数字

  • 一个 的字符串

  • 一个 nil(空或 null

  • 一个空的集合( mapslicetupledictarray

除了上面的这些情况外,其他所有条件都为

例如,如果实例数(.Values.vault.replicaCount)大于 1,则值为 ha_enabled: true

1
2
3
# cat values.yaml
vault:
replicas: 2
1
2
3
# cat templates/vault-configmap.yaml
ha_enabled:
{{ if gt (int .Values.vault.replicaCount) 1 }}"true"{{ else }}"false"{{ end }}

其中运算符 gt是判断是否大于的操作,除此之外,还有 nelteqandor等运算符。

通过模板引擎来渲染一下,会得到如下结果:

1
2
3
4
helm install --dry-run web ../mychart/
...
ha_enabled:
"true"

5.1.1 消除空行

可以看到渲染出来会有多余的空行,这是因为当模板引擎运行时,会将控制指令删除,所有之前占的位置也就空白了,需要使用{{- if ... }}的方式消除此空行:

1
2
3
4
# cat templates/deploymemt.yaml
...
ha_enabled:
{{- if gt (int .Values.vault.replicaCount) 1 }}"true"{{ else }}"false"{{ end }}

如果使用{{-`需谨慎,因为`{{-`它删除了双方的换行符。 比如上面模板文件会渲染成:

1
ha_enabled: "true"
## 6 with > 控制变量作用域。 > > 其语法和一个简单的 `if`语句比较类似:
1
2
3
{{ with PIPELINE }}
# restricted scope
{{ end }}
`with`语句可以允许将当前范围 `.`设置为特定的对象,比如我们前面一直使用的 `.Values.label`,我们可以使用 `with`来将 `.`范围指向 `.Values.label`:
1
2
3
4
5
6
# cat templates/deploymemt.yaml
...
{{- with .Values.label }}
project: {{ .project }}
app: {{ .app }}
{{- end }}
上面增加了一个{{- with .Values.label }} xxx {{- end }}的一个块,这样的话就可以在当前的块里面直接引用
.project.app`了。

需要注意的在 with声明的范围内,将无法从父范围访问到其他对象了,比如.Release.Name 是不生效的:

1
2
3
4
5
{{- with .Values.label }}
project: {{ .project }}
app: {{ .app }}
{{ .Release.Name }}
{{- end }}

7 range

在 Helm 模板语言中,使用 range关键字来进行循环操作。

循环内部我们使用的是一个 .,这是因为当前的作用域就在当前循环内,这个 .引用的当前读取的元素 :

7.1 每次传入单个值

1
2
3
4
5
6
# cat values.yaml
eventrouter:
labels:
- 1
- 2
- 3

7.1.1 循环打印该列表

1
2
3
4
5
6
# cat templates/event-serviceaccount
...
labels:
{{- range .Values.eventrouter.labels }}
app: {{ quote . }}
{{- end }}

7.1.2 渲染结果

1
2
3
4
labels:
app: "1"
app: "2"
app: "3"

7.2 每次传入多个值

1
2
3
4
5
# cat values.yaml
eventrouter:
labels:
app: "tst"
env: "tst"

7.2.1 循环打印该列表

1
2
3
4
5
6
# cat templates/event-serviceaccount
...
labels:
{{- range $key, $value := .Values.eventrouter.labels }}
{{ $key }}: {{ $value }}
{{- end }}

7.2.2 会渲染成

1
2
3
labels:
app: tst
env: tst

其他功能使用场景

1 判断是否开启组件

1.1 templates

1
2
3
{{- if .Values.argo.enabled -}}
...
{{- end }}

1.2 values

1
2
argo:
enabled: true

2 添加复杂内容变量

2.1 templates

1
2
"kafkaBrokers": {{ .Values.eventrouter.kafkaBrokers }}
"kafkaTopic": "{{ .Values.eventrouter.kafkaTopic }}"

2.2 values

1
2
3
kafkaBrokers: |- # |表示纯文本, -表示不换行
["10.122.23.156:9091","10.122.23.157:9091","10.122.23.158:9091"],
kafkaTopic: "test-Topic" #直接获取字段

2.3 渲染后

1
2
3
4
5
 {
"sink": "kafka",
"kafkaBrokers": ["10.122.23.156:9091","10.122.23.157:9091","10.122.23.158:9091"],
"kafkaTopic": "test-Topic"
}