Helm 介绍
helm 是 Kubernetes 应用包管理工具, 类似于 Linux 系统上的 yum、apt 等应用包管理工具,只是管理的应用使用环境变成了 Kubernetes。
Helm 主要功能
helm 既然是管理的 Kubernetes 的应用, 那么应用主要的组成是哪些呢?
- 应用的可执行文件(容器镜像)
- 应用的配置文件(yaml 文件)
应用的可执行文件很好理解, 里面承载了应用的所有逻辑。而对于 Kubernetes 而言, 所有的可执行对象都是容器镜像。
应用的配置文件是描述用户对这个应用的使用场景的定制化参数,包括应用的依赖信息如数据库连接信息、权限证书秘钥、运行参数等等, 而 Kubernetes 的应用都是通过 yaml 文件去描述的。
Helm 保存了应用的 yaml 文件在 templates 目录下, 同时如果有其他关联应用, 也可以放到 charts 目录下,本应用的描述文件是 Chart.yaml 文件, 应用模板文件中的参数默认值都保存在根目录下的 value.yaml 文件中。
当执行 helm install 的时候, 执行了如下过程:
- 检查是否有输入参数去替换 value.yaml 中的默认值
- 使用替换后的 value.yaml 中的值, 和其他的内置对象的值去渲染 templates 目录下的 yaml 文件
- 如果 templates 目录下有 _helpers.tpl 复用模板, 则将复用模板渲染进调用的地方
- 将渲染好的 yaml 文件提交给 Kubernetes
Helm 内置对象
渲染模板的时候, {{ .Release.Name }} 使用这种方式引用内置对象 Release 的 Name。 其中 . 是顶级对象, 其中内置对象有以下这些
- Release 描述发步版本本身
- Values 应用
values.yaml中的值 - Files 访问所有的非特殊文件的对象
- Capabilities 提供 K8s 支持功能的信息
- Template 包含当前被执行模板的信息
- Chart
chart.yaml文件信息
模板函数
自带一些内置函数, 可以通过 {{ quote .Values.favorite.drink }} 的方式引用, quote 函数表示给后面的值加上引号。 模板中还可以使用管道 | , 来把前面的值作用管道后边的函数的最后一个参数, 比如 {{ .Values.favorite.food | upper | quote }} 表示将前面的值转成大写后再加上引号。
流控制
helm 模板中可以使用流控制语句, 语法和其他模板语法类似
{{ if PIPELINE }}
# Do something
{{ else if OTHER PIPELINE }}
# Do something else
{{ else }}
# Default case
{{ end }}
{{- if eq .Values.favorite.drink "coffee" }}
mug: "true"
{{- end }}
其中有不少空格空行控制的符号, 可以参考官方文档。
toppings: |-
{{- range $.Values.pizzaToppings }}
- {{ . | title | quote }}
{{- end }}
{{- end }}
myvalue: "Hello World"
{{- $relname := .Release.Name -}}
{{- with .Values.favorite }}
drink: {{ .drink | default "tea" | quote }}
food: {{ .food | upper | quote }}
release: {{ $relname }}
{{- end }}
其中可以通过 {{- $relname := .Release.Name -}} := 的方式创建一个变量 relname, 也可以通过 {{- with .Values.favorite }} 将 with 范围内的 . 对象替换为 Values.favorite 对象。
命名模板复用
{{- define "mychart.labels" }}
labels:
generator: helm
date: {{ now | htmlDate }}
{{- end }}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
{{- template "mychart.labels" }}
data:
myvalue: "Hello World"
{{- range $key, $val := .Values.favorite }}
{{ $key }}: {{ $val | quote }}
{{- end }}
通过 define 定义一个名为 mychart.labels 的模板, 通过 {{- template "mychart.labels" }} 引用模板