
Helm | 文档首页
您需要知道的关于文档如何组织的所有内容。
介绍
属于 Kubernetes 的包管理器
元素(名词)

命令
常见命令

详细命令介绍
模版知识

创建目录
$ helm create mychart # 执行创建目录
╭─ljtian@LJTianMacdeMacBook-Pro ~/data/study/mychart # 默认目录结构 ╰─$ tree -L 2 . ├── Chart.yaml ├── charts ├── templates │ ├── _helpers.tpl # 放置可以通过chart复用的模板辅助对象 │ ├── deployment.yaml # 创建Kubernetes 工作负载的基本清单 │ ├── hpa.yaml │ ├── httproute.yaml │ ├── ingress.yaml │ ├── NOTES.txt # chart的"帮助文本"。这会在你的用户执行helm install时展示给他们。 │ ├── service.yaml # 为你的工作负载创建一个 service终端基本清单 │ ├── serviceaccount.yaml │ └── tests └── values.yaml 3 directories, 10 files
根据这些描述可以看出来,templates 放置的内容主要为 k8s 资源的 yaml 文件。
模版
$ cat configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap # 模版主要在这部分 {{ }} 括起来,这个是 go 的写法 data: myvalue: "Hello World"
可以使用 --debug --dry-run 参数进行试用行。 这样就可以知道模板替换的正式值,方便进行问题排查。
内部变量
官网有详细介绍,用到什么找什么 https://helm.sh/zh/docs/chart_template_guide/builtin_objects/
使用 values.yaml 中的变量进行渲染
values.yaml
favoriteDrink: coffee favorite: drink: coffee food: pizza
templates/configmap.yaml
apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap data: myvalue: "Hello World" drink: {{ .Values.favorite.drink }} food: {{ .Values.favorite.food }}
通过 {{ .Values.XXX.XXX }} 进行变量使用
注意:如果将值设置为 null ,将会被 helm 删除对应的 key
模版函数
{{ quote .Values.favorite.food }} 函数定义:https://masterminds.github.io/sprig/
常用函数:
- default :
{{ .Values.favorite.drink | default "tea" | quote }}没有值时,设置默认值
- lookup: 从 kubernetes 集群中查找资源,通过 apiVersion, kind, namespace,name 获取资源,或者资源列表。
(lookup "v1" "Namespace" "" "mynamespace").metadata.annotations
{{range $index, $service := (lookup "v1" "Service" "mynamespace" "").items }} {{/* do something with each service */}} {{ end }}
注意:--dry-run 和 helm template 时没有真实的链接 k8s 集群,所以返回的是空列表
- (
eq,ne,lt,gt,and,or) 运算符
管道
{{ .Values.favorite.food | quote }} 类似与 UNIX 的管道
控制语句
常见三种:
•
if/else, 用来创建条件语句{{ if PIPELINE }} # Do something {{ else if OTHER PIPELINE }} # Do something else {{ else }} # Default case {{ end }}
•
with, 用来指定范围, 设置局部范围(类似于 cd 到指定路径){{- with .Values.favorite }} drink: {{ .drink | default "tea" | quote }} food: {{ .food | upper | quote }} release: {{ $.Release.Name }} {{- end }}
上面这个例子中, with 相当于将当前范围切换至 .Values.favorite {{- end}} 相当于 “cd -” 。在这个例子中我们发现有个 “$” 符号。这个符号是从根目录获取,相当于全局路径。这个不受 with 影响。
•
range, 提供"for each"类型的循环变量
{{ $valueName := .Values.xxx.xxx }} 和其它编程语言一样。变量可以是有作用域的。 “$” 属于特殊的变量。它的作用域是全局。 值为 “根”
命名模板
- define : 定义模版内容
{{- define "mychart.app" -}} app_name: {{ .Chart.Name }} app_version: "{{ .Chart.Version }}" {{- end -}}
- template :不考略格式的方式引入模版
apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap labels: {{ template "mychart.app" . }} data: myvalue: "Hello World" {{- range $key, $val := .Values.favorite }} {{ $key }}: {{ $val | quote }} {{- end }} {{ template "mychart.app" . }} ### 输出内容 # Source: mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: measly-whippet-configmap labels: app_name: mychart app_version: "0.1.0" data: myvalue: "Hello World" drink: "coffee" food: "pizza" app_name: mychart app_version: "0.1.0" ### 缩进有问题
- include:考虑缩进空格个数引入模板
apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap labels: {{ include "mychart.app" . | indent 4 }} data: myvalue: "Hello World" {{- range $key, $val := .Values.favorite }} {{ $key }}: {{ $val | quote }} {{- end }} {{ include "mychart.app" . | indent 2 }} ### 输出内容 # Source: mychart/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: edgy-mole-configmap labels: app_name: mychart app_version: "0.1.0" data: myvalue: "Hello World" drink: "coffee" food: "pizza" app_name: mychart app_version: "0.1.0" ### 建议优先使用 include
在模板中访问文件
- 基础使用方式: {{ $files.Get fileName }} 获取文件里的内容
- 全局获取 .Files.Glob:
{{ range $path, $_ := .Files.Glob "**.yaml" }} {{ $.Files.Get $path }} {{ end }}
- 编码 Encoding: {{ .Files.Get "config1.toml" | b64enc }}
- 逐行读取 Lines:
{{ range .Files.Lines "foo/bar.txt" }} {{ . }} {{ end }}
NOTES.txt 说明文件
会在 install 时候展示到标准输出上面,支持 go 模版
Thank you for installing {{ .Chart.Name }}. Your release is named {{ .Release.Name }}. To learn more about the release, try: $ helm status {{ .Release.Name }} $ helm get all {{ .Release.Name }} ### 输出内容 NOTES: Thank you for installing mychart. Your release is named rude-cardinal. To learn more about the release, try: $ helm status rude-cardinal $ helm get all rude-cardinal
子chart和全局值
这里注意一点就可以:父 chart 可以覆盖 子 chart 的值。
favorite: drink: coffee food: pizza pizzaToppings: - mushrooms - cheese - peppers - onions mysubchart: # 子 chart 的名称 dessert: ice cream # 被覆盖的值
子 chart 放在目录 charts 下,按照标准的方式存放。
template 模板是父子共享的
打包
如何将自己的镜像打包成一个 chart ?
helm package mychart 打包成 tar.gz 包。
检查格式或信息问题
helm lint mychart
其它
文件导入的大小限制为 1M(由于Kubernetes对象的限制)
调试
使用 --disable-openapi-validation 和 --dry-run 查看输出内容。
控制空格( 对 yaml 格式文件很有意义)
{{- }} 可以去除前面的空格
{{ -}} 可以去除后面的空格
Helm 安装时,变量优先级(优先级为values.yaml最低,--set参数最高)
默认使用
values.yaml < 父chart的values.yaml< 用户提供values文件 < --set参数 高优先级覆盖第优先级变量值
Helm按照以下顺序安装资源:
- Namespace
- NetworkPolicy
- ResourceQuota
- LimitRange
- PodSecurityPolicy
- PodDisruptionBudget
- ServiceAccount
- Secret
- SecretList
- ConfigMap
- StorageClass
- PersistentVolume
- PersistentVolumeClaim
- CustomResourceDefinition
- ClusterRole
- ClusterRoleList
- ClusterRoleBinding
- ClusterRoleBindingList
- Role
- RoleList
- RoleBinding
- RoleBindingList
- Service
- DaemonSet
- Pod
- ReplicationController
- ReplicaSet
- Deployment
- HorizontalPodAutoscaler
- StatefulSet
- Job
- CronJob
- Ingress
- APIService
