Erste Schritte
In diesem Abschnitt der Anleitung erstellen wir ein Chart und fügen dann ein erstes Template hinzu. Das hier erstellte Chart wird im Rest der Anleitung verwendet.
Um loszulegen, werfen wir einen kurzen Blick auf ein Helm Chart.
Charts
Wie in der Charts-Anleitung beschrieben, sind Helm Charts folgendermaßen strukturiert:
mychart/
Chart.yaml
values.yaml
charts/
templates/
...
Das Verzeichnis templates/ ist für Template-Dateien vorgesehen. Wenn Helm ein
Chart auswertet, sendet es alle Dateien im Verzeichnis templates/ durch die
Template-Rendering-Engine. Anschließend sammelt es die Ergebnisse dieser
Templates und sendet sie an Kubernetes.
Die Datei values.yaml ist ebenfalls wichtig für Templates. Diese Datei enthält
die Standardwerte für ein Chart. Diese Werte können von Benutzern während
helm install oder helm upgrade überschrieben werden.
Die Datei Chart.yaml enthält eine Beschreibung des Charts. Sie können aus
einem Template heraus darauf zugreifen.
Das Verzeichnis charts/ kann andere Charts enthalten (die wir Subcharts
nennen). Später in dieser Anleitung werden wir sehen, wie diese beim
Template-Rendering funktionieren.
Ein Starter-Chart
Für diese Anleitung erstellen wir ein einfaches Chart namens mychart und dann
einige Templates darin.
$ helm create mychart
Creating mychart
Ein kurzer Blick auf mychart/templates/
Wenn Sie sich das Verzeichnis mychart/templates/ ansehen, werden Sie einige
Dateien bemerken, die bereits vorhanden sind.
NOTES.txt: Der "Hilfetext" für Ihr Chart. Dieser wird Ihren Benutzern angezeigt, wenn siehelm installausführen.deployment.yaml: Ein einfaches Manifest zum Erstellen eines Kubernetes Deploymentsservice.yaml: Ein einfaches Manifest zum Erstellen eines Service- Endpunkts für Ihr Deployment_helpers.tpl: Ein Ort für Template-Hilfsfunktionen, die Sie im gesamten Chart wiederverwenden können
Und was wir jetzt tun werden, ist... sie alle löschen! Auf diese Weise können
wir unser Tutorial von Grund auf durcharbeiten. Wir werden tatsächlich unsere
eigene NOTES.txt und _helpers.tpl erstellen, während wir fortschreiten.
$ rm -rf mychart/templates/*
Wenn Sie produktionsreife Charts schreiben, kann es sehr nützlich sein, Grundversionen dieser Charts zu haben. In Ihrem täglichen Chart-Authoring werden Sie diese wahrscheinlich nicht entfernen wollen.
Ein erstes Template
Das erste Template, das wir erstellen werden, ist eine ConfigMap. In
Kubernetes ist eine ConfigMap einfach ein Objekt zum Speichern von
Konfigurationsdaten. Andere Dinge, wie Pods, können auf die Daten in einer
ConfigMap zugreifen.
Da ConfigMaps grundlegende Ressourcen sind, bieten sie uns einen guten Ausgangspunkt.
Beginnen wir mit der Erstellung einer Datei namens
mychart/templates/configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
TIPP: Template-Namen folgen keinem strengen Benennungsmuster. Wir empfehlen
jedoch, die Erweiterung .yaml für YAML-Dateien und .tpl für Hilfsfunktionen
zu verwenden.
Die obige YAML-Datei ist eine einfache ConfigMap mit den minimal erforderlichen
Feldern. Aufgrund der Tatsache, dass sich diese Datei im Verzeichnis
mychart/templates/ befindet, wird sie durch die Template-Engine gesendet.
Sie können problemlos eine einfache YAML-Datei wie diese im Verzeichnis
mychart/templates/ ablegen. Wenn Helm dieses Template liest, sendet es das
Template unverändert an Kubernetes.
Mit diesem einfachen Template haben wir jetzt ein installierbares Chart. Wir können es so installieren:
$ helm install full-coral ./mychart
NAME: full-coral
LAST DEPLOYED: Tue Nov 1 17:36:01 2016
NAMESPACE: default
STATUS: DEPLOYED
REVISION: 1
TEST SUITE: None
Mit Helm können wir das Release abrufen und das tatsächlich geladene Template sehen.
$ helm get manifest full-coral
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: mychart-configmap
data:
myvalue: "Hello World"
Der Befehl helm get manifest nimmt einen Release-Namen (full-coral) und gibt
alle Kubernetes-Ressourcen aus, die auf den Server hochgeladen wurden. Jede
Datei beginnt mit ---, um den Anfang eines YAML-Dokuments anzuzeigen, gefolgt
von einer automatisch generierten Kommentarzeile, die uns sagt, welche
Template-Datei dieses YAML-Dokument generiert hat.
Von dort an können wir sehen, dass die YAML-Daten genau das sind, was wir in
unsere configmap.yaml-Datei eingefügt haben.
Jetzt können wir unser Release deinstallieren: helm uninstall full-coral.
Hinzufügen eines einfachen Template-Aufrufs
Das Hardcodieren des name:-Felds in eine Ressource wird normalerweise als
schlechte Praxis angesehen. Namen sollten für ein Release eindeutig sein.
Deshalb möchten wir vielleicht ein Namensfeld generieren, indem wir den
Release-Namen einfügen.
TIPP: Das name:-Feld ist aufgrund von Einschränkungen des DNS-Systems auf
63 Zeichen begrenzt. Aus diesem Grund sind Release-Namen auf 53 Zeichen
begrenzt. Kubernetes 1.3 und früher war auf nur 24 Zeichen beschränkt (somit 14
Zeichen für Namen).
Ändern wir configmap.yaml entsprechend.
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
Die wesentliche Änderung betrifft den Wert des name:-Felds, das jetzt
{{ .Release.Name }}-configmap ist.
Eine Template-Direktive ist in
{{und}}Blöcken eingeschlossen.
Die Template-Direktive {{ .Release.Name }} fügt den Release-Namen in das
Template ein. Die Werte, die in ein Template übergeben werden, können als
Namespace-Objekte betrachtet werden, wobei ein Punkt (.) jedes
Namespace-Element trennt.
Der führende Punkt vor Release zeigt an, dass wir mit dem obersten Namespace
für diesen Geltungsbereich beginnen (wir werden den Geltungsbereich gleich
besprechen). Wir könnten .Release.Name also lesen als "beginne im obersten
Namespace, finde das Release-Objekt, dann suche darin nach einem Objekt
namens Name".
Das Release-Objekt ist eines der eingebauten Objekte von Helm, und wir werden
es später ausführlicher behandeln. Für den Moment reicht es zu sagen, dass dies
den Release-Namen anzeigt, den die Bibliothek unserem Release zuweist.
Wenn wir jetzt unsere Ressource installieren, sehen wir sofort das Ergebnis der Verwendung dieser Template-Direktive:
$ helm install clunky-serval ./mychart
NAME: clunky-serval
LAST DEPLOYED: Tue Nov 1 17:45:37 2016
NAMESPACE: default
STATUS: DEPLOYED
REVISION: 1
TEST SUITE: None
Sie können helm get manifest clunky-serval ausführen, um das gesamte
generierte YAML zu sehen.
Beachten Sie, dass die ConfigMap innerhalb von Kubernetes nun
clunky-serval-configmap heißt statt wie zuvor mychart-configmap.
An diesem Punkt haben wir Templates in ihrer einfachsten Form gesehen:
YAML-Dateien mit Template-Direktiven, die in {{ und }} eingebettet sind. Im
nächsten Teil werden wir uns Templates genauer ansehen. Aber bevor wir
weitergehen, gibt es einen schnellen Trick, der das Erstellen von Templates
beschleunigen kann: Wenn Sie das Template-Rendering testen möchten, ohne
tatsächlich etwas zu installieren, können Sie helm install --debug --dry-run goodly-guppy ./mychart verwenden. Dies rendert die Templates. Aber anstatt das
Chart zu installieren, wird das gerenderte Template an Sie zurückgegeben, damit
Sie die Ausgabe sehen können:
$ helm install --debug --dry-run goodly-guppy ./mychart
install.go:149: [debug] Original chart version: ""
install.go:166: [debug] CHART PATH: /Users/ninja/mychart
NAME: goodly-guppy
LAST DEPLOYED: Thu Dec 26 17:24:13 2019
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
affinity: {}
fullnameOverride: ""
image:
pullPolicy: IfNotPresent
repository: nginx
imagePullSecrets: []
ingress:
annotations: {}
enabled: false
hosts:
- host: chart-example.local
paths: []
tls: []
nameOverride: ""
nodeSelector: {}
podSecurityContext: {}
replicaCount: 1
resources: {}
securityContext: {}
service:
port: 80
type: ClusterIP
serviceAccount:
create: true
name: null
tolerations: []
HOOKS:
MANIFEST:
---
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: goodly-guppy-configmap
data:
myvalue: "Hello World"
Die Verwendung von --dry-run erleichtert das Testen Ihres Codes, garantiert
aber nicht, dass Kubernetes selbst die von Ihnen generierten Templates
akzeptiert. Es ist am besten, nicht davon auszugehen, dass Ihr Chart
installiert wird, nur weil --dry-run funktioniert.
In der Chart-Template-Anleitung nehmen wir das hier definierte grundlegende Chart und erkunden die Helm-Template-Sprache im Detail. Und wir werden mit den eingebauten Objekten beginnen.