引言
Helm 是Kubernetes的包管理工具,它通过模板函数来动态生成部署配置文件。掌握Helm模板函数对于运维工程师和开发者来说至关重要,它们可以极大地提高工作效率并减少错误。
quote函数:YAML字符串转义
quote
函数用于将字符串参数转义并用双引号括起来,确保在YAML文件中作为有效值。这对于包含特殊字符或需要特殊格式的字符串尤为有用。
示例
考虑一个ConfigMap,我们需要确保键的值是YAML兼容的字符串:
[root@master ~]# cat python-flask/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink }}
food: {{ .Values.favorite.food }}
drink: {{ quote .Values.favorite.drink }}
food: {{ quote .Values.favorite.food }}
结果
[root@master ~]# helm install geared-marsupi ./python-flask --dry-run --debug
# Source: python-flask/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: geared-marsupi-configmap
data:
myvalue: "Hello World"
drink: coffee
food: pizza
drink: "coffee" # 使用了quote函数的结果带双引号
food: "pizza"
管道符:函数链式处理
管道符|
允许我们将一个值作为多个函数的输入,实现链式操作。
示例
将字符串转换为大写并用双引号括起来:
[root@master ~]# cat python-flask/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | quote }}
food: {{ .Values.favorite.food | upper | quote }}
结果
[root@master ~]# helm install geared-marsupi ./python-flask --dry-run --debug
# Source: python-flask/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: geared-marsupi-configmap
data:
myvalue: "Hello World"
drink: "coffee"
food: "PIZZA"
repeat函数:字符串重复
repeat
函数将一个字符串重复指定次数。
示例
创建一个重复字符串的ConfigMap键:
[root@master ~]# cat python-flask/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | repeat 5 | quote }}
food: {{ .Values.favorite.food | upper | quote }}
结果
[root@master ~]# helm install geared-marsupi ./python-flask --dry-run --debug
# Source: python-flask/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: geared-marsupi-configmap
data:
myvalue: "Hello World"
drink: "coffeecoffeecoffeecoffeecoffee"
food: "PIZZA"
default函数:设置默认值
default
函数在值缺失或为空时提供一个备用值。
示例
为未指定的drink
提供一个默认值:
[root@master python-flask]# vim values.yaml
favorite:
#drink: coffee # 注释一个参数
food: pizza
[root@master ~]# cat python-flask/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink | default "tea" | quote }}
food: {{ .Values.favorite.food | upper | quote }}
结果
# Source: python-flask/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: geared-marsupi-configmap
data:
myvalue: "Hello World"
drink: "tea"
food: "PIZZA"
Lookup函数:集群资源查找
lookup
函数在运行的Kubernetes集群中查找资源,如Pods、Namespaces等。
参数组合:
命令 | Lookup 函数 |
---|---|
kubectl get pod mypod -n mynamespace | lookup “v1” “Pod” “mynamespace” “mypod” |
kubectl get pods -n mynamespace | lookup “v1” “Pod” “mynamespace” “” |
kubectl get pods --all-namespaces | lookup “v1” “Pod” “” “” |
kubectl get namespace mynamespace | lookup “v1” “Namespace” “” “mynamespace” |
kubectl get namespaces | lookup “v1” “Namespace” “” “” |
示例与应用
检查default
命名空间是否存在,然后根据结果设置ConfigMap的值:
[root@master ~]# cat python-flask/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
{{ $defaultNamespaceExists := false }}
{{- range $namespace := (lookup "v1" "Namespace" "" "").items }}
{{- if eq $namespace.metadata.name "default" }}
{{- $defaultNamespaceExists = true }}
{{- end }}
{{- end }}
{{- if $defaultNamespaceExists }}
drink: coffee
{{- else }}
drink: tea
{{- end }}
结果
[root@master helm install geared-marsupi ./python-flask
[root@master ~]# kubectl get cm geared-marsupi-configmap -o yaml
apiVersion: v1
data:
drink: coffee
myvalue: Hello World
kind: ConfigMap
注意事项
lookup
函数在--dry-run
模式下不会执行,因此无法查看其效果。但可以通过安装chart后使用kubectl
查看实际渲染效果。
其他函数
Helm提供了丰富的模板函数,用于字符串处理、类型转换、列表操作等。更多函数的详细用法可以参考Helm Template函数速查表。
结语
通过上述示例,我们可以看到Helm模板函数在Kubernetes配置管理中的强大能力。掌握这些函数不仅能够提升我们的工作效率,还能帮助我们编写出更加灵活和动态的配置文件,以适应多变的部署需求。