Helm
🎐

Helm

Helm | 文档首页

介绍

属于 Kubernetes 的包管理器

元素(名词)

notion image

命令

常见命令

notion image

详细命令介绍

模版知识

notion image

创建目录

$ 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 集群,所以返回的是空列表
  • (eqneltgtandor) 运算符

管道

{{ .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