Erstellen und Installieren eines Helm-Charts
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.
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 aufv2
fest.name
: Der Chartname.version
: Für die Chartversionsnummer wird die semantische Versionierung 2.0.0 verwendet, die der VersionsnummernnotationMAJOR.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
).