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.
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.
Ü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
Wählen Sie auf der Seite „Umgebungsdetails“ die Option Ressource hinzufügen und dann Kubernetes aus.
Wählen Sie in der Dropdownliste „Anbieter“ die Option Azure Kubernetes Service aus.
Wählen Sie das Azure-Abonnement, den Cluster und den Namespace (neu/vorhanden) aus.
Wählen Sie Überprüfen und erstellen aus, um die Kubernetes-Ressource zu erstellen.
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.
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
Wählen Sie auf der Seite „Umgebungsdetails“ die Option Ressource hinzufügen und dann Kubernetes aus.
Wählen Sie Generischer Anbieter (Dienstkonto) für Ihren Anbieter aus.
Fügen Sie die Werte für Clustername und Namespace hinzu.
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}'
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:
- Suchen des geheimen Dienstkontonamens
kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
- 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
Rufen Sie das geheime Objekt mithilfe der Ausgabe des vorherigen Schritts ab.
kubectl get secret <service-account-secret-name> -n <namespace> -o json
Kopieren Sie das im JSON-Formular abgerufene geheime Objekt, und fügen Sie es in das Feld „Geheimnis“ ein.
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:
- Vorlage Bereitstellen in Azure Kubernetes Service
- Bereitstellen in Kubernetes: Überprüfungs-App mit Azure DevSpaces
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.
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.