Umgebung: Kubernetes-Ressource

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

Die Kubernetes-Ressourcenansicht bietet einen Einblick in den Status von Objekten in dem der Ressource zugeordneten Namespace. Diese Ressourcenansicht überlagert auch die Verfolgbarkeit von Pipelines, sodass Sie eine Nachverfolgung von einem Kubernetes-Objekt zur Pipeline und dann zurück zum Commit durchführen können.

Verwenden Sie Kubernetes-Cluster in einer Umgebung für die Bereitstellung mithilfe von Kubernetes-Ressourcen als Ziel. Verwenden Sie Pipelines für die Bereitstellung in Azure Kubernetes Service (AKS) und Clustern von anderen Cloudanbietern.

Sie können Kubernetes-Ressourcen mit öffentlichen oder privaten Clustern verwenden. Weitere Informationen zur Funktionsweise von Ressourcen finden Sie unter Ressourcen in YAML und Sicherheit mit Ressourcen.

Übersicht

Erfahren Sie etwas über die folgenden Vorteile der Verwendung von Kubernetes-Ressourcenansichten in Umgebungen:

  • Pipelineverfolgbarkeit: Die für Bereitstellungen verwendete Kubernetes-Manifestaufgabe fügt weitere Anmerkungen hinzu, um die Nachverfolgbarkeit von Pipelines in Ressourcenansichten umzusetzen. Mithilfe der Pipelineverfolgbarkeit können Sie die Azure DevOps-Herkunftsorganisation, das Projekt und die Pipeline, die für an einem Objekt innerhalb des Namespace vorgenommene Updates verantwortlich ist, identifizieren.

    Pipeline traceability

  • Diagnose der Ressourcenintegrität: Mithilfe von Workloadstatus können Fehler oder Regressionen, die möglicherweise durch eine neue Bereitstellung eingeführt wurden, schnell debuggt werden. Beispiel: Bei einem nicht konfigurierten imagePullSecrets und daraus resultierenden ImagePullBackOff-Fehlern können Podstatusinformationen Ihnen dabei helfen, die Grundursache für das Problem zu identifizieren.

    ImagePullBackOff

  • Überprüfungs-App: Die Überprüfungs-App funktioniert durch Bereitstellen aller Pull Requests aus Ihrem Git-Repository in einer dynamischen Kubernetes-Ressource innerhalb der Umgebung. Prüfer können sehen, wie diese Änderungen aussehen und mit anderen abhängigen Diensten funktionieren, bevor sie in den Zielbranch zusammengeführt und in der Produktion bereitgestellt werden.

Verwenden von Azure Kubernetes Service

Ein ServiceAccount wird im ausgewählten Cluster und Namespace erstellt, wenn Sie Azure Kubernetes Service (AKS) verwenden. Für einen Kubernetes-RBAC-fähigen Cluster wird auch RoleBinding erstellt, um den Bereich des erstellten Dienstkontos auf den ausgewählten Namespace zu beschränken. Für einen Kubernetes-RBAC-deaktivierten Cluster verfügt das erstellte Dienstkonto über clusterweite (und namespaceübergreifende) Berechtigungen.

Hinzufügen einer AKS-Kubernetes-Ressource

  1. Wählen Sie auf der Seite „Umgebungsdetails“ die Option Ressource hinzufügen und dann Kubernetes aus.

  2. Wählen Sie in der Dropdownliste „Anbieter“ die Option Azure Kubernetes Service aus.

  3. Wählen Sie das Azure-Abonnement, den Cluster und den Namespace (neu/vorhanden) aus.

  4. Wählen Sie Überprüfen und erstellen aus, um die Kubernetes-Ressource zu erstellen.

  5. Vergewissern Sie sich, dass ein Cluster für Ihre Umgebung angezeigt wird. Wenn Sie noch keinen Code für Ihren Cluster bereitgestellt haben, wird der Text „Nie bereitgestellt“ angezeigt.

    Add a Kubernetes cluster.

Verwenden eines vorhandenen Dienstkontos

Das Azure Kubernetes Service ordnet eine Kubernetes Ressoruce in Ihrer Umgebung einem Namensspace zu.

Weitere Informationen zum Einrichten einer Kubernetes-Dienstverbindung außerhalb einer Umgebung finden Sie im Abschnitt Kubernetes-Dienstverbindung unter Dienstverbindungen.

Tipp

Verwenden Sie den generischen Anbieter (vorhandenes Dienstkonto), um eine Kubernetes-Ressource einem Namespace aus einem Nicht-AKS-Cluster zuzuordnen.

Hinzufügen einer Nicht-AKS-Kubernetes-Ressource

  1. Wählen Sie auf der Seite „Umgebungsdetails“ die Option Ressource hinzufügen und dann Kubernetes aus.

  2. Wählen Sie Generischer Anbieter (Dienstkonto) für Ihren Anbieter aus.

  3. Fügen Sie die Werte für Clustername und Namespace hinzu.

  4. Fügen Sie die Server-URL hinzu. Sie können die URL mit dem folgenden Befehl abrufen:

    kubectl config view --minify -o 'jsonpath={.clusters[0].cluster.server}'
    
  5. So rufen Sie das geheime Objekt ab.

    Kubernetes 1.22+

    Ersetzen Sie service-account-name durch Ihren Kontonamen.

    kubectl get secret -n <namespace>  -o jsonpath='{.items[?(@.metadata.annotations.kubernetes\.io/service-account\.name==\"service-account-name\")]}'
    

    Wenn Sie nichts erhalten, siehe manuelles Erstellen eines langlebigen API-Tokens für ein ServiceAccount.

    Kubernetes 1.22 und darunter:

    1. Suchen des geheimen Dienstkontonamens
    kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
    
    1. Ersetzen Sie <service-account-secret-name> in diesem Befehl durch den Wert des vorherigen Befehls
    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  6. Rufen Sie das geheime Objekt mithilfe der Ausgabe des vorherigen Schritts ab.

    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  7. Kopieren Sie das im JSON-Formular abgerufene geheime Objekt, und fügen Sie es in das Feld „Geheimnis“ ein.

  8. Wählen Sie Überprüfen und erstellen aus, um die Kubernetes-Ressource zu erstellen.

Verweisen auf Ihre Kubernetes-Ressourcen in einer Pipeline

Wenn Sie Azure Kubernetes Service verwenden und eine YAML-Pipeline erstellen, ist die Verwendung einer Vorlage die einfachste Möglichkeit, die Pipeline zu konfigurieren. Stellen Sie eine Verbindung mit Ihrem Repository her, und wählen Sie eine der folgenden beiden Kubernetes Service-Optionen aus:

Mit den Vorlagen können Sie die Überprüfungs-App einrichten, ohne YAML-Code von Grund auf schreiben oder explizite Rollenbindungen manuell erstellen zu müssen.

Kubernetes template options.

Einrichten der Überprüfungs-App

Im folgenden Beispiel wird der erste Bereitstellungsauftrag für Nicht-PR-Branches ausgeführt und führt Bereitstellungen für eine reguläre Kubernetes-Ressource unter Umgebungen durch. Der zweite Auftrag wird nur für PR-Branches ausgeführt und für Überprüfungs-App-Ressourcen (Namespaces im Kubernetes-Cluster) bereitgestellt, die bei Bedarf generiert werden. Ressourcen werden in der Ressourcenlistenansicht der Umgebung mit „Überprüfen“ bezeichnet. Definieren Sie Variablen, die in der Pipeline verwendet werden sollen. Wenn Sie die Vorlage Bereitstellen in Azure Kubernetes Services verwenden, werden diese Variablen für Sie definiert.

# Build and push image to Azure Container Registry; Deploy to Azure Kubernetes Service
trigger:
- main

resources:
- repo: self

variables:

  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: '12345' # Docker service connection identifier
  envName: 'myEnv' # name of your environment
  imageRepository: 'name-of-image-repository' # name of image repository
  containerRegistry: 'mycontainer.azurecr.io' # path to container registry
  dockerfilePath: '**/Dockerfile'
  tag: '$(Build.BuildId)'
  imagePullSecret: 'my-app-secret' # image pull secret

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

  # Name of the new namespace being created to deploy the PR changes.
  k8sNamespaceForPR: 'review-app-$(System.PullRequest.PullRequestId)'

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: Build
    displayName: Build
    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)

    - upload: manifests
      artifact: manifests

- stage: Production
  displayName: Deploy stage
  dependsOn: Build

  jobs:
  - deployment: Production
    condition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], 'refs/pull/')))
    displayName: Production
    pool:
      vmImage: $(vmImageName)
    environment: 
      name: $(envName).$(resourceName)
      resourceType: Kubernetes 
    strategy:
      runOnce:
        deploy:
          steps:
          - task: KubernetesManifest@0
            displayName: Create imagePullSecret
            inputs:
              action: createSecret
              secretName: $(imagePullSecret)
              dockerRegistryEndpoint: $(dockerRegistryServiceConnection)

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

  - deployment: DeployPullRequest
    displayName: Deploy Pull request
    condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/pull/'))
    pool:
      vmImage: $(vmImageName)

    environment: 
      name: $(envName).$(resourceName)
      resourceType: Kubernetes
    strategy:
      runOnce:
        deploy:
          steps:
          - reviewApp: default

          - task: Kubernetes@1
            displayName: 'Create a new namespace for the pull request'
            inputs:
              command: apply
              useConfigurationFile: true
              inline: '{ "kind": "Namespace", "apiVersion": "v1", "metadata": { "name": "$(k8sNamespaceForPR)" }}'

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

          - task: KubernetesManifest@0
            displayName: Deploy to the new namespace in the Kubernetes cluster
            inputs:
              action: deploy
              namespace: $(k8sNamespaceForPR)
              manifests: |
                $(Pipeline.Workspace)/manifests/deployment.yml
                $(Pipeline.Workspace)/manifests/service.yml
              imagePullSecrets: |
                $(imagePullSecret)
              containers: |
                $(containerRegistry)/$(imageRepository):$(tag)

          - task: Kubernetes@1
            name: get
            displayName: 'Get services in the new namespace'
            continueOnError: true
            inputs:
              command: get
              namespace: $(k8sNamespaceForPR)
              arguments: svc
              outputFormat: jsonpath='http://{.items[0].status.loadBalancer.ingress[0].ip}:{.items[0].spec.ports[0].port}'

          # Getting the IP of the deployed service and writing it to a variable for posting comment
          - script: |
              url="$(get.KubectlOutput)"
              message="Your review app has been deployed"
              if [ ! -z "$url" -a "$url" != "http://:" ]
              then
                message="${message} and is available at $url.<br><br>[Learn More](https://aka.ms/testwithreviewapps) about how to test and provide feedback for the app."
              fi
              echo "##vso[task.setvariable variable=GITHUB_COMMENT]$message"

Um diesen Auftrag in einer vorhandenen Pipeline zu verwenden, muss die Dienstverbindung zur Unterstützung der regulären Kubernetes-Umgebungsressource in „Anmeldeinformationen für Clusteradministrator verwenden“ geändert werden. Andernfalls müssen Rollenbindungen für das zugrunde liegende Dienstkonto für den Namespace der Überprüfungs-App erstellt werden.

Nächste Schritte