Aufgaben "Helmdiagramme packen und bereitstellen"

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

Verwenden Sie diese Aufgabe, um einen Kubernetes-Cluster in Azure Container Service bereitzustellen, zu konfigurieren oder zu aktualisieren, indem Sie Helmbefehle ausführen. Helm ist ein Tool, das die Bereitstellung und Verwaltung von Kubernetes-Apps mithilfe eines Verpackungsformats namens Diagramme optimiert.

Sie können die komplexeste Kubernetes-App mithilfe von Helm definieren, versionieren, freigeben, installieren und aktualisieren.

  • Helm hilft Ihnen dabei, mehrere Kubernetes-Manifeste (Yaml) wie Dienst, Bereitstellungen, Configmaps und mehr in eine einzelne Einheit namens Helm-Diagramme zu kombinieren. Sie müssen weder eine Tokenisierung noch ein Vorlagentool verwenden.
  • Helmdiagramme unterstützen Sie beim Verwalten von Anwendungsabhängigkeiten und bereitstellen sowie rollbacks als Einheit. Sie sind auch einfach zu erstellen, zu versionieren, zu veröffentlichen und mit anderen Partnerteams zu teilen.

Azure Pipelines bietet integrierte Unterstützung für Helmdiagramme:

  • Die Aufgabe des Helm-Tools kann verwendet werden, um die richtige Version von Helm auf den Agents zu installieren.
  • Das Helm-Paket und die Bereitstellungsaufgabe können verwendet werden, um die App zu packen und in einem Kubernetes-Cluster bereitzustellen. Sie können die Aufgabe verwenden, um Tiller auf einen Kubernetes-Namespace zu installieren oder zu aktualisieren, um sicher eine Verbindung mit Tiller über TLS für die Bereitstellung von Diagrammen herzustellen oder einen beliebigen Helmbefehl wie Lint auszuführen.
  • Die Helmaufgabe unterstützt die Verbindung mit einer Azure Kubernetes Service mithilfe einer Azure-Dienstverbindung. Sie können eine Verbindung mit einem beliebigen Kubernetes-Cluster herstellen, indem Sie kubeconfig oder ein Dienstkonto verwenden.
  • Helmbereitstellungen können durch die Verwendung der Kubectl-Aufgabe ergänzt werden; Beispielsweise erstellen/aktualisieren, imagepullsecret und andere.

Dienstverbindung

Die Aufgabe funktioniert mit zwei Dienstverbindungstypen: Azure Resource Manager und Kubernetes Service Connection.

Hinweis

Eine Dienstverbindung ist nicht erforderlich, wenn eine Umgebungsressource, die auf einen Kubernetes-Cluster verweist, bereits in der Phase der Pipeline angegeben wurde.

Azure Resource Manager

ParameterBESCHREIBUNG
connectionType
(Dienstverbindungstyp)
(Erforderlich, es sei denn, eine Umgebungsressource ist bereits vorhanden) Azure Resource Manager, um Azure Kubernetes Service zu verwenden. Kubernetes Service Connection für alle anderen Cluster.
Standardwert: Azure Resource Manager
azureSubscriptionEndpoint
(Azure-Abonnement)
(Erforderlich) Name der Azure-Dienstverbindung.
azureResourceGroup
(Ressourcengruppe)
(Erforderlich) Name der Ressourcengruppe innerhalb des Abonnements.
kubernetesCluster
(Kubernetes-Cluster)
(Erforderlich) Name des AKS-Clusters.
namespace
(Namespace)
(Optional) Der Namespace, auf dem die Kubectl-Befehle ausgeführt werden. Wenn nicht angegeben, wird der Standardnamespace verwendet.

In diesem YAML-Beispiel für YAML wird gezeigt, wie Azure Resource Manager verwendet wird, um auf den Kubernetes-Cluster zu verweisen. Dies wird mit einem der Helmbefehle und den entsprechenden Werten verwendet, die für den Befehl erforderlich sind:

variables:
  azureSubscriptionEndpoint: Contoso
  azureContainerRegistry: contoso.azurecr.io
  azureResourceGroup: Contoso
  kubernetesCluster: Contoso

- task: HelmDeploy@0
  displayName: Helm deploy
  inputs:
    connectionType: Azure Resource Manager
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)

Kubernetes-Dienstverbindung

