helm3自定义chart编写
当我们安装好helm之后我们可以开始自定义chart,那么我们需要先创建出一个模板如下:
helm create myapp
之后我们可以一下目录结构,目录的作用我简要介绍一下:
templates/
目录包括了模板文件。当Helm评估chart时,会通过模板渲染引擎将所有文件发送到templates/
目录中。 然后收集模板的结果并发送给Kubernetes。
- _helpers.tpl里面的内容是定义模板用的,所有模板都可以再这里定义,然后再任何yaml文件当中都可以调用这个文件下的模板
NOTES.txt
: chart的"帮助文本"。这会在你的用户执行helm install
时展示给他们。deployment.yaml
: 创建Kubernetes 工作负载的基本清单service.yaml
: 为你的工作负载创建一个 service终端基本清单。_helpers.tpl
: 放置可以通过chart复用的模板辅助对象
values.yaml
文件也导入到了模板。这个文件包含了chart的 默认值 。这些值会在用户执行helm install
或 helm upgrade
时被覆盖。
Chart.yaml
文件包含了该chart的描述。你可以从模板中访问它。charts/
目录 可以 包含其他的chart(称之为 子chart)。 指南稍后我们会看到当涉及模板渲染时这些是如何工作的。
$tree myapp/ myapp/ ├── charts ├── Chart.yaml ├── templates │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── hpa.yaml │ ├── ingress.yaml │ ├── NOTES.txt │ ├── serviceaccount.yaml │ ├── service.yaml │ └── tests │ └── test-connection.yaml └── values.yaml 3 directories, 10 files
现在展示一下我所创建的chart为例
$tree myapp/ myapp/ ├── charts ├── Chart.yaml ├── templates │ ├── configmap.yaml │ └── _helpers.tpl ├── test.yaml ├── values.yaml └── values.yaml.bak 2 directories, 7 files
其中我修改过的内容如下:
$cat values.yaml favorite: drink: coffee food: pizza pizzaToppings: - mushrooms - cheese - peppers - onions
$cat templates/configmap.yaml {{ $release := "ok" }} apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-configmap labels: {{- include "mychart.labels" . | indent 8 }} data: myvalue: "Hello World" {{- with .Values.favorite }} drink: {{ .drink }} food: {{ .food }} release: {{ $release }} {{- end }} {{- if eq .Values.favorite.drink "coffee" }} mug: true {{- end }} toppings: |- {{- range $.Values.pizzaToppings }} -{{ . | title | quote }} {{- end }} size: |- {{- range $index,$name := tuple "small" "medium" "large" }} {{ $index }}: {{ $name }} {{- end }}
$cat templates/_helpers.tpl {{/* Generate basic labels */}} {{- define "mychart.labels" }} generator: helm date: {{ now | htmlDate }} chart: {{ .Chart.Name }} version: {{ .Chart.Version }} {{- end }}
上述所需要的技术点:
设置自定义变量
{{ $release := "ok" }}
引用内部变量,其中.就是当前作用域的变量,Release.Name为helm install的名字
name: {{ .Release.Name }}-configmap
引用模板,其中{{-代表去除前面的空格-}}代表去除后面的空格,include代表引用模板,mychart.labels为引用模板的内容(内容再_helpers.tpl中),后面的.代表全局作用域,否则_helpers中的有些内容将获取不到,管道符|代表把前面的内容赋予给管道符,然后缩进8个空格
{{- include "mychart.labels" . | indent 8 }}
with代表循环,循环的只为values.yam文件中的内容,注意,必须为大写Values,{{.drink}}为所循环出来的下一级,也就是values.yaml下的favorite下的drink字段,其实也可以循环tuple等类型
{{- with .Values.favorite }}
drink: {{ .drink }}
food: {{ .food }}
release: {{ $release }}
{{- end }}
if判断语句,eq代表等于(还有ge,lt,ne等),那么下面的意思是如果values.yaml文件中favorite下的drink内容为coffee,那么就添加一个mug:true字段
{{- if eq .Values.favorite.drink "coffee" }} mug: true {{- end }}
range也代表循环,$代表顶级作用域,意思是说不管再那个作用域,只要出现$都可以调用顶级的变量,那么循环的内容也再_helpers.tpl文件中,.代表循环出来的单个内容然后给title处理变成抬头,再给quote函数处理,quote代表字符串化
toppings: |- {{- range $.Values.pizzaToppings }} -{{ . | title | quote }} {{- end }}
对于range也可以循环tuple等类型,如下,其中$index代表索引,$name代表循环tuple的具体内容
size: |- {{- range $index,$name := tuple "small" "medium" "large" }} {{ $index }}: {{ $name }} {{- end }}
对于_helpers.tpl内容解释如下,{{/* */}}代表注释,{{- define代表定义一个模板,后面跟着模板名字,其中.Chart代表调用Chart.yaml文件的内容
{{/* Generate basic labels */}} {{- define "mychart.labels" }} generator: helm date: {{ now | htmlDate }} chart: {{ .Chart.Name }} version: {{ .Chart.Version }} {{- end }}
以上内容执行后如下:可以跟着文件对照一下结果
$helm install mytest ../myapp/ --dry-run --debug install.go:173: [debug] Original chart version: "" install.go:190: [debug] CHART PATH: /home/admin/myapp NAME: mytest LAST DEPLOYED: Thu Jun 10 19:08:17 2021 NAMESPACE: default STATUS: pending-install REVISION: 1 TEST SUITE: None USER-SUPPLIED VALUES: {} COMPUTED VALUES: favorite: drink: coffee food: pizza pizzaToppings: - mushrooms - cheese - peppers - onions HOOKS: MANIFEST: --- # Source: myapp/templates/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: mytest-configmap labels: generator: helm date: 2021-06-10 chart: myapp version: 0.1.0 data: myvalue: "Hello World" drink: coffee food: pizza release: ok mug: true toppings: |- -"Mushrooms" -"Cheese" -"Peppers" -"Onions" size: |- 0: small 1: medium 2: large
未完待续...................