Helm Charts bieten eine erweiterte Abstraktionsebene über die standardmäßigen Kubernetes-Manifeste hinaus. Während Kubernetes-Manifeste in ihrer Grundform statisch sind, ermöglichen Helm Charts durch die Verwendung von Templates und Werten eine dynamische Erzeugung von Ressourcenbeschreibungen. Ein Helm Chart ist somit nicht nur eine Sammlung von Ressourcen, sondern auch eine Beschreibung, wie diese Ressourcen in Abhängigkeit von gegebenen Parametern generiert werden sollen. Dies vereinfacht die Wiederverwendung, Verwaltung und Verteilung von komplexen Anwendungen, da Anwender mit Hilfe von Helm Charts spezifische Konfigurationen für ihre Kubernetes-Anwendungen als Code definieren und verwalten können.
Ein Helm Chart besteht aus einer Reihe von Dateien, die in einem spezifischen Verzeichnisbaum angeordnet sind:
/<chart-name>/
|- Chart.yaml
|- values.yaml
|- charts/
|- templates/
| |- deployment.yaml
| |- _helpers.tpl
| |- ingress.yaml
| |- service.yaml
| |- ...
|- .helmignore
Chart.yaml: Die Chart-Metadaten-Datei mit
Informationen wie Version, Name und Beschreibung des Charts.
values.yaml: Eine YAML-Datei, die die
Standardkonfigurationswerte für das Chart enthält. Diese Werte können
während der Installation des Charts überschrieben werden.
charts/: Ein Verzeichnis, das alle Abhängigkeiten
des Charts in Form von anderen Charts enthalten kann
(Untercharts).
templates/: Enthält alle Template-Dateien, die
Kubernetes-Manifeste generieren, wenn das Chart installiert oder
aktualisiert wird. Diese Dateien nutzen die Werte aus der
values.yaml, um die Manifeste zu rendern.
deployment.yaml: Eine Template-Datei, die ein
Kubernetes Deployment definiert._helpers.tpl: Definiert Hilfsvariablen und Templates,
die in anderen Template-Dateien verwendet werden können.ingress.yaml: Definiert, wie externe HTTP(S)-Verkehr zu
den Services des Charts geleitet wird.service.yaml: Definiert, wie eine Gruppe von Pods über
Netzwerk erreichbar ist..helmignore: Eine Datei ähnlich
.gitignore, die Dateien oder Verzeichnisse definiert, die
Helm ignorieren sollte.
Beispiel für eine Chart.yaml:
apiVersion: v2
name: my-chart
description: A Helm chart for Kubernetes
# A SemVer 2 version string
version: 1.0.0
# Optional Kubernetes version compatibility
kubeVersion: ">= 1.19.0"
# Chart dependencies
dependencies:
- name: mysql
version: "5.7.x"
repository: "https://charts.bitnami.com/bitnami"Beispiel für eine values.yaml:
replicaCount: 2
image:
repository: nginx
pullPolicy: IfNotPresent
tag: "1.16.0"
service:
type: LoadBalancer
port: 80
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128MiDiese Dateien werden dann von Helm verwendet, um Kubernetes-Ressourcen dynamisch zu erstellen, wenn das Chart installiert oder aktualisiert wird.
Um ein neues Helm Chart zu erstellen:
helm create mein-chartUm ein Helm Chart zu installieren:
helm install mein-release ./mein-chartZum Aktualisieren eines bestehenden Releases auf eine neue Version des Charts oder um die Konfiguration zu ändern:
helm upgrade mein-release ./mein-chartEin Release löschen:
helm delete mein-releaseStandardwerte überschreiben durch die Kommandozeile:
helm install mein-release ./mein-chart --set image.tag="1.16.1"Oder eine values.yaml-Datei verwenden, um Werte zu
überschreiben:
helm install mein-release ./mein-chart -f custom-values.yamlUm die effektiven Werte eines Releases anzuzeigen:
helm get values mein-releaseDen Status eines Releases prüfen:
helm status mein-releaseListe aller Releases anzeigen:
helm ls --all-namespaceshelm create mein-chartDieser Befehl erstellt ein neues Verzeichnis mein-chart
mit einer Chart-Vorlage.
helm install mein-release ./mein-chartHier wird ein Release namens mein-release basierend auf
dem mein-chart Chart installiert.
custom-values.yaml:
replicaCount: 3helm install mein-release ./mein-chart -f custom-values.yamlDurch diesen Befehl wird das Release mein-release mit
den in custom-values.yaml definierten Werten installiert,
welche die Standardwerte überschreiben.
helm upgrade mein-release ./mein-chart --set service.port=8080Das Release mein-release wird mit einer geänderten
Service-Port-Konfiguration aktualisiert.
helm delete mein-releaseDieser Befehl entfernt das Release mein-release aus dem
Cluster.
helm get values mein-releaseZeigt die aktuellen, effektiven Werte, die im Release
mein-release verwendet werden.
helm status mein-releaseZeigt detaillierte Informationen über den aktuellen Status des
mein-release.
helm ls --all-namespacesDies zeigt eine Liste aller Releases in allen Namespaces.
In Helm Charts werden Werte (Values) innerhalb der Template-Dateien
mit einer Kombination aus der Mustache-Template-Sprache und
Helm-spezifischen Funktionen verwendet. Die Mustache-Templates verwenden
doppelte geschweifte Klammern ({{ }}) für die Markierung,
innerhalb derer Variablen und Funktionen verarbeitet werden.
Nehmen wir an, Sie haben eine values.yaml-Datei, die so
aussieht:
replicaCount: 2
image:
repository: meinrepo/meineapp
tag: "1.2.3"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80Diese Werte können in den Template-Dateien wie folgt verwendet werden:
deployment.yaml)apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: meineapp
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: {{ .Values.service.port }}In diesem Beispiel:
{{ .Release.Name }} verwendet den Namen des Releases,
der beim Installieren des Charts angegeben wurde.{{ .Values.replicaCount }} bezieht sich auf den Wert
replicaCount aus der values.yaml Datei.{{ .Values.image.repository }}:{{ .Values.image.tag }}
kombiniert die Werte repository und tag, um
den vollständigen Image-Namen zu bilden.{{ .Values.image.pullPolicy }} und
{{ .Values.service.port }} verwenden die entsprechenden
Werte aus der values.yaml Datei.service.yaml)apiVersion: v1
kind: Service
metadata:
name: {{ .Release.Name }}-service
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: {{ .Values.service.port }}
selector:
app.kubernetes.io/name: {{ .Release.Name }}Mustache-Templates in Helm unterstützen auch logische Operatoren, wie
if-Bedingungen:
{{ if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ .Release.Name }}-ingress
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: {{ .Release.Name }}-service
port:
number: {{ .Values.service.port }}
{{ end }}In diesem Fall wird das Ingress-Objekt nur erstellt, wenn der Wert
ingress.enabled auf true gesetzt ist.
Zum Iterieren über Listen oder Dictionaries können Sie
range verwenden:
spec:
template:
spec:
containers:
{{- range .Values.containers }}
- name: {{ .name }}
image: "{{ .image }}:{{ .tag }}"
{{- end }}Angenommen values.yaml hat folgenden Inhalt:
containers:
- name: container1
image: meinrepo/container1
tag: "1.0"
- name: container2
image: meinrepo/container2
tag: "2.0"Diese Schleife erstellt Konfigurationen für jeden Container in der Liste.
Die Mustache-Syntax in Helm ist mächtig und flexibel, und kann mit den zusätzlichen Funktionen, die Helm bietet, wie Pipelines, Funktionen und Variablen, kombiniert werden, um komplexe Logik und Konfigurationen in Kubernetes-Manifesten zu ermöglichen.
Helm, als Paketmanager für Kubernetes, ermöglicht es, Anwendungen als vorgefertigte Pakete, sogenannte Charts, zu definieren, zu installieren und zu aktualisieren. Es gibt viele öffentliche und private Repositories, die eine Vielzahl von vorgefertigten Charts für gängige Anwendungen und Dienste anbieten. Diese Repositories erleichtern die Verwaltung und Installation von Anwendungen auf Kubernetes-Clustern erheblich. Im Folgenden wird die Installation des Nginx-Servers auf einem Kubernetes-Cluster am Beispiel einer Chart aus einem solchen Repository dargestellt.
Helm Repository hinzufügen
Fügen Sie das Helm Repository, das die Nginx-Chart enthält, zu Ihrer
Helm-Installation hinzu. Beispiel für die Stable Community Charts:
helm repo add stable https://charts.helm.sh/stable
helm repo updateHelm Chart suchen
Suchen Sie die gewünschte Chart im hinzugefügten Repository:
helm search repo nginxHelm Chart installieren
Installieren Sie die Nginx-Chart mit einem Release-Namen Ihrer Wahl:
helm install my-release stable/nginxKonfiguration anpassen
Bei Bedarf können Sie eine benutzerdefinierte Konfigurationsdatei
verwenden, um die Installation anzupassen. Erstellen Sie dazu eine Datei
namens values.yaml mit Ihren Konfigurationseinstellungen
und verwenden Sie die --values-Option beim Installieren der
Chart:
helm install my-release stable/nginx --values values.yamlRessourcen überprüfen
Überprüfen Sie die erstellten Kubernetes-Ressourcen und stellen Sie
sicher, dass Nginx ordnungsgemäß ausgeführt wird:
kubectl get allZugang testen
Testen Sie den Zugang zu Nginx, indem Sie die externe IP-Adresse und den
Port verwenden, die von der Service-Ressource bereitgestellt
werden.
Upgrade/Downgrade
Bei Bedarf können Sie das Release mit einem neuen Chart oder einer neuen
Konfiguration aktualisieren oder auf eine frühere Version
zurücksetzen:
helm upgrade my-release stable/nginx --values new-values.yaml
helm rollback my-release 1helm show values stable/nginx, um die
Standardkonfiguration der Chart anzuzeigen.helm list um alle installierten Helm
Releases im aktuellen Namespace anzuzeigen.