Subcharts und globale Werte
Bis zu diesem Punkt haben wir nur mit einem einzelnen Chart gearbeitet. Aber Charts können Abhängigkeiten haben, sogenannte Subcharts, die ebenfalls eigene Werte und Templates besitzen. In diesem Abschnitt werden wir ein Subchart erstellen und die verschiedenen Möglichkeiten kennenlernen, wie wir innerhalb von Templates auf Werte zugreifen können.
Bevor wir uns dem Code widmen, gibt es einige wichtige Details über Subcharts zu beachten:
- Ein Subchart gilt als "eigenständig", was bedeutet, dass ein Subchart niemals explizit von seinem übergeordneten Chart abhängig sein kann.
- Aus diesem Grund kann ein Subchart nicht auf die Werte seines übergeordneten Charts zugreifen.
- Ein übergeordnetes Chart kann Werte für Subcharts überschreiben.
- Helm kennt das Konzept von globalen Werten, auf die alle Charts zugreifen können.
Diese Einschränkungen gelten nicht unbedingt für Library Charts, die darauf ausgelegt sind, standardisierte Hilfsfunktionen bereitzustellen.
Beim Durcharbeiten der Beispiele in diesem Abschnitt werden viele dieser Konzepte deutlicher.
Erstellen eines Subcharts
Für diese Übungen beginnen wir mit dem mychart/-Chart, das wir am Anfang
dieses Leitfadens erstellt haben, und fügen ein neues Chart darin hinzu.
$ cd mychart/charts
$ helm create mysubchart
Creating mysubchart
$ rm -rf mysubchart/templates/*
Beachten Sie, dass wir wie zuvor alle Basis-Templates gelöscht haben, damit wir von Grund auf neu beginnen können. In diesem Leitfaden konzentrieren wir uns auf die Funktionsweise von Templates, nicht auf die Verwaltung von Abhängigkeiten. Der Charts-Leitfaden enthält weitere Informationen darüber, wie Subcharts funktionieren.
Hinzufügen von Werten und einem Template zum Subchart
Als Nächstes erstellen wir ein einfaches Template und eine Values-Datei für
unser mysubchart-Chart. Es sollte bereits eine values.yaml in
mychart/charts/mysubchart vorhanden sein. Wir richten sie wie folgt ein:
dessert: cake
Als Nächstes erstellen wir ein neues ConfigMap-Template in
mychart/charts/mysubchart/templates/configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
data:
dessert: {{ .Values.dessert }}
Da jedes Subchart ein eigenständiges Chart ist, können wir mysubchart
einzeln testen:
$ helm install --generate-name --dry-run --debug mychart/charts/mysubchart
SERVER: "localhost:44134"
CHART PATH: /Users/mattbutcher/Code/Go/src/helm.sh/helm/_scratch/mychart/charts/mysubchart
NAME: newbie-elk
TARGET NAMESPACE: default
CHART: mysubchart 0.1.0
MANIFEST:
---
# Source: mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: newbie-elk-cfgmap2
data:
dessert: cake
Überschreiben von Werten aus einem übergeordneten Chart
Unser ursprüngliches Chart mychart ist nun das übergeordnete Chart von
mysubchart. Diese Beziehung ergibt sich ausschließlich daraus, dass sich
mysubchart im Verzeichnis mychart/charts befindet.
Da mychart ein übergeordnetes Chart ist, können wir Konfigurationen in
mychart festlegen und diese an mysubchart weitergeben. Zum Beispiel können
wir mychart/values.yaml wie folgt ändern:
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
mysubchart:
dessert: ice cream
Beachten Sie die letzten beiden Zeilen. Alle Anweisungen innerhalb des
mysubchart-Abschnitts werden an das mysubchart-Chart gesendet. Wenn wir also
helm install --generate-name --dry-run --debug mychart ausführen, werden wir
unter anderem die mysubchart-ConfigMap sehen:
# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: unhinged-bee-cfgmap2
data:
dessert: ice cream
Der Wert auf der obersten Ebene hat nun den Wert des Subcharts überschrieben.
Hier gibt es ein wichtiges Detail zu beachten. Wir haben das Template von
mychart/charts/mysubchart/templates/configmap.yaml nicht geändert, um auf
.Values.mysubchart.dessert zu verweisen. Aus Sicht dieses Templates befindet
sich der Wert weiterhin unter .Values.dessert. Da die Template-Engine Werte
weiterreicht, legt sie den Gültigkeitsbereich fest. Für die mysubchart-Templates
sind also nur Werte verfügbar, die speziell für mysubchart bestimmt sind.
Manchmal möchten Sie jedoch, dass bestimmte Werte für alle Templates verfügbar sind. Dies wird durch globale Chart-Werte erreicht.
Globale Chart-Werte
Globale Werte sind Werte, auf die von jedem Chart oder Subchart unter genau demselben Namen zugegriffen werden kann. Globale Werte erfordern eine explizite Deklaration. Sie können einen vorhandenen nicht-globalen Wert nicht verwenden, als wäre er global.
Der Values-Datentyp hat einen reservierten Abschnitt namens Values.global, in
dem globale Werte gesetzt werden können. Fügen wir einen in unserer
mychart/values.yaml-Datei hinzu.
favorite:
drink: coffee
food: pizza
pizzaToppings:
- mushrooms
- cheese
- peppers
- onions
mysubchart:
dessert: ice cream
global:
salad: caesar
Aufgrund der Funktionsweise von globalen Werten sollten sowohl
mychart/templates/configmap.yaml als auch
mysubchart/templates/configmap.yaml auf diesen Wert als
{{ .Values.global.salad }} zugreifen können.
mychart/templates/configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
salad: {{ .Values.global.salad }}
mysubchart/templates/configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-cfgmap2
data:
dessert: {{ .Values.dessert }}
salad: {{ .Values.global.salad }}
Wenn wir nun eine Testinstallation durchführen, sehen wir denselben Wert in beiden Ausgaben:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: silly-snake-configmap
data:
salad: caesar
---
# Source: mychart/charts/mysubchart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: silly-snake-cfgmap2
data:
dessert: ice cream
salad: caesar
Globale Werte sind nützlich, um solche Informationen weiterzugeben, erfordern jedoch eine gewisse Planung, um sicherzustellen, dass die richtigen Templates für die Verwendung globaler Werte konfiguriert sind.
Templates mit Subcharts teilen
Übergeordnete Charts und Subcharts können Templates gemeinsam nutzen. Jeder definierte Block in einem Chart ist auch für andere Charts verfügbar.
Zum Beispiel können wir ein einfaches Template wie dieses definieren:
{{- define "labels" }}from: mychart{{ end }}
Erinnern Sie sich daran, dass Labels in Templates global geteilt werden.
Daher kann das labels-Template von jedem anderen Chart eingebunden werden.
Obwohl Chart-Entwickler zwischen include und template wählen können, hat
include den Vorteil, dass es Templates dynamisch referenzieren kann:
{{ include $mytemplate }}
Das obige Beispiel dereferenziert $mytemplate. Die template-Funktion
hingegen akzeptiert nur ein String-Literal.
Vermeiden von Blocks
Die Go-Template-Sprache bietet ein block-Schlüsselwort, mit dem Entwickler
eine Standardimplementierung bereitstellen können, die später überschrieben
wird. In Helm Charts sind Blocks nicht das beste Werkzeug zum Überschreiben,
da bei mehreren Implementierungen desselben Blocks nicht vorhersehbar ist,
welche ausgewählt wird.
Die Empfehlung ist, stattdessen include zu verwenden.