Helm模板与函数技能Skill helm-templates

Helm模板技能专注于使用Helm图表和模板函数动态生成Kubernetes配置文件。它涵盖值访问、内置对象、字符串函数、默认值、条件循环、命名模板等,适用于DevOps和云原生开发,提升部署效率和可维护性。关键词:Helm, Kubernetes, 模板函数, DevOps, 云原生, YAML生成, 容器编排。

Docker/K8s 0 次安装 0 次浏览 更新于 3/25/2026

名称: 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 }}