ParameterBESCHREIBUNG
kubernetesServiceEndpoint
(Kubernetes-Dienstverbindung)
(Erforderlich, es sei denn, eine Umgebungsressource ist bereits vorhanden) Wählen Sie eine Kubernetes-Dienstverbindung aus.
namespace
(Namespace)
(Optional) Der Namespace, auf dem die Kubectl-Befehle ausgeführt werden. Wenn nicht angegeben, wird der Standardnamespace verwendet.

In diesem YAML-Beispiel für YAML wird gezeigt, wie Kubernetes-Dienstverbindung verwendet wird, um auf den Kubernetes-Cluster zu verweisen. Dies wird mit einem der Helmbefehle und den entsprechenden Werten verwendet, die für den Befehl erforderlich sind:

- task: HelmDeploy@0
  displayName: Helm deploy
  inputs:
    connectionType: Kubernetes Service Connection
    kubernetesServiceEndpoint: Contoso

Befehlswerte

Die Befehlseingabe akzeptiert einen der folgenden Helmbefehle: create/delete/expose/get/init/install/login/logout/ls/package/rollback/upgrade.

ParameterBESCHREIBUNG
command
(Befehl)
(Erforderlich) Wählen Sie einen Helmbefehl aus.
Standardwert: ls
arguments
(Argumente)
Helmbefehlsoptionen.

In diesem YAML-Beispiel wird der Befehl ls veranschaulicht:

- task: HelmDeploy@0
  displayName: Helm list
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: ls
    arguments: --all

Init-Befehl

ParameterBESCHREIBUNG
command
(Befehl)
(Erforderlich) Wählen Sie einen Helmbefehl aus.
Standardwert: ls
canaryimage
(Kanarische Bildversion verwenden)
Verwenden Sie das Canary Tiller Image, die neueste Vorabversion von Tiller.
Standardwert: False
upgradetiller
(Upgrade Tiller)
Upgrade, wenn Tiller bereits installiert ist.
Standardwert: true
waitForExecution
(Warten)
Blockieren, bis die Ausführung des Befehls abgeschlossen ist.
Standardwert: true
arguments
(Argumente)
Helmbefehlsoptionen.

In diesem YAML-Beispiel wird der Init-Befehl veranschaulicht:

- task: HelmDeploy@0
  displayName: Helm init
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: init
    upgradetiller: true
    waitForExecution: true
    arguments: --client-only

Befehl „install“

ParameterBESCHREIBUNG
command
(Befehl)
(Erforderlich) Wählen Sie einen Helmbefehl aus.
Standardwert: ls
chartType
(Diagrammtyp)
(Erforderlich) Wählen Sie aus, wie Sie Diagramminformationen eingeben möchten. Sie können entweder den Namen des Diagramms oder den Ordner/Dateipfad zum Diagramm angeben.
Verfügbare Optionen: Name, FilePath. Standardwert: Name
chartName
(Diagrammname)
(Erforderlich) Diagrammreferenz für die Installation, dies kann eine URL oder ein Diagrammname sein. Wenn beispielsweise der Diagrammname stabil/mysql ist, führt die Aufgabe die Installation stabil/mysql aus.
releaseName
(Freigabename)
(Optional) Releasename. Falls nicht angegeben, wird sie automatisch generiert. releaseName-Eingaben sind nur für Befehle "install" und "upgrade" gültig.
overrideValues
(Werte festlegen)
(Optional) Legen Sie Werte in der Befehlszeile fest. Sie können mehrere Werte angeben, indem Sie Werte mit Kommas trennen. Beispielsweise key1=val1,key2=val2. Sie können auch mehrere Werte angeben, indem Sie sie mit newline trennen, wie folgt:
key1=val1
key2=val2

Bitte beachten Sie, dass wenn Sie über einen Wert verfügen, der neue Linien enthält, die Option verwenden valueFile , andernfalls behandelt die Aufgabe die neue Linie als Trennzeichen. Der Vorgang erstellt den Helmbefehl mithilfe dieser Satzwerte. Beispiel: Helminstallation --set key1=val1 ./redis
valueFile
(Wertdatei)
(Optional) Geben Sie Werte in einer YAML-Datei oder einer URL an. Beispielsweise führt die Angabe von myvalues.yaml zu helminstallation --values=myvalues.yaml
updatedependency
(Abhängigkeit aktualisieren)
(Optional) Führen Sie das Helmabhängigkeitsupdate aus, bevor Sie das Diagramm installieren. Aktualisieren Sie Abhängigkeiten von requirements.yaml auf das Diagramm/ Verzeichnis vor der Verpackung.
Standardwert: False
waitForExecution
(Warten)
(Optional) Blockieren sie, bis die Befehlsausführung abgeschlossen ist.
Standardwert: true
arguments
(Argumente)
Helmbefehlsoptionen

