Helm-Templates im Detail
Einführung
Helm-Templates sind Kubernetes-Manifeste, die mit der Go-Templatesprache text/template angereichert wurden. Sie befinden sich im Verzeichnis templates/ Ihres Charts und werden von Helm mithilfe der Werte aus values.yaml und benutzerseitiger Überschreibungen gerendert. Sie zu verstehen ist der Schlüssel zu wartbaren und wiederverwendbaren Charts.
Template-Grundlagen
Ein minimales Deployment-Template:
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-app
labels:
app: {{ .Chart.Name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ .Chart.Name }}
template:
metadata:
labels:
app: {{ .Chart.Name }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
Eingebaute Objekte
| Objekt | Beschreibung |
|---|---|
.Release | Aktuelle Release-Informationen: .Release.Name, .Release.Namespace |
.Chart | Inhalt von Chart.yaml: .Chart.Name, .Chart.Version |
.Values | Zusammengeführte Werte aus values.yaml und Benutzerüberschreibungen |
.Files | Zugriff auf nicht-Template-Dateien im Chart |
Template-Funktionen
Helm enthält die Go-Sprig-Bibliothek mit über 60 Hilfsfunktionen:
# Standardwert wenn leer
image: {{ .Values.image | default "nginx:latest" }}
# String sicher in Anführungszeichen setzen
annotation: {{ .Values.description | quote }}
# In Großbuchstaben umwandeln
name: {{ .Values.name | upper }}
# Strings formatieren
fullname: {{ printf "%s-%s" .Release.Name .Chart.Name }}
# Mehrzeiligen Block einrücken (entscheidend für verschachteltes YAML)
resources:
{{- toYaml .Values.resources | nindent 2 }}
Bedingungen
spec:
{{- if .Values.resources }}
resources:
{{- toYaml .Values.resources | nindent 4 }}
{{- end }}
{{- if .Values.nodeSelector }}
nodeSelector:
{{- toYaml .Values.nodeSelector | nindent 4 }}
{{- else }}
nodeSelector: {}
{{- end }}
Das - in {{- entfernt führende Leerzeichen; -}} entfernt nachfolgende Leerzeichen. Das ist entscheidend für saubere YAML-Ausgabe.
Schleifen mit range
Über eine Liste iterieren:
env:
{{- range .Values.envVars }}
- name: {{ .name }}
value: {{ .value | quote }}
{{- end }}
Über eine Map iterieren:
annotations:
{{- range $key, $val := .Values.annotations }}
{{ $key }}: {{ $val | quote }}
{{- end }}
Benannte Templates
Benannte Templates vermeiden Wiederholungen über Dateien hinweg. Üblicherweise leben sie in _helpers.tpl (das _-Präfix verhindert, dass Helm die Datei als Manifest rendert):
{{/* _helpers.tpl */}}
{{- define "myapp.labels" -}}
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
app.kubernetes.io/name: {{ .Chart.Name }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
In anderen Templates mit include verwenden:
metadata:
labels:
{{- include "myapp.labels" . | nindent 4 }}
Bevorzugen Sie immer
includegegenüber der eingebautentemplate-Aktion, daincludeeinen String zurückgibt, der an Funktionen wienindentweitergeleitet werden kann.
Templates debuggen
Templates lokal rendern ohne Deployment im Cluster:
# Alle Templates rendern
helm template my-release ./my-chart
# Mit benutzerdefinierten Werten rendern
helm template my-release ./my-chart -f custom-values.yaml
# Validieren und linten
helm lint ./my-chart
Um ein gerendertes Objekt während der Entwicklung zu inspizieren, können Sie es temporär als YAML ausgeben:
{{- toYaml .Values | nindent 0 }}
Wenn Sie mich unterstützen möchten, kaufen Sie mir einen Kaffee.