52 Helm Charts

Helm documentation

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.

52.1 Struktur

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

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: 128Mi

Diese Dateien werden dann von Helm verwendet, um Kubernetes-Ressourcen dynamisch zu erstellen, wenn das Chart installiert oder aktualisiert wird.

52.2 Helm commands

52.2.1 Helm Chart erstellen

Um ein neues Helm Chart zu erstellen:

helm create mein-chart

52.2.2 Helm Chart installieren

Um ein Helm Chart zu installieren:

helm install mein-release ./mein-chart

52.2.3 Helm Chart aktualisieren

Zum Aktualisieren eines bestehenden Releases auf eine neue Version des Charts oder um die Konfiguration zu ändern:

helm upgrade mein-release ./mein-chart

52.2.4 Helm Chart löschen

Ein Release löschen:

helm delete mein-release

52.2.5 Werte setzen und überschreiben

Standardwerte ü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.yaml

52.2.6 Effektive Werte lesen

Um die effektiven Werte eines Releases anzuzeigen:

helm get values mein-release

52.2.7 Release-Status prüfen

Den Status eines Releases prüfen:

helm status mein-release

52.2.8 Liste der Releases

Liste aller Releases anzeigen:

helm ls --all-namespaces

52.2.9 Beispiele

52.2.9.1 Chart erstellen

helm create mein-chart

Dieser Befehl erstellt ein neues Verzeichnis mein-chart mit einer Chart-Vorlage.

52.2.9.2 Chart installieren

helm install mein-release ./mein-chart

Hier wird ein Release namens mein-release basierend auf dem mein-chart Chart installiert.

52.2.9.3 Chart mit angepassten Werten installieren

custom-values.yaml:

replicaCount: 3
helm install mein-release ./mein-chart -f custom-values.yaml

Durch diesen Befehl wird das Release mein-release mit den in custom-values.yaml definierten Werten installiert, welche die Standardwerte überschreiben.

52.2.9.4 Chart aktualisieren

helm upgrade mein-release ./mein-chart --set service.port=8080

Das Release mein-release wird mit einer geänderten Service-Port-Konfiguration aktualisiert.

52.2.9.5 Release löschen

helm delete mein-release

Dieser Befehl entfernt das Release mein-release aus dem Cluster.

52.2.9.6 Effektive Werte eines Releases lesen

helm get values mein-release

Zeigt die aktuellen, effektiven Werte, die im Release mein-release verwendet werden.

52.2.9.7 Status eines Releases prüfen

helm status mein-release

Zeigt detaillierte Informationen über den aktuellen Status des mein-release.

52.2.9.8 Liste aller Releases anzeigen

helm ls --all-namespaces

Dies zeigt eine Liste aller Releases in allen Namespaces.

52.3 Parametrisierung

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.

52.3.1 Beispiel: Verwendung von Values in Templates

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: 80

Diese Werte können in den Template-Dateien wie folgt verwendet werden:

52.3.2 Deployment Template (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:

52.3.3 Service Template (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 }}

52.3.4 Bedingungen und Logik

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.

52.3.5 Schleifen

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.

52.4 Third party charts

Helm Repository

52.4.1 Installation von Third-Party Helm Charts am Beispiel von Nginx

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.

  1. 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 update
  2. Helm Chart suchen
    Suchen Sie die gewünschte Chart im hinzugefügten Repository:

    helm search repo nginx
  3. Helm Chart installieren
    Installieren Sie die Nginx-Chart mit einem Release-Namen Ihrer Wahl:

    helm install my-release stable/nginx
  4. Konfiguration 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.yaml
  5. Ressourcen überprüfen
    Überprüfen Sie die erstellten Kubernetes-Ressourcen und stellen Sie sicher, dass Nginx ordnungsgemäß ausgeführt wird:

    kubectl get all
  6. Zugang testen
    Testen Sie den Zugang zu Nginx, indem Sie die externe IP-Adresse und den Port verwenden, die von der Service-Ressource bereitgestellt werden.

  7. 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 1

52.4.2 Tipps