In diesem YAML-Beispiel wird der Installationsbefehl veranschaulicht:

- task: HelmDeploy@0
  displayName: Helm install
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: install
    chartType: FilePath
    chartPath: Application/charts/sampleapp

Paketbefehl

ParameterBESCHREIBUNG
command
(Befehl)
(Erforderlich) Wählen Sie einen Helmbefehl aus.
Standardwert: ls
chartPath
(Diagrammpfad)
(Erforderlich) Pfad zum Zu installierenden Diagramm. Dies kann ein Pfad zu einem verpackten Diagramm oder einem Pfad zu einem ungepackten Diagrammverzeichnis sein. Wenn z. B . ./redis angegeben wird, führt die Aufgabe die Helminstallation ./redis aus. Wenn Sie ein Diagramm verwenden, das als Artefakte veröffentlicht wird, lautet der Pfad $(System.DefaultWorkingDirectory)/ARTEFAKTE-NAME/Diagramme/CHART-NAME
version
(Version)
(Optional) Geben Sie die genaue Diagrammversion an, die installiert werden soll. Wenn dies nicht angegeben ist, wird die neueste Version installiert. Legen Sie die Version im Diagramm auf diese Semver-Version fest.
destination
(Ziel)
(Optional) Geben Sie Werte in einer YAML-Datei oder einer URL an.
Standardwert: $(Build.ArtifactStagingDirectory)
updatedependency
(Abhängigkeit aktualisieren)
(Optional) Führen Sie das Helmabhängigkeitsupdate aus, bevor Sie das Diagramm installieren. Aktualisieren Sie Abhängigkeiten von requirements.yaml auf das Diagramm/ Verzeichnis vor der Verpackung.
Standardwert: False
save
(Speichern)
(Optional) Speichern Sie verpacktes Diagramm im lokalen Diagramm-Repository.
Standardwert: true
arguments
(Argumente)
Helmbefehlsoptionen.

In diesem YAML-Beispiel wird der Paketbefehl veranschaulicht:

- task: HelmDeploy@0
  displayName: Helm package
  inputs:
    command: package
    chartPath: Application/charts/sampleapp
    destination: $(Build.ArtifactStagingDirectory)

Befehl „upgrade“

ParameterBESCHREIBUNG
command
(Befehl)
(Erforderlich) Wählen Sie einen Helmbefehl aus.
Standardwert: ls
chartType
(Diagrammtyp)
(Erforderlich) Wählen Sie aus, wie Sie Diagramminformationen eingeben möchten. Sie können entweder den Namen des Diagramms oder den Ordner/Dateipfad zum Diagramm angeben.
Verfügbare Optionen: Name, FilePath. Standardwert: Name
chartName
(Diagrammname)
(Erforderlich, wenn chartTypeNamees sich um einen Diagrammverweis handelt, der installiert werden soll, kann es sich um eine URL oder einen Diagrammnamen handeln. Wenn beispielsweise der Diagrammname stabil/mysql ist, führt die Aufgabe die Installation stabil/mysql aus.
chartPath
(Diagrammpfad)
(Erforderlich, falls chartTypeFilePathvorhanden) Pfad zum zu installierenden Diagramm. Dies kann ein Pfad zu einem verpackten Diagramm oder einem Pfad zu einem ungepackten Diagrammverzeichnis sein. Wenn z. B. ./redis angegeben wird, führt die Aufgabe das Helmupgrade ./redis aus. Wenn Sie ein Diagramm verwenden, das als Artefakte veröffentlicht wird, lautet der Pfad $(System.DefaultWorkingDirectory)/ARTIFACT-NAME/Diagramme/CHART-NAME
releaseName
(Releasename)
(Optional) Releasename. Wenn nicht angegeben, wird es automatisch generiert.
overrideValues
(Werte festlegen)
(Optional) Legen Sie Werte in der Befehlszeile fest. Sie können mehrere Werte angeben, indem Sie Werte mit Kommas trennen. Beispielsweise key1=val1,key2=val2. Sie können auch mehrere Werte angeben, indem Sie sie mit newline trennen, wie folgt:
key1=val1
key2=val2

Bitte beachten Sie, dass wenn Sie über einen Wert verfügen, der neue Linien enthält, die Option verwenden valueFile , andernfalls behandelt die Aufgabe die neue Linie als Trennzeichen. Der Vorgang erstellt den Helmbefehl mithilfe dieser Satzwerte. Beispiel: Helminstallation --set key1=val1 ./redis
valueFile
(Wertdatei)
(Optional) Geben Sie Werte in einer YAML-Datei oder einer URL an. Beispielsweise führt die Angabe von myvalues.yaml zu helminstallation --values=myvalues.yaml
install
(Installieren, wenn die Version nicht vorhanden ist)
(Optional) Wenn eine Version dieses Namens noch nicht vorhanden ist, starten Sie eine Installation.
Standardwert: true
recreate
(Neu erstellen von Pods)
(Optional) Führt Pods neu für die Ressource aus, falls zutreffend.
Standardwert: False
resetValues
(Werte zurücksetzen)
(Optional) Setzen Sie die Werte auf die werte zurück, die in das Diagramm integriert sind.
Standardwert: False
force
(Kraft)
(Optional) Erzwingen Sie das Ressourcenupdate durch löschen/neu, falls erforderlich.
Standardwert: False
waitForExecution
(Warten)
(Optional) Blockieren sie, bis die Befehlsausführung abgeschlossen ist.
Standardwert: true
arguments
(Argumente)
Helmbefehlsoptionen

In diesem YAML-Beispiel wird der Upgradebefehl veranschaulicht:

- task: HelmDeploy@0
  displayName: Helm upgrade
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: upgrade
    chartType: filepath
    chartPath: $(Build.ArtifactStagingDirectory)/sampleapp-v0.2.0.tgz
    releaseName: azuredevopsdemo
    install: true
    waitForExecution: false

Befehl "Speichern"

ParameterBESCHREIBUNG
command
(Befehl)
(Erforderlich) Wählen Sie einen Helmbefehl aus.
Standardwert: ls
chartNameForACR
(Diagrammname für Azure Container Registry)
(Erforderlich) Diagrammname, mit dem das Diagramm in Azure Container Registry gespeichert wird.
chartPathForACR
(Diagrammpfad für Azure Container Registry)
(Erforderlich) Pfad zum Diagrammverzeichnis.
azureSubscriptionEndpointForACR
(Azure-Abonnement für die Containerregistrierung)
(Erforderlich) Wählen Sie ein Azure-Abonnement aus, das Über Ihre Azure Container Registry verfügt.
azureResourceGroupForACR
(Ressourcengruppe)
(Erforderlich) Wählen Sie eine Azure-Ressourcengruppe aus, die ihre Containerregistrierung aufweist.
azureContainerRegistry
(Azure Container Registry)
(Erforderlich) Wählen Sie eine Azure Container Registry aus, die für Push-Helmdiagramme verwendet wird.
arguments
(Argumente)
Helmbefehlsoptionen

In diesem YAML-Beispiel wird der Befehl zum Speichern veranschaulicht:

- task: HelmDeploy@0
  displayName: Helm save
  inputs:
    command: save
    chartNameForACR: mycontainerregistry.azurecr.io/helm/hello-world:v1
    chartPathForACR: Application/charts/sampleapp
    azureSubscriptionEndpointForACR: $(azureSubscriptionEndpointForACR)
    azureResourceGroupForACR: $(azureResourceGroupForACR)
    azureContainerRegistry: $(azureContainerRegistry)

Helmdiagramme verpacken und signieren

In diesem Abschnitt erfahren Sie, wie Sie Helmdiagramme in einer Pipeline verpacken und signieren.

Generieren eines öffentlichen Schlüsselpaars zum Signieren des Helmdiagramms mithilfe von GPG

  1. GPG herunterladen.

  2. Starten Sie die Eingabeaufforderung in einem Administratormodus. Führen Sie den folgenden Befehl aus, um ein privates öffentliches Schlüsselpaar zu generieren, um das Helmdiagramm mithilfe von gpg zu signieren. Beim Erstellen des Schlüssels werden Sie zur Eingabe des Benutzernamens und der E-Mail-Adresse aufgefordert. Die "Name-E-Mail-Adresse" wird später verwendet, um das zu erstellende private Schlüsselpaar zu benennen.

    gpg --full-generate-key
    

    Schlüssel generieren

  3. Sie werden zur Eingabe der Passphrase aufgefordert. Geben Sie den Wert an, und klicken Sie auf 'OK'.

    Screenshot, der zeigt, wie die Passphrase übergeben wird.

  4. Nach dem Erstellen des Schlüssels können Sie die Liste der Schlüssel sehen, die sowohl privat als auch öffentlich mit dem folgenden Befehl enthält.

    • So sehen Sie eine Liste privater Schlüssel

      gpg --list-secret-keys
      

      Private Schlüssel

    • So zeigen Sie die Liste der öffentlichen Schlüssel an

      gpg --list-keys
      

      Öffentliche Schlüssel

  5. Speichern Sie die privaten und öffentlichen Schlüssel in 2 verschiedenen Dateien mit der Erweiterung gpg wie unten gezeigt.

    • Für einen privaten Schlüssel
    gpg --export-secret-key 94325E18E53EDD99DD8339C3CFD9DAF0707CB788 contoso@microsoft.com > C:/somepath/privatekeys.gpg
    

    Die Datei "privatekeys.gpg" wird in den oben erwähnten Pfad exportiert.

    • Für einen öffentlichen Schlüssel
    gpg --export-key 94325E18E53EDD99DD8339C3CFD9DAF0707CB788 contoso@microsoft.com > C:/somepath/publickey.gpg
    

    Die datei publickey.gpg wird in den oben erwähnten Pfad exportiert.

Speichern Sie in Azure DevOps die Datei "privatekey.gpg " im Abschnitt "Sichere Dateien " der Bibliothek.

Beispiel

pool:
  name: Hosted Ubuntu 1604

variables:
  # The below variable should be secure
  HelmKeyPassphrase: contoso@123
  keyName: contoso contoso@microsoft.com
  azureSubscriptionEndpoint: contoso
  azureResourceGroup: contoso
  kubernetesCluster: contoso

steps:
- task: DownloadSecureFile@1
  displayName: Download Secure file
  inputs:
    secureFile: privatekey.gpg
  name: privateKeyRing

- task: HelmInstaller@0
  displayName: Install Helm 2.12.0
  inputs:
    helmVersion: 2.12.0

- task: HelmDeploy@0
  displayName: helm init
  inputs:
    azureSubscriptionEndpoint: $(azureSubscriptionEndpoint)
    azureResourceGroup: $(azureResourceGroup)
    kubernetesCluster: $(kubernetesCluster)
    command: init
    arguments: --client-only

- task: HelmDeploy@0
  displayName: helm package
  inputs:
    command: package
    chartPath: Application/charts/sampleapp
    arguments: --sign --key "$(keyName)" --keyring $(privateKeyRing.secureFilePath)
  env:
    HelmKeyPassphrase: $(HelmKeyPassphrase)

Problembehandlung

Die HelmDeploy-Aufgabe löst den Fehler "unbekanntes Flag: --wait" aus, während "helm init --wait --client-only" auf Helm 3.0.2 ausgeführt wird.

Zwischen Helm 2 und Helm 3 gibt es einige Unterbrechungen. Einer davon umfasst das Entfernen von Tiller und daher wird der helm init Befehl nicht mehr unterstützt. Entfernen Sie den init-Befehl, wenn Sie Version 3.0 oder höher von Helm verwenden.

Wenn "System.debug" auf "true" festgelegt ist und helmupgrade verwendet wird, schlägt die Pipeline fehl, obwohl das Upgrade erfolgreich war.

Dies ist ein bekanntes Problem mit Helm 3, da einige Protokolle in stderr geschrieben werden. Der HelmDeploy-Task wird als nicht erfolgreich gekennzeichnet, wenn Protokolle in stderr geschrieben wurden oder der Exitcode nicht Null ist. Legen Sie für die Taskeingabe failOnStderr: false fest, um die für stderr ausgegebenen Protokolle zu ignorieren.

Quelle öffnen

Diese Aufgabe wird auf GitHub Open Source. Feedback und Beiträge sind willkommen.