名称: helm-templates 用户可调用: false 描述: 当使用Helm模板和模板函数动态生成Kubernetes清单时使用。 允许工具: []
Helm模板
使用Helm模板和模板函数进行工作。
基础模板化
值访问
apiVersion: v1
kind: Pod
metadata:
name: {{ .Values.name }}
namespace: {{ .Release.Namespace }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
内置对象
.Values: 来自values.yaml和覆盖的值.Release: 发布信息(名称、命名空间、是否升级、是否安装).Chart: Chart.yaml中的图表元数据.Files: 访问图表中的非模板文件.Capabilities: Kubernetes集群能力.Template: 当前模板信息
模板函数
字符串函数
# upper, lower, title
name: {{ .Values.name | upper }}
user-invocable: false
# quote
value: {{ .Values.password | quote }}
# trimSuffix, trimPrefix
image: {{ .Values.image | trimSuffix ":latest" }}
# replace
url: {{ .Values.url | replace "http" "https" }}
默认值
# default函数
port: {{ .Values.port | default 8080 }}
tag: {{ .Values.image.tag | default .Chart.AppVersion }}
# required函数
database: {{ required "database.host是必需的" .Values.database.host }}
类型转换
# toString, toJson, toYaml
replicas: {{ .Values.replicas | toString }}
annotations:
{{ toYaml .Values.annotations | indent 2 }}
config: |
{{ toJson .Values.config | indent 2 }}
条件语句
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .Release.Name }}
spec:
# ...
{{- end }}
{{- if and .Values.persistence.enabled .Values.persistence.existingClaim }}
# 使用现有声明
{{- else if .Values.persistence.enabled }}
# 创建新声明
{{- end }}
循环
{{- range .Values.environments }}
- name: {{ .name }}
value: {{ .value | quote }}
{{- end }}
{{- range $key, $value := .Values.config }}
{{ $key }}: {{ $value | quote }}
{{- end }}
命名模板(_helpers.tpl)
定义模板
{{/*
公共标签
*/}}
{{- define "mychart.labels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
选择器标签
*/}}
{{- define "mychart.selectorLabels" -}}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
使用模板
metadata:
labels:
{{- include "mychart.labels" . | nindent 4 }}
spec:
selector:
matchLabels:
{{- include "mychart.selectorLabels" . | nindent 6 }}
流程控制
With语句
{{- with .Values.service }}
apiVersion: v1
kind: Service
metadata:
name: {{ .name }}
spec:
type: {{ .type }}
ports:
- port: {{ .port }}
{{- end }}
Range带索引
{{- range $index, $value := .Values.items }}
item-{{ $index }}: {{ $value }}
{{- end }}
空格控制
# 移除前导空格
{{- .Values.name }}
# 移除尾随空格
{{ .Values.name -}}
# 移除两者
{{- .Values.name -}}
文件访问
读取文件
config: |
{{ .Files.Get "config/app.conf" | indent 2 }}
全局文件匹配
{{- range $path, $content := .Files.Glob "config/*.yaml" }}
{{ $path }}: |
{{ $content | indent 2 }}
{{- end }}
高级函数
三元运算符
environment: {{ ternary "production" "development" .Values.production }}
合并函数
# 返回第一个非空值
port: {{ coalesce .Values.service.port .Values.port 8080 }}
列表函数
# list, append, prepend, concat
args:
{{- range list "arg1" "arg2" "arg3" }}
- {{ . }}
{{- end }}
字典函数
# dict, set, unset, hasKey
{{- $config := dict "key1" "value1" "key2" "value2" }}
{{- if hasKey $config "key1" }}
found: true
{{- end }}
调试
# 打印调试信息
{{ printf "%#v" .Values | indent 2 }}
# 故意失败以查看值
{{ fail (printf "Debug: %#v" .Values) }}
最佳实践
使用助手处理重复逻辑
{{- define "mychart.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name .Chart.Name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
验证输入
{{- if not (has .Values.service.type (list "ClusterIP" "NodePort" "LoadBalancer")) }}
{{- fail "service.type必须是ClusterIP、NodePort或LoadBalancer" }}
{{- end }}
引用字符串值
# 总是引用字符串
value: {{ .Values.string | quote }}