Erstellen und Bereitstellen in Azure Kubernetes Service mit Azure Pipelines

Azure DevOps Services

Verwenden Sie Azure Pipelines für das automatische Bereitstellen in Azure Kubernetes Service (AKS). Mit Azure Pipelines können Sie mithilfe von Azure DevOps mit Continuous Integration (CI) und Continuous Delivery (CD) Lösungen erstellen, testen und bereitstellen.

In diesem Artikel erfahren Sie, wie Sie eine Pipeline erstellen, die Ihre App kontinuierlich erstellt und bereitstellt. Sobald Sie Ihren Code in einem Repository ändern, das ein Dockerfile enthält, werden die Images an Ihre Azure Container Registry-Instanz gepusht und die Manifeste werden anschließend in Ihrem AKS-Cluster bereitgestellt.

Voraussetzungen

Abrufen des Codes

Forken Sie das folgende Repository, das eine Beispielanwendung und ein Dockerfile enthält:

https://github.com/MicrosoftDocs/pipelines-javascript-docker

Erstellen der Azure-Ressourcen

Melden Sie sich beim Azure-Portal an, und wählen Sie dann in der oberen rechten Ecke die Schaltfläche Cloud Shell aus. Verwenden Sie die Azure CLI oder PowerShell, um einen AKS-Cluster zu erstellen.

Erstellen einer Containerregistrierung

# Create a resource group
az group create --name myapp-rg --location eastus

# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys

Anmelden bei Azure Pipelines

Melden Sie sich bei Azure Pipelines an. Nach der Anmeldung wechselt Ihr Browser zu https://dev.azure.com/my-organization-name und zeigt Ihr Azure DevOps-Dashboard an.

Erstellen Sie in Ihrer ausgewählten Organisation ein Projekt. Sollten in Ihrer Organisation noch keine Projekte vorhanden sein, wird der Bildschirm Erstellen Sie als ersten Schritt ein Projekt. angezeigt. Wählen Sie andernfalls in der rechten oberen Ecke des Dashboards die Schaltfläche Projekt erstellen aus.

Erstellen der Pipeline

Verbinden und Auswählen Ihres Repositorys

  1. Melden Sie sich bei Ihrer Azure DevOps-Organisation an, und wechseln Sie zu Ihrem Projekt.

  2. Navigieren Sie zu Pipelines, und wählen Sie Neue Pipeline aus.

  3. Führen Sie die Schritte des Assistenten aus. Dabei wählen Sie zuerst GitHub als Speicherort Ihres Quellcodes aus.

  4. Möglicherweise werden Sie zu GitHub weitergeleitet, um sich anzumelden. Geben Sie in diesem Fall Ihre Anmeldeinformationen für GitHub ein.

  5. Wenn die Liste der Repositorys angezeigt wird, wählen Sie Ihr Repository aus.

  6. Sie werden möglicherweise zu GitHub weitergeleitet, um die Azure Pipelines-App zu installieren. Wenn ja, wählen Sie "Genehmigen" und "Installieren" aus.

  7. Wählen Sie In Azure Kubernetes Service bereitstellen aus.

  8. Wenn Sie dazu aufgefordert werden, wählen Sie das Abonnement aus, in dem Sie Ihre Registrierung und Ihren Cluster erstellt haben.

  9. Wählen Sie den Cluster myapp aus.

  10. Wählen Sie unter Namespace die Option Vorhanden und dann Standard aus.

  11. Wählen Sie den Namen Ihrer Containerregistrierung aus.

  12. Sie können den Imagenamen auf dem Standardwert belassen.

  13. Legen Sie den Dienstport auf 8080 fest.

  14. Legen Sie das Kontrollkästchen Prüfungs-App für Pull Requests aktivieren für die Prüfungs-App-bezogene Konfiguration so fest, dass sie in dem Pipeline-YAML-Code enthalten ist, der in nachfolgenden Schritten automatisch generiert wird.

  15. Wählen Sie Überprüfen und konfigurieren aus.

    Während Azure Pipelines Ihre Pipeline erstellt, führt der Prozess folgende Schritte aus:

    • Erstellt eine Dienstverbindung für Docker-Registrierung, damit Ihre Pipeline Images in Ihre Containerregistrierung pushen kann.

    • Erstellt eine Umgebung und eine Kubernetes-Ressource innerhalb der Umgebung. Bei einem RBAC-fähigen Cluster erstellt die erstellte Kubernetes-Ressource implizit ServiceAccount- und RoleBinding-Objekte im Cluster, sodass das erstellte ServiceAccount keine Vorgänge außerhalb des ausgewählten Namespace ausführen kann.

    • Generiert eine Datei azure-pipelines.yml, die Ihre Pipeline definiert.

    • Generiert Kubernetes-Manifestdateien. Diese Dateien werden generiert, indem die Vorlagen deployment.yml und service.yml basierend auf der von Ihnen getroffenen Auswahl aktiviert werden. Wenn Sie so weit sind, wählen Sie Speichern und ausführen aus.

  16. Klicken Sie auf Speichern und ausführen.

  17. Sie können die Commit-Nachricht in einen Text wie Pipeline zu unserem Repository hinzufügen ändern. Wenn Sie so weit sind, wählen Sie Speichern und ausführen aus, um die neue Pipeline in Ihr Repository zu committen, und beginnen Sie dann mit der ersten Ausführung Ihrer neuen Pipeline.

Beobachten der App-Bereitstellung

Während Ihre Pipeline ausgeführt wird, sehen Sie die Buildphase und dann die Bereitstellungsphase von blau (wird ausgeführt) zu grün (abgeschlossen) wechseln. Sie können die Phasen und Aufträge auswählen, um ihre Pipeline in Aktion zu sehen.

Hinweis

Wenn Sie einen von Microsoft gehosteten Agent verwenden, müssen Sie Ihrer Firewall den IP-Adressbereich des von Microsoft gehosteten Agents hinzufügen. Rufen Sie die wöchentliche Liste der IP-Adressbereiche aus der wöchentlichen JSON-Datei ab, die jeden Mittwoch veröffentlicht wird. Die neuen IP-Adressbereiche treten am folgenden Montag in Kraft. Weitere Informationen finden Sie unter Von Microsoft gehostete Agents. Um die IP-Adressbereiche zu ermitteln, die für Ihre Azure DevOps-Organisation erforderlich sind, informieren Sie sich über das Ermitteln der möglichen IP-Adressbereiche für von Microsoft gehostete Agents.

Nachdem die Pipeline ausgeführt wurde, können Sie die Vorgänge untersuchen und anschließend die Bereitstellung der App beobachten. Gehen Sie in der Pipelinezusammenfassung wie folgt vor:

  1. Wählen Sie die Registerkarte Umgebungen aus.

  2. Wählen Sie Umgebung anzeigen aus.

  3. Wählen Sie die Instanz Ihrer App für den Namespace aus, in dem die Bereitstellung erfolgte. Wenn Sie die Standardwerte verwendet haben, ist dies die App myapp im Namespace default.

  4. Wählen Sie die Registerkarte Dienste aus.

  5. Wählen Sie die externe IP-Adresse aus, und kopieren Sie sie in Ihre Zwischenablage.

  6. Öffnen Sie eine neue Registerkarte oder ein neues Fenster im Browser, und geben Sie „<IP-Adresse>:8080“ ein.

Wenn Sie unsere Beispiel-App erstellen, wird Hello World in Ihrem Browser angezeigt.

Erstellung der Pipeline

Nachdem Sie die Optionen ausgewählt und anschließend die Pipeline überprüft und konfiguriert haben, hat Azure Pipelines mithilfe der Vorlage In Azure Kubernetes Service bereitstellen eine Pipeline für Sie erstellt.

In der Buildphase wird die Docker-Aufgabe verwendet, um das Image zu erstellen und an Azure Container Registry zu pushen.

- stage: Build
  displayName: Build stage
  jobs:  
  - job: Build
    displayName: Build job
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: Docker@2
      displayName: Build and push an image to container registry
      inputs:
        command: buildAndPush
        repository: $(imageRepository)
        dockerfile: $(dockerfilePath)
        containerRegistry: $(dockerRegistryServiceConnection)
        tags: |
          $(tag)

    - task: PublishPipelineArtifact@1
      inputs:
        artifactName: 'manifests'
        path: 'manifests'

Der Bereitstellungsauftrag verwendet die Kubernetes-Manifestaufgabe, um das imagePullSecret zu erstellen, das von Kubernetes-Clusterknoten zum Abrufen aus der Azure Container Registry-Ressource benötigt wird. Manifestdateien werden dann von der Kubernetes-Manifestaufgabe für die Bereitstellung im Kubernetes-Cluster verwendet. Die Manifestdateien service.yml und deployment.yml wurden generiert, als Sie die Vorlage Bereitstellen für Azure Kubernetes Service verwendet haben.

- stage: Deploy
  displayName: Deploy stage
  dependsOn: Build
  jobs:
  - deployment: Deploy
    displayName: Deploy job
    pool:
      vmImage: $(vmImageName)
    environment: 'myenv.aksnamespace' #customize with your environment
    strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadPipelineArtifact@2
            inputs:
              artifactName: 'manifests'
              downloadPath: '$(System.ArtifactsDirectory)/manifests'

          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              namespace: $(k8sNamespace)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

          - task: KubernetesManifest@0
            displayName: Deploy to Kubernetes cluster
            inputs:
              action: deploy
              namespace: $(k8sNamespace)
              manifests: |
                $(System.ArtifactsDirectory)/manifests/deployment.yml
                $(System.ArtifactsDirectory)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

Bereinigen von Ressourcen

Wenn Sie die erstellten Ressourcen nicht mehr benötigen, können Sie sie mit dem folgenden Befehl löschen:

az group delete --name myapp-rg

Geben Sie y ein, wenn Sie dazu aufgefordert werden.

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

Verwenden Sie Azure Pipelines für das automatische Bereitstellen in Azure Kubernetes Service (AKS). Mit Azure Pipelines können Sie mithilfe von Azure DevOps mit Continuous Integration (CI) und Continuous Delivery (CD) Lösungen erstellen, testen und bereitstellen.

In diesem Artikel erfahren Sie, wie Sie eine Pipeline erstellen, die Ihre App kontinuierlich erstellt und bereitstellt. Sobald Sie Ihren Code in einem Repository ändern, das ein Dockerfile enthält, werden die Images an Ihre Azure Container Registry-Instanz gepusht und die Manifeste werden anschließend in Ihrem AKS-Cluster bereitgestellt.

Voraussetzungen

Abrufen des Codes

Forken Sie das folgende Repository, das eine Beispielanwendung und ein Dockerfile enthält:

https://github.com/MicrosoftDocs/pipelines-javascript-docker

Erstellen der Azure-Ressourcen

Melden Sie sich beim Azure-Portal an, und wählen Sie dann in der oberen rechten Ecke die Schaltfläche Cloud Shell aus. Verwenden Sie die Azure CLI oder PowerShell, um einen AKS-Cluster zu erstellen.

Erstellen einer Containerregistrierung

# Create a resource group
az group create --name myapp-rg --location eastus

# Create a container registry
az acr create --resource-group myapp-rg --name mycontainerregistry --sku Basic

# Create a Kubernetes cluster
az aks create \
    --resource-group myapp-rg \
    --name myapp \
    --node-count 1 \
    --enable-addons monitoring \
    --generate-ssh-keys 

Konfigurieren der Authentifizierung

Wenn Sie Azure Container Registry (ACR) mit dem Azure Kubernetes Service (AKS) nutzen, müssen Sie einen Authentifizierungsmechanismus einrichten. Dafür stehen zwei Methoden zur Verfügung:

  1. Gewähren Sie AKS-Zugriff auf ACR. Weitere Informationen finden Sie unter Authentifizieren per Azure Container Registry über Azure Kubernetes Service.

  2. Verwenden Sie ein Kubernetes-Geheimnis für den Image-Pullvorgang. Ein Geheimnis für den Image-Pullvorgang kann mithilfe der Kubernetes-Bereitstellungsaufgabe erstellt werden.

Erstellen einer Releasepipeline

Die Buildpipeline, die zum Einrichten von CI verwendet wird, hat bereits ein Docker-Image erstellt und an Azure Container Registry gepusht. Sie hat außerdem ein Helm-Chart als ein Artefakt packetiert und veröffentlicht. In der Releasepipeline wird das Containerimage als eine Helm-Anwendung im AKS-Cluster bereitgestellt.

  1. Öffnen Sie in Azure Pipelines die Zusammenfassung für Ihren Build.

  2. Wählen Sie in der Buildzusammenfassung das Release-Symbol aus, um eine neue Releasepipeline zu starten.

    Wenn Sie bereits eine Releasepipeline erstellt haben, die diese Buildartefakte verwendet, werden Sie aufgefordert, ein neues Release zu erstellen. Navigieren Sie in diesem Fall zur Seite Releases, und starten Sie dort eine neue Releasepipeline, indem Sie das +-Symbol auswählen.

  3. Wählen Sie die Vorlage Leere Stufe aus.

  4. Öffnen Sie die Seite Aufgaben, und wählen Sie Agentauftrag aus.

  5. Wählen Sie + aus, um eine neue Aufgabe hinzuzufügen, und fügen Sie die Aufgabe Installer für Helm-Tools hinzu. Dadurch wird sichergestellt, dass auf dem Agent, der die nachfolgenden Aufgaben ausführt, Helm und Kubectl installiert sind.

  6. Wählen Sie noch einmal + aus, und fügen Sie die Aufgabe Helm-Charts paketieren und bereitstellen hinzu. Konfigurieren Sie die Einstellungen für diese Aufgabe wie folgt:

    • Verbindungstyp: Wählen Sie Azure Resource Manager aus, um über eine Azure-Dienstverbindung eine Verbindung mit einem AKS-Cluster herzustellen. Wenn Sie eine Verbindung mit einem Kubernetes-Cluster über kubeconfig oder ein Dienstkonto herstellen möchten, können Sie alternativ Kubernetes-Dienstverbindung auswählen. In diesem Fall müssen Sie für die folgende Einstellung anstelle eines Azure-Abonnements eine Kubernetes-Dienstverbindung erstellen und auswählen.

    • Azure-Abonnement: Wählen Sie in der Liste Verfügbare Azure-Dienstverbindungen eine Verbindung aus, oder erstellen Sie eine Verbindung mit eingeschränkteren Berechtigungen für Ihr Azure-Abonnement. Wenn neben der Eingabe die Schaltfläche Autorisieren angezeigt wird, verwenden Sie diese, um die Verbindung mit Ihrem Azure-Abonnement zu autorisieren. Wenn das erforderliche Azure-Abonnement nicht in der Liste der Abonnements enthalten ist, lesen Sie Erstellen einer Azure-Dienstverbindung, um die Verbindung manuell einzurichten.

    • Ressourcengruppe: Geben Sie die Ressourcengruppe ein, die Ihren AKS-Cluster enthält, oder wählen Sie sie aus.

    • Kubernetes-Cluster: Geben Sie den AKS-Cluster ein, den Sie erstellt haben, oder wählen Sie ihn aus.

    • Befehl: Wählen Sie init als Helm-Befehl aus. Dadurch wird Tiller in Ihrem laufenden Kubernetes-Cluster installiert. Außerdem werden alle erforderlichen lokalen Konfigurationen eingerichtet. Aktivieren Sie Imageversion „canary“ verwenden, um die neueste Vorabversion von Tiller zu installieren. Falls Tiller bereits vorinstalliert ist, können Sie auch ein Upgrade vornehmen, indem Sie Tiller-Upgrade durchführen aktivieren. Wenn diese Optionen aktiviert sind, führt die Aufgabe helm init --canary-image --upgrade aus

  7. Wählen Sie im Agent-Auftrag das +-Symbol aus, und fügen Sie eine weitere Aufgabe Helm-Charts paketieren und bereitstellen hinzu. Konfigurieren Sie die Einstellungen für diese Aufgabe wie folgt:

    • Kubernetes-Cluster: Geben Sie den AKS-Cluster ein, den Sie erstellt haben, oder wählen Sie ihn aus.

    • Namespace: Geben Sie den Kubernetes-Clusternamespace ein, in dem Sie Ihre Anwendung bereitstellen möchten. Kubernetes unterstützt mehrere virtuelle Cluster, die von demselben physischen Cluster unterstützt werden. Diese virtuellen Cluster werden als Namespaces bezeichnet. Mithilfe von Namespaces können Sie verschiedene Umgebungen wie Entwicklung, Test und Staging im gleichen Cluster erstellen.

    • Befehl: Wählen Sie upgrade als Helm-Befehl aus. Mithilfe dieser Aufgabe können Sie einen beliebigen Helm-Befehl ausführen und Befehlsoptionen als Argumente übergeben. Wenn Sie upgrade auswählen, werden in der Aufgabe einige weitere Felder angezeigt:

      • Charttyp: Wählen Sie Dateipfad aus. Alternativ können Sie Chartname auswählen, wenn Sie eine URL oder einen Chartnamen angeben möchten. Wenn der Chartname beispielsweise stable/mysql lautet, führt die Aufgabe helm upgrade stable/mysql aus

      • Chartpfad: Dies kann ein Pfad zu einem paketierten Chart oder ein Pfad zu einem nicht paketierten Chartverzeichnis sein. In diesem Beispiel veröffentlichen Sie das Chart mithilfe eines CI-Builds. Wählen Sie daher das Dateipaket mithilfe der Dateiauswahl aus, oder geben Sie $(System.DefaultWorkingDirectory)/**/*.tgz ein.

      • Releasename: Geben Sie einen Namen für Ihr Release ein, z. B. azuredevops.

      • Pods neu erstellen: Aktivieren Sie dieses Kontrollkästchen, wenn sich während des Release eine Konfigurationsänderung ergibt und Sie einen ausgeführten Pod durch die neue Konfiguration ersetzen möchten.

      • Werte zurücksetzen: Aktivieren Sie dieses Kontrollkästchen, wenn die in das Chart integrierten Werte alle von der Aufgabe bereitgestellten Werte überschreiben sollen.

      • Erzwingen: Aktivieren Sie dieses Kontrollkästchen, wenn im Fall von Konflikten ein Upgrade und Rollback durchgeführt werden soll, um die Ressource zu löschen, neu zu erstellen und das vollständige Release neu zu installieren. Dies ist in Szenarien nützlich, in denen beim Anwenden von Patches Fehler auftreten können (z. B. bei Diensten, da die Cluster-IP-Adresse unveränderlich ist).

      • Argumente: Geben Sie die Argumente des Helm-Befehls und die entsprechenden Werte ein, z. B. --set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId). In diesem Abschnitt finden Sie eine Beschreibung der Gründe für die Verwendung dieser Argumente.

      • TLS aktivieren: Aktivieren Sie dieses Kontrollkästchen, um starke TLS-basierte Verbindungen zwischen Helm und Tiller zu aktivieren.

      • Zertifizierungsstellenzertifikat: Geben Sie ein Zertifizierungsstellenzertifikat an, das hochgeladen und zum Ausstellen von Zertifikaten für Tiller und Helm-Client verwendet werden soll.

      • Zertifikat: Geben Sie das Tiller-Zertifikat oder das Helm-Clientzertifikat an.

      • Schlüssel: Geben Sie den Tiller-Schlüssel oder den Helm-Clientschlüssel an.

  8. Fügen Sie auf der Seite Variablen der Pipeline eine Variable namens imageRepoName hinzu, und legen Sie den Wert auf den Namen Ihres Helm-Imagerepositorys fest. In der Regel hat dies das Format example.azurecr.io/coderepository.

  9. Speichern Sie die Releasepipeline.

Beim Helm-Upgrade verwendete Argumente

In der Buildpipeline wird das Containerimage mit $(Build.BuildId) markiert, und dies wird an eine Azure Container Registry-Instanz gepusht. In einem Helm-Chart können Sie die Details des Containerimages parametrisieren, z. B. den Namen und das Tag, da das gleiche Chart für die Bereitstellung in verschiedenen Umgebungen verwendet werden kann. Diese Werte können auch in der Datei values.yaml angegeben oder durch eine vom Benutzer bereitgestellte Wertedatei überschrieben werden, die wiederum während der Helm-Installation oder des Helm-Upgrades von --set-Parametern überschrieben werden kann.

In diesem Beispiel werden die folgenden Argumente übergeben:

--set image.repository=$(imageRepoName) --set image.tag=$(Build.BuildId)

Der Wert von $(imageRepoName) wurde auf der Seite Variablen (oder im Abschnitt variables Ihrer YAML-Datei) festgelegt. Alternativ können Sie ihn direkt durch den Namen Ihres Imagerepositorys im --set-Argumentwert oder in der Datei values.yaml ersetzen. Beispiel:

  image:
    repository: VALUE_TO_BE_OVERRIDDEN
    tag: latest

Eine weitere Alternative besteht darin, die Option Werte festlegen der Aufgabe so festzulegen, dass die Argumentwerte als durch Trennwörter getrennte Schlüssel-Wert-Paare angegeben werden.

Erstellen eines Release zum Bereitstellen Ihrer App

Sie können nun ein Release erstellen. Das bedeutet, dass Sie den Prozess der Ausführung der Releasepipeline mit den Artefakten starten können, die von einem bestimmten Build erstellt wurden. Dies führt zur Bereitstellung des Builds:

  1. Wählen Sie + Release und dann Release erstellen aus.

  2. Überprüfen Sie im Bereich Neues Release erstellen, ob die von Ihnen gewünschte Artefaktversion ausgewählt ist, und wählen Sie dann Erstellen aus.

  3. Klicken Sie in der Meldung in der Informationsleiste auf den Releaselink. Beispiel: „Release Release-1 wurde erstellt.“

  4. Wählen Sie in der Pipelineansicht den Statuslink in den Phasen der Pipeline aus, um die Protokolle und die Agentausgabe anzuzeigen.