Erstellen und Installieren eines Helm-Charts

Abgeschlossen

Dank Helm-Charts wird die Bereitstellung von Anwendungen in einem Kubernetes-Cluster vereinfacht. Dabei werden die Bereitstellungsinformationen einer Anwendung als Vorlage in Form eines Helm-Charts gespeichert, das zur Bereitstellung von Anwendungen verwendet werden kann.

Angenommen, Ihr Entwicklungsteam hat die Website für Tierbedarf Ihres Unternehmens bereits in Ihrem AKS-Cluster bereitgestellt. Das Team erstellt zur Bereitstellung der Website drei Dateien:

  • Ein Bereitstellungsmanifest, mit dem beschrieben wird, wie die Anwendung im Cluster installiert und ausgeführt wird
  • Ein Dienstmanifest, mit dem beschrieben wird, wie die Website im Cluster verfügbar gemacht wird
  • Ein Eingangsmanifest, mit dem beschrieben wird, wie der Datenverkehr außerhalb des Clusters in die Webanwendung geleitet wird

Das Team stellt diese Dateien in allen drei Umgebungen im Rahmen des Lebenszyklus der Softwareentwicklung bereit. Alle drei Dateien werden mit für die jeweilige Umgebung spezifischen Variablen und Werten aktualisiert. Da die Dateien hartcodiert sind, ist die Wartung jedoch fehleranfällig.

Wie wird ein Chart von Helm verarbeitet?

Vom Helm-Client wird eine auf der Sprache Go basierendes Vorlagen-Engine implementiert, mit dem alle verfügbaren Dateien in den Ordnern eines Charts analysiert werden. Von der Vorlagen-Engine werden Kubernetes-Manifestdateien erstellt, indem die Vorlagen im Ordner templates/ des Charts mit den Werten aus den Dateien Chart.yaml und values.yaml vereint werden.

A diagram shows a process parsing a Helm template file and values file to create and deploy an application to a Kubernetes cluster using manifest files.

Sobald die Manifestdateien verfügbar sind, kann die in den generierten Manifestdateien definierte Anwendung installiert, aktualisiert und gelöscht werden.

Definieren einer Chart.yaml-Datei

Die Chart.yaml-Datei ist eine der erforderlichen Dateien in einer Helm-Chartdefinition. Sie stellt die Informationen zum Chart bereit. Der Inhalt der Datei besteht aus drei erforderlichen und verschiedenen optionalen Feldern.

Diese drei Felder sind erforderlich:

  • apiVersion: Die zu verwendende Chart-API-Version. Legen Sie für Charts, die Helm 3 verwenden, die Version auf v2 fest.
  • name: Der Chartname.
  • version: Für die Chartversionsnummer wird die semantische Versionierung 2.0.0 verwendet, die der Versionsnummernnotation MAJOR.MINOR.PATCH entspricht.

Das folgende Beispiel zeigt den Inhalt einer einfachen Datei vom Typ Chart.yaml:

apiVersion: v2
name: webapp
description: A Helm chart for Kubernetes

# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore, cannot be deployed.
type: application

# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
version: 0.1.0

# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application.
appVersion: 1.0.0

Beachten Sie die Verwendung des Felds type in der Beispieldatei. Mit Charts können Anwendungen oder Bibliotheken installiert werden. Standardmäßig wird der Charttyp application verwendet. Der Typ kann jedoch auch auf library festgelegt werden, um anzugeben, dass eine Bibliothek installiert wird.

Zum Anpassen des Chartbereitstellungsprozesses sind zahlreiche optionale Felder verfügbar. Beispielsweise können Sie das dependencies-Feld verwenden, um zusätzliche Anforderungen für das Chart anzugeben, z. B. eine Web-App, die von einer Datenbank abhängt.

Hinweis

In diesem Modul werden jedoch nicht alle optionalen Felder ausführlich beschrieben. Im Abschnitt mit der Zusammenfassung in diesem Modul finden Sie jedoch einen Link zur Dokumentation zu Helm.

Definieren einer Chart-Vorlage

Bei einer Helm-Chartvorlage handelt es sich um eine Datei, in der Manifestdateien für verschiedene Bereitstellungstypen beschrieben werden. Chartvorlagen sind in der Vorlagensprache Go geschrieben und stellen Vorlagenfunktionen bereit, mit denen die Erstellung von Manifestdateien für Kubernetes-Objekte automatisiert wird.

Vorlagendateien werden im Ordner templates/ eines Charts gespeichert. Die Vorlagen-Engine verarbeitet diese Dateien, um das endgültige Objektmanifest zu erstellen.

Angenommen, Ihr Entwicklungsteam verwendet die folgende Bereitstellungsmanifestdatei, um die Komponente des Shops für Tierbedarf im Rahmen der Lösung bereitzustellen:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app: store-front
  template:
    metadata:
      labels:
        app: store-front
    spec:
      nodeSelector:
        "kubernetes.io/os": linux
      containers:
      - name: store-front
        image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
        ports:
        - containerPort: 8080
          name: store-front
        env: 
        - name: VUE_APP_ORDER_SERVICE_URL
          value: "http://order-service:3000/"
        - name: VUE_APP_PRODUCT_SERVICE_URL
          value: "http://product-service:3002/"
        resources:
          requests:
            cpu: 1m
            memory: 200Mi
          limits:
            cpu: 1000m
            memory: 512Mi
        startupProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 3
          initialDelaySeconds: 5
          periodSeconds: 5
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 3
          initialDelaySeconds: 3
          periodSeconds: 3
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          failureThreshold: 5
          initialDelaySeconds: 3
          periodSeconds: 3
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: {{ .Values.storeFront.serviceType }}
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: store-front

Wie Sie sehen, ist der Speicherort des Containerimages mit der Syntax {{.Values.<property>}} hartcodiert. Mit der Syntax können Sie für die einzelnen benutzerdefinierten Werte Platzhalter erstellen.

Helm-Charts manuell zu erstellen, ist mühsam. Einfacher ist es, mit dem Befehl helm create ein neues Helm-Chart zu erstellen und die automatisch generierten Dateien anschließend entsprechend den Anforderungen der jeweiligen Anwendung anzupassen.

Definieren einer values.yaml-Datei

Zum Anpassen der Konfiguration eines Helm-Charts werden Chart-Werte verwendet. Chart-Werte können entweder vordefiniert sein oder bei der Bereitstellung des Charts vom Benutzer angegeben werden.

Bei einem vordefinierten Wert handelt es sich um einen Wert, bei dem die Groß-/Kleinschreibung beachtet werden muss, der im Kontext eines Helm-Charts vordefiniert wird und vom Benutzer nicht geändert werden kann. Mit Release.Name können Sie beispielsweise auf den Releasenamen verweisen. Mit Release.IsInstall können Sie prüfen, ob es sich beim aktuellen Vorgang um eine Installation handelt.

Mit vordefinierten Werten können Sie auch Daten aus dem Inhalt der Datei Chart.yaml extrahieren. Wenn Sie beispielsweise die Version des Charts ermitteln möchten, verweisen Sie auf Chart.Version. Beachten Sie, dass nur auf bekannte Felder verwiesen werden kann. Vordefinierte Werte können Sie sich als Konstanten zur Verwendung der von Ihnen erstellten Vorlagen vorstellen.

Die Syntax zum Einbeziehen von Wertnamen in eine Vorlagendatei wird erstellt, indem der Wertname in doppelte geschweifte Klammern gesetzt wird. Beispiel: {{.Release.Name}}. Wie Sie sehen, steht vor dem Wertname ein Punkt. Wenn der Punkt auf diese Weise verwendet wird, dient er als Lookup-Operator und gibt den aktuellen Geltungsbereich der Variable an.

Der folgende YAML-Codeausschnitt enthält z. B. ein in einer Wertedatei definiertes Wörterbuch:

object:
  key: value

Auf den Wert in einer Vorlage können Sie mithilfe der folgenden Syntax zugreifen:

{{ .Values.object.key }}

Mit einem bereitgestellten Wert können beliebige Werte in der Chartvorlage verarbeitet werden. Diese Werte sind in der Datei values.yaml definiert.

Im Beispiel lässt das Entwicklungsteam die folgenden konfigurierbaren Werte zu:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: {{ .Values.replicaCount }}
  ...
      containers:
      - name: store-front
        image: {{ .Values.storeFront.image.repository }}:{{ .Values.storeFront.image.tag }}
        ports:
  ...
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: {{ .Values.storeFront.serviceType }}
  ...

Das folgende Beispiel zeigt eine Datei values.yaml:

...
replicaCount: 1
...
storeFront:
  image:
    repository: "ghcr.io/azure-samples/aks-store-demo/store-front"
    tag: "latest"
  serviceType: LoadBalancer
...

Nachdem die Werte von der Vorlagen-Engine angewendet wurden, sieht das Endergebnis wie im folgenden Beispiel aus:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: store-front
spec:
  replicas: 1
  ...
      containers:
      - name: store-front
        image: ghcr.io/azure-samples/aks-store-demo/store-front:latest
        ports:
---
apiVersion: v1
kind: Service
metadata:
  name: store-front
spec:
  type: LoadBalancer
  ...

Verwendung eines Helm-Repositorys

Bei einem Helm-Repository handelt es sich um einen dedizierten HTTP-Server, auf dem Informationen in Helm-Charts gespeichert sind. Helm-Repositorys werden über den Helm-Client mit dem Befehl helm repo add konfiguriert, damit dieser Charts aus einem Repository installiert.

Sie können beispielsweise das Azure Marketplace-Helm-Repository zu Ihrem lokalen Helm-Client hinzufügen, indem Sie den folgenden Befehl ausführen:

helm repo add azure-marketplace https://marketplace.azurecr.io/helm/v1/repo

Informationen zu den in einem Repository verfügbaren Charts werden im Clienthost zwischengespeichert. Sie müssen den Cache regelmäßig aktualisieren, um die neuesten Informationen des Repositorys abzurufen. Hierzu führen Sie den Befehl helm repo update aus.

Mit dem Befehl helm search repo können Sie in allen lokal hinzugefügten Helm-Repositorys nach Charts suchen. Sie können den Befehl helm search repo allein ausführen, um für jedes hinzugefügte Repository eine Liste mit allen bekannten Helm-Charts angezeigt zu bekommen. In der Liste werden Name und Version des Charts sowie die vom Chart bereitgestellte Anwendungsversion wie in der folgenden Beispielausgabe angezeigt:

NAME                               CHART VERSION   APP VERSION   DESCRIPTION
azure-marketplace/airflow          11.0.8          2.1.4         Apache Airflow is a platform to programmaticall...
azure-marketplace/apache           8.8.3           2.4.50        Chart for Apache HTTP Server
azure-marketplace/aspnet-core      1.3.18          3.1.19        ASP.NET Core is an open-source framework create...
azure-marketplace/bitnami-common   0.0.7           0.0.7         Chart with custom tempaltes used in Bitnami cha...
azure-marketplace/cassandra        8.0.5           4.0.1         Apache Cassandra is a free and open-source dist...

Sie können nach einem bestimmten Chart suchen, indem Sie dem Befehl helm search repo einen Suchbegriff hinzufügen. Wenn Sie beispielsweise nach einem auf ASP.NET basierten Chart suchen, können Sie den folgenden Befehl verwenden:

helm search repo aspnet

In diesem Beispiel sind beim lokalen Client zwei Repositorys registriert, und von beiden wird ein Ergebnis zurückgegeben. Dies ist in der folgenden Beispielausgabe dargestellt:

NAME                            CHART VERSION   APP VERSION   DESCRIPTION                                       
azure-marketplace/aspnet-core   1.3.18          3.1.19        ASP.NET Core is an open-source framework create...
bitnami/aspnet-core             1.3.18          3.1.19        ASP.NET Core is an open-source framework create...

Testen eines Helm-Charts

Helm bietet eine Option, mit der Sie die Manifestdateien generieren können, die von der Vorlagen-Engine über das Chart erstellt werden. Mit diesem Feature können Sie das Chart vor der Freigabe testen, indem Sie zwei zusätzliche Parameter kombinieren: --dry-run und debug. Mit dem Parameter --dry-run wird sichergestellt, dass die Installation simuliert wird, während mit dem Parameter --debug eine ausführliche Ausgabe ermöglicht wird.

helm install --debug --dry-run my-release ./chart-name

Mit dem Befehl werden Informationen zu den verwendeten Werten sowie alle generierten Dateien aufgelistet. Möglicherweise müssen Sie scrollen, um alle generierten Ausgaben anzuzeigen.

Installieren eines Helm-Charts

Der Befehl helm install wird zum Installieren eines Charts verwendet. Sie können ein Helm-Diagramm über einen der folgenden Speicherorte installieren:

  • Chartordner
  • Über gepackte .tgz-tar-Archivcharts
  • Helm-Repositorys

Welche Parameter erforderlich sind, hängt jedoch vom Speicherort des Charts ab. In allen Fällen ist für den Befehl install der Name des Charts erforderlich, das installiert werden soll, sowie ein Name für das Release, das bei der Installation erstellt wird.

Ein lokales Diagramm kann mithilfe eines entpackten Diagrammordners mit Dateien oder mithilfe eines gepackten .tgz-tar-Archivs installiert werden. Zum Installieren eines Charts verweist der helm-Befehl auf das lokale Dateisystem für den Speicherort des Charts. Im folgenden Beispiel wird der Befehl „install“ gezeigt, mit dem ein Release eines entpackten Charts bereitgestellt wird:

helm install my-release ./chart-name

Im Beispiel oben ist der Parameter my-release der Releasename und der Parameter ./chart-name der Name des entpackten Diagrammpakets.

Ein gepacktes Chart wird durch den Verweis auf den Dateinamen des gepackten Charts installiert. Im folgenden Beispiel wird die Syntax für dieselbe Anwendung gezeigt, diesmal jedoch als gepacktes tar-Archiv:

helm install my-release ./chart-name.tgz

Bei der Installation eines Charts über ein Helm-Repository wird ein Chartverweis als Chartname verwendet. Der Chartverweis enthält zwei Parameter, den Namen des Repositorys und den Namen des Charts, wie im folgenden Beispiel gezeigt:

helm install my-release repository-name/chart-name

In diesem Beispiel enthält der Parameter repository-name/chart-name den Verweis auf das Repository (repository-name) und den Namen des Charts (chart-name).