一 、子chart和全局值
到目前为止,我们只使用了一个chart。但chart可以使用依赖,称为 子chart,且有自己的值和模板。 该章节我们会创建一个子chart并能看到访问模板中的值的不同方式。
子chart的重要细节:
- 子chart被认为是“独立的”,意味着子chart从来不会显示依赖它的父chart。
- 因此,子chart无法访问父chart的值。
- 父chart可以覆盖子chart的值
- Helm有一个 全局值 的概念,所有的chart都可以访问。
二、子chart添加
2.1 创建子chart
为mychart/
中添加一个子chart。
cd mychart/charts
helm create mysubchart
rm -rf mysubchart/templates/*
和以前一样,删除所有的基本模板,然后从头开始
2.2 在子chart中添加值和模板
为mysubchart
创建一个简单的模板和values文件。mychart/charts/mysubchart
应该已经有一个values.yaml
。 设置如下:
dessert: cake
下一步,在mychart/charts/mysubchart/templates/configmap.yaml
中创建一个新的配置映射模板:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
data:
dessert: {{ .Values.dessert }}
因为每个子chart都是 独立的chart,可以单独测试mysubchart
:
[root@master ~]# vim mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
data:
dessert: {{ .Values.dessert }}
~
[root@master ~]# helm install --dry-run goodly-guppy ./mychart/charts/mysubchart/
NAME: goodly-guppy
LAST DEPLOYED: Fri Jul 5 21:36:50 2024
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
HOOKS:
MANIFEST:
---
# Source: mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: goodly-guppy-cfgmap2
data:
dessert: cake
2.3 用父chart的值来覆盖
原始chart,mychart
现在是mysubchart
的 父。这种关系是基于mysubchart
在mychart/charts
中这一事实。
因为mychart
是父级,可以在mychart
指定配置并将配置推送到mysubchart
。比如可以修改mychart/values.yaml
如下:
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onionsmysubchart:
dessert: ice cream
注意最后两行,在mysubchart
中的所有指令会被发送到mysubchart
chart中。因此如果运行helm install --dry-run --debug mychart
,会看到一项mysubchart
的配置:
[root@master ~]# helm install --dry-run goodly-guppy ./mychart NAME: goodly-guppy
LAST DEPLOYED: Fri Jul 5 21:40:15 2024
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
HOOKS:
MANIFEST:
---
# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: goodly-guppy-cfgmap2
data:
dessert: ice cream
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: goodly-guppy-configmap
data:
config1.yaml: |-
message = Hello from config1
config2.yaml: |-
message = This is config2
config3.yaml: |-
message = This is config3
子chart的值已经被顶层的值覆盖了。
这里需要注意个重要细节。我们不会改变mychart/charts/mysubchart/templates/configmap.yaml
模板到 .Values.mysubchart.dessert
的指向。从模板的角度来看,值依然是在.Values.dessert
。当模板引擎传递值时,会设置范围。 因此对于mysubchart
模板,.Values
中只提供专门用于mysubchart
的值。
2.4 全局Chart值
全局值是使用完全一样的名字在所有的chart及子chart中都能访问的值。全局变量需要显式声明。不能将现有的非全局值作为全局值使用。
这些值数据类型有个保留部分叫Values.global
,可以用来设置全局值。在mychart/values.yaml
文件中设置一个值如下:
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onionsmysubchart:
dessert: ice creamglobal:
salad: caesar
因为全局的工作方式,mychart/templates/configmap.yaml
和mysubchart/templates/configmap.yaml
应该都能以{{ .Values.global.salad }}
进行访问。
mychart/templates/configmap.yaml
:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
salad: {{ .Values.global.salad }}
mysubchart/templates/configmap.yaml
:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
data:
dessert: {{ .Values.dessert }}
salad: {{ .Values.global.salad }}
预安装,两个输出会看到相同的值
[root@master ~]# helm install --dry-run goodly-guppy ./mychart
NAME: goodly-guppy
LAST DEPLOYED: Fri Jul 5 21:48:06 2024
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
HOOKS:
MANIFEST:
---
# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: goodly-guppy-cfgmap2
data:
dessert: ice cream
salad: caesar
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: goodly-guppy-configmap
data:
salad: caesar
2.5 与子chart共享模板
父chart和子chart可以共享模板。子chart中的模板父chart可以用,父chart定义的模板子chart也可以用
在任意chart中定义的块在其他chart中也是可用的。
定义一个简单的模板:
{{- define "labels" }}from: mychart{{ end }}
[root@master ~]# vim mychart/charts/mysubchart/templates/_helpers.tpl
{{- define "labelssub" }}
from: mysubchart
{{ end }}
[root@master ~]# vim mychart/templates/_helpers.tpl
{{- define "labels" }}
from: mycahart
{{ end }}
[root@master ~]# vim mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
{{- include "labels" . | indent 2 }}
data:
dessert: {{ .Values.dessert }}
salad: {{ .Values.global.salad }}
[root@master ~]# vim mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
label:
{{- include "labelssub" . | indent 2 }}
data:
salad: {{ .Values.global.salad }}
~ [root@master ~]# helm install --dry-run goodly-guppy ./mychart
NAME: goodly-guppy
LAST DEPLOYED: Sat Jul 6 15:09:19 2024
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
HOOKS:
MANIFEST:
---
# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: goodly-guppy-cfgmap2
from: mycahart
data:
dessert: ice cream
salad: caesar
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: goodly-guppy-configmap
label:
from: mysubchart
data:
salad: caesar
当chart开发者在include
和 template
之间选择时,使用include
的一个优势是include
可以动态引用模板:
{{ include $mytemplate }}
三、Helm命令行
命令太多网址在这里乐意自己查阅学习相关命令,https://helm.sh/zh/docs/helm/helm/