Helm 模板渲染技巧
Helm 是一个强大的 Kubernetes 包管理工具,模板渲染是其核心功能之一。以下是一些高级技巧,涵盖数组、字典、循环和工具库(如 base64
)的使用方法。
数组操作
在 Helm 模板中,数组(列表)是常见的数据结构。以下是一些数组操作技巧:
定义数组
在 values.yaml
中定义数组:
items:
- item1
- item2
- item3
遍历数组
使用 range
遍历数组并生成内容:
{{- range .Values.items }}
- name: {{ . }}
{{- end }}
获取数组长度
通过 len
函数获取数组长度:
{{ len .Values.items }}
合并数组
使用 concat
函数合并多个数组:
{{ $combined := concat .Values.array1 .Values.array2 }}
字典操作
字典(键值对)是 Helm 模板中另一种常见的数据结构。
定义字典
在 values.yaml
中定义字典:
config:
key1: value1
key2: value2
访问字典值
通过键名直接访问字典值:
{{ .Values.config.key1 }}
遍历字典
使用 range
遍历字典:
{{- range $key, $value := .Values.config }}
- {{ $key }}: {{ $value }}
{{- end }}
检查键是否存在
通过 hasKey
函数检查键是否存在:
{{ if hasKey .Values.config "key1" }}
key1 exists
{{ end }}
循环与条件控制
Helm 支持复杂的循环和条件控制逻辑。
range
循环
遍历数组或字典并生成内容:
{{- range $index, $item := .Values.items }}
- index: {{ $index }}, item: {{ $item }}
{{- end }}
if-else
条件
根据条件渲染内容:
{{- if eq .Values.env "prod" }}
production environment
{{- else }}
non-production environment
{{- end }}
with
块
限定作用域以避免重复书写路径:
{{- with .Values.config }}
key1: {{ .key1 }}
key2: {{ .key2 }}
{{- end }}
工具库函数
Helm 提供了丰富的工具库函数,以下是一些常用函数:
base64
编码与解码
使用 b64enc
和 b64dec
进行 Base64 编码与解码:
{{ .Values.password | b64enc }}
{{ .Values.encodedString | b64dec }}
字符串操作
使用 trim
、replace
等函数处理字符串:
{{ .Values.name | trim }}
{{ .Values.path | replace "/" "-" }}
数学运算
使用 add
、sub
等函数进行数学运算:
{{ add .Values.num1 .Values.num2 }}
时间格式化
使用 now
函数获取当前时间:
{{ now | date "2006-01-02" }}
高级技巧
模板嵌套
通过 include
函数复用模板:
{{- define "mytemplate" }}
template content
{{- end }}
{{ include "mytemplate" . }}
默认值设置
使用 default
函数设置默认值:
{{ .Values.name | default "anonymous" }}
变量赋值
通过 $
定义变量:
{{- $name := .Values.name -}}
name: {{ $name }}
缩进控制
使用 nindent
和 indent
控制缩进:
{{ .Values.content | nindent 4 }}
示例:综合使用
以下是一个综合示例,展示数组、字典、循环和工具库的使用:
{{- $config := .Values.config -}}
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-config
data:
{{- range $key, $value := $config }}
{{ $key }}: {{ $value | b64enc | quote }}
{{- end }}
items:
{{- range $index, $item := .Values.items }}
- {{ $item | upper }}
{{- end }}
通过以上技巧,可以更高效地编写 Helm 模板,实现复杂的渲染逻辑。