
Helm ist ein leistungsstarkes Tool zum Anwenden, Aktualisieren und Verwalten von Anwendungen in Kubernetes. Die Helm-Community erstellt viele Open-Source-Charts. Sie können Redis, Nginx oder Prometheus Operator mit einem einzigen Befehl bereitstellen. Und sie kommen mit allem, was Sie brauchen, wie Ingress.
Das Mail.ru Cloud Solutions- Team hateinen Artikel ĂŒbersetzt, der eine schnelle Möglichkeit zum Erstellen eines Basisdiagramms beschreibt, nĂŒtzliche Befehle zeigt und bewĂ€hrte Methoden austauscht. Er geht nicht auf Aspekte der Go-Template-Sprache ein, da die meisten davon in der Helm-Dokumentation behandelt werden. Dieses Tutorial bietet abstraktere Aspekte und Ideen zur Verbesserung Ihres Workflows.
Erstellen einer grundlegenden Diagrammstruktur
Beginnen Sie mit einem einfachen Befehl, mit dem eine Beispieldiagrammstruktur erstellt wird:
$ helm create basic
Creating basic
$ tree basic
basic/
âââ charts
âââ Chart.yaml
âââ templates
â âââ deployment.yaml
â âââ _helpers.tpl
â âââ ingress.yaml
â âââ NOTES.txt
â âââ serviceaccount.yaml
â âââ service.yaml
â âââ tests
â âââ test-connection.yaml
âââ values.yaml
Das ist alles, was Sie brauchen, um ein bereitstellungsfÀhiges Diagramm zu erstellen. In diesem Diagramm können Sie eine Anwendung mit allen erforderlichen Komponenten bereitstellen. Wenn Sie sich values.yaml ansehen, können Sie sehen, dass diese Anwendung Nginx bereitstellt.
Das Erweitern eines Diagramms ist so einfach wie das Erstellen von:
$ helm install basic
Das Template-Team ist dein bester Freund
Unmittelbar vor der Installation und nach Ănderungen am Diagramm sollten Sie ĂŒberprĂŒfen, ob in den Vorlagen alles ordnungsgemÀà behandelt wird.
Verwenden Sie den folgenden Befehl, um zu ĂŒberprĂŒfen, was genau im Cluster bereitgestellt wird:
$ helm template basic
Der Befehl gibt jede von allen Vorlagen generierte YAML aus. Wenn Sie nur das Ergebnis einer Vorlage anzeigen möchten, verwenden Sie:
$ helm template basic -x templates/service.yaml
Das Ergebnis wird ungefĂ€hr so ââaussehen:
---
# Source: basic/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: release-name-basic
labels:
app.kubernetes.io/name: basic
helm.sh/chart: basic-0.1.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/version: "1.0"
app.kubernetes.io/managed-by: Tiller
spec:
type: ClusterIP
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app.kubernetes.io/name: basic
app.kubernetes.io/instance: release-name
Verwenden Sie zum Testen einer Vorlage mit benutzerdefinierten Werten Folgendes:
$ helm template basic -x templates/service.yaml -f \ mypath/tocustomvalues.yaml
Die generierte Vorlage kann im Cluster mit dem folgenden Befehl getestet werden:
$ helm install basic --dry-run --debug
FUSSEL!
Vor dem Senden an das Repository können Sie einen weiteren Schritt hinzufĂŒgen, um das Code-Flusen (statistische Analyse) eindeutig zu ĂŒberprĂŒfen:
$ helm lint basic/
==> Linting basic/
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, no failures
Helm arbeitet mit Funktionen
Wenn Sie in das Verzeichnis der Diagrammvorlagen schauen, sehen Sie _helpers.tpl. Hier können Sie Ihre Funktionen hinzufĂŒgen, sie sind im gesamten Diagramm verfĂŒgbar. Eine Beispielfunktion könnte folgendermaĂen aussehen:
{{/*
Expand the name of the chart.
*/}}
{{- define "basic.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{{- end -}}
Die Verwendung einer Funktion in einer Vorlage wird durch eine Funktion angezeigt
include:
app.kubernetes.io/name: {{ include "basic.name" . }}
Meta-Labels
Ein wichtiger Bestandteil von Kubernetes ist die korrekte Verwendung von Etiketten. Dies ist sehr wichtig, wenn Sie Helm zum Bereitstellen mehrerer Manifeste verwenden. Um einfach Tags hinzuzufĂŒgen, um von Helm verwaltete Ressourcen zu finden, können Sie Ihre eigenen Funktionen verwenden:
{{/*
Common labels
*/}}
{{- define "basic.labels" -}}
app.kubernetes.io/name: {{ include "basic.name" . }}
helm.sh/chart: {{ include "basic.chart" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end -}}
Und jetzt ist es einfach, ein paar Tags zum Diagramm hinzuzufĂŒgen:
apiVersion: v1
kind: Service
metadata:
name: {{ include "basic.fullname" . }}
labels:
{{ include "basic.labels" . | indent 4 }}
...
Wenn Sie Dienste suchen möchten, die mit diesem Diagramm erstellt wurden, verwenden Sie den folgenden Befehl:
$ kubectl get svc -l helm.sh/chart=basic-0.1.0
Kommentare werden dich retten
Es gibt zwei Arten von Kommentaren:
- # Ist ein einfacher Kommentar, der nach der Verarbeitung in der resultierenden YML verbleibt.
- {{- / * ... * / -}} ist ein Kommentar, der von der Template-Engine verworfen wird.
# app files volume
{{- /*
App files are configmaps created by cloud-app-play-files chart.
App files contains files specific for app and environment.
App name should be same as in deployment of cloud-app-play-files chart.
*/ -}}
{{- if .Values.include.appDir }}
- name: {{ $appName }}-files
configMap:
name: {{ $appName }}-files
Die Vorlagenausgabe sieht folgendermaĂen aus:
# app files volume
- name: app-notification-files
configMap:
name: app-notification-files
Wie Sie sehen können, enthĂ€lt das generierte Manifest nur einen einfachen Typkommentar. Welchen Typ Sie verwenden möchten, liegt bei Ihnen. Vorlagenkommentare sind jedoch nĂŒtzlich, wenn Sie komplexere Pipelines oder AbhĂ€ngigkeiten in YAML definieren.
Es ist auch wichtig zu bedenken, dass Kommentare, die mit # beginnen, ebenfalls analysiert werden. Wenn Sie eine Go-Vorlage in einen Kommentar einfĂŒgen, wird diese ausgewertet. Kommentare können also auch Vorlagen sein.
Bewahren Sie die Dokumentation auf
Die Diagrammdokumentation ist unverzichtbar, insbesondere wenn Sie ein Diagramm veröffentlichen möchten. Der einfachste Weg, Dokumente zu erstellen und zu verwalten, ist die Verwendung des Golang-Pakets mit dem Namen helm-docs . Damit können Sie eine README.md mit Wertetabellen, Versionen und Beschreibungen aus values.yaml und chart.yaml generieren oder andere benutzerdefinierte Dateien verwenden.
Beispiel aus https://github.com/norwoodj/helm-docs
Wie Sie sehen können, fĂŒhrt das HinzufĂŒgen des Namens mit - in den Kommentaren zu einer Zeile in der Tabelle. DarĂŒber hinaus enthĂ€lt die Tabelle zusĂ€tzliche Informationen wie Diagrammbeschreibung, Name und Version. Helm-Docs können zusammen mit Flusen in ein Pre-Commit integriert werden. Das geht ganz einfach:
$ helm-docs
INFO[2020-07-23T15:30:38+02:00] Found Chart directories [.]
INFO[2020-07-23T15:30:38+02:00] Generating README Documentation for chart .
Die Magie der Subcharts
Wenn Ihr Diagramm zum Monster der Architektur wird, ist es am besten, einige der Diagrammkomponenten in kleinere zu teilen. Diese werden als Unterdiagramme oder untergeordnete Diagramme bezeichnet.
Unterdiagramme werden gleichzeitig mit dem Hauptdiagramm bereitgestellt. Werte fĂŒr Unterdiagramme können in derselben Datei values.yaml wie fĂŒr das Hauptdiagramm angegeben werden. Sie können sie auch ĂŒber GitHub verbinden, aber fĂŒr den Artikel werde ich lokal ein Unterdiagramm erstellen.
Um mit einem neuen Unterdiagramm zu beginnen, von dem das Hauptdiagramm abhÀngt, erstellen Sie ein Diagrammverzeichnis im Hauptdiagrammordner. Erstellen Sie dann ein grundlegendes Diagramm:
$ mkdir charts
$ cd charts
$ helm create subbasic
Ăndern Sie die Definition des Hauptdiagramms, um ein Unterdiagramm zu verbinden:
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: basic
version: 0.1.0
dependencies:
- name: subbasic
Jetzt wird bei jedem Start des Befehls
helm installnicht nur das Hauptdiagramm, sondern auch das Unterdiagramm erweitert. FĂŒgen Sie der Datei values.yaml des Hauptdiagramms die folgenden Befehle hinzu, um den Referenznamen des Unterdiagramms bei der Bereitstellung fĂŒr den Dienst zu ĂŒberschreiben:
subbasic:
service:
type: NodePort
nameOverride: "jojo"
FĂŒhren Sie nun den Befehl aus
templateund sehen Sie sich die geÀnderte Ausgabe des Subchart-Dienstes an. Der Diensttyp Àndert sich zusammen mit dem Namen:
---
# Source: basic/charts/subbasic/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
name: release-name-jojo
labels:
app.kubernetes.io/name: jojo
helm.sh/chart: subbasic-0.1.0
app.kubernetes.io/instance: release-name
app.kubernetes.io/version: "1.0"
app.kubernetes.io/managed-by: Tiller
spec:
type: NodePort
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app.kubernetes.io/name: jojo
app.kubernetes.io/instance: release-name
Wichtiger Hinweis: Unterdiagramme können keine Werte aus ĂŒbergeordneten Diagrammen ĂŒbernehmen.
Momente, die oft vergessen werden
Noch ein paar Punkte:
- Ressourcennamen - maximal 63 Zeichen.
- Ressourcennamen können nur Zahlen, Kleinbuchstaben, "-" oder "." Sein.
- DiagrammgröĂe - nicht mehr als 1 MB . Dies ist besonders wichtig, wenn Sie DateianhĂ€nge verwenden.
- Das Diagramm verfĂŒgt ĂŒber eine Analysefunktion
.tpl. - Sie können die Ressourcen angeben, die verbleiben, nachdem der Befehl die Bereitstellung des Diagramms entfernt hat
helm delete.
Nun das ist alles!
Jetzt können Sie Ihr erstes Diagramm schreiben. Das AnhĂ€ngen von Dateien ist erwĂ€hnenswert - Diagramme eignen sich nicht zum HinzufĂŒgen von Dateien und zum Speichern ihrer Struktur in Verzeichnissen. Auf der Empfehlungsseite finden Sie jedoch keine Informationen darĂŒber, was grafisch dargestellt werden soll und was nicht.
Helm ist ein ziemlich junges Werkzeug, aber mit viel Potenzial. Vergessen Sie nicht, dass Flusen, Dokumentationserstellung und sogar Trockenlaufvorlagen in einem Cluster Teil des CI sein können. Der Helm Workflow ist bereits fĂŒr GitHub verfĂŒgbar .
Viel GlĂŒck!
Was noch zu lesen: