Bereitstellen in Kubernetes
Azure DevOps Services | Azure DevOps Server 2022
Sie können Azure Pipelines für die Bereitstellung in Azure Kubernetes Service- und Kubernetes-Clustern verwenden, die von anderen Cloudanbietern angeboten werden. Azure Pipelines verfügt über zwei Aufgaben für die Arbeit mit Kubernetes:
- KubernetesManifest-Aufgabe: Baking und Bereitstellung von Manifesten in Kubernetes-Clustern mit Helm, Kompose oder Kustomize
- Kubectl-Aufgabe: Bereitstellen, Konfigurieren und Aktualisieren eines Kubernetes-Clusters in Azure Container Service durch Ausführen von kubectl-Befehlen.
Wenn Sie Azure Kubernetes Service mit einer der beiden Aufgaben verwenden, ist der Azure Resource Manager-Dienstverbindungstyp die beste Möglichkeit, eine Verbindung mit einem privaten Cluster oder einem Cluster mit deaktivierten lokalen Konten herzustellen.
Wenn Sie die Nachverfolgbarkeit der Bereitstellung verbessern möchten, verwenden Sie eine Kubernetes-Ressource in Umgebungen mit einer Kubernetes-Aufgabe.
Informationen zu den ersten Schritten mit Azure Pipelines und Azure Kubernetes Service finden Sie unter Erstellen und Bereitstellen in Azure Kubernetes Service mit Azure Pipelines. Informationen zu den ersten Schritten mit Azure Pipelines, Kubernetes und insbesondere mit der Canary-Bereitstellungsstrategie finden Sie unter Verwenden einer Canary-Bereitstellungsstrategie für Kubernetes-Bereitstellungen mit Azure Pipelines.
KubernetesManifest-Aufgabe
Von der KubernetesManifest-Aufgabe wird die Objektstabilität überprüft, bevor eine Aufgabe als Erfolg/Fehler markiert wird. Die Aufgabe ermöglicht es auch, Artefaktersetzungen durchzuführen, Anmerkungen im Zusammenhang mit der Nachverfolgbarkeit der Pipeline hinzuzufügen, das Erstellen und Verweisen auf imagePullSecrets zu vereinfachen, Baking von Manifesten auszuführen und Rollouts von Bereitstellungsstrategien zu unterstützen.
Hinweis
Eine YAML-basierte Pipeline unterstützt zwar Trigger für ein einzelnes Git-Repository, wenn Sie aber einen Trigger für eine in einem anderen Git-Repository gespeicherte Manifestdatei benötigen oder Trigger für Azure Container Registry oder Docker Hub erforderlich sind, sollten Sie anstelle einer YAML-basierten Pipeline eine klassische Pipeline verwenden.
Sie können die Baking-Aktion in der Kubernetes-Manifestaufgabe verwenden, um ein Baking von Vorlagen in Kubernetes-Manifestdateien auszuführen. Mit der Aktion können Sie Tools wie Helm, Kustomize und Kompose verwenden. Die Baking-Aktion der Kubernetes-Manifestaufgabe bietet Einblick in die Transformation zwischen Eingabevorlagen und den Endmanifestdateien, die in Bereitstellungen verwendet werden. Sie können nachgeschaltete Manifestdateien (in Aufgaben) als Eingaben für die Bereitstellungsaktion der Kubernetes-Manifestaufgabe verwenden.
Sie können Kubernetes-Ressourcen, die Teil von Umgebungen sind, mit Bereitstellungsaufträgen als Ziel verwenden. Mithilfe der Bereitstellung von Umgebungen und Ressourcen erhalten Sie Zugriff auf eine bessere Nachverfolgbarkeit von Pipelines, sodass Sie Bereitstellungsprobleme diagnostizieren können. Sie können Bereitstellungen auch in Kubernetes-Clustern mit regulären Aufträgen ohne dieselben Integritätsfeatures durchführen.
Der folgende YAML-Code ist ein Beispiel für das Baking von Manifestdateien aus Helm-Charts.
steps:
- task: KubernetesManifest@0
name: bake
displayName: Bake K8s manifests from Helm chart
inputs:
action: bake
helmChart: charts/sample
overrides: 'image.repository:nginx'
- task: KubernetesManifest@0
displayName: Deploy K8s manifests
inputs:
kubernetesServiceConnection: someK8sSC
namespace: default
manifests: $(bake.manifestsBundle)
containers: |
nginx: 1.7.9
Kubectl-Aufgabe
Alternativ zur KubernetesManifest-Aufgabe können Sie die Kubectl-Aufgabe verwenden, um einen Kubernetes-Cluster in Azure Container Service bereitzustellen, zu konfigurieren und zu aktualisieren, indem Sie kubectl-Befehle ausführen.
Das folgende Beispiel zeigt, wie eine Dienstverbindung verwendet wird, um auf den Kubernetes-Cluster zu verweisen.
- task: Kubernetes@1
displayName: kubectl apply
inputs:
connectionType: Kubernetes Service Connection
kubernetesServiceEndpoint: Contoso
Skripttask
Sie können auch kubectl
mit einer Skriptaufgabe verwenden.
Im folgenden Beispiel wird ein Skript verwendet, um kubectl
auszuführen.
- script: |
kubectl apply -f manifest.yml
Kubernetes-Bereitstellungsstrategien
Die Kubernetes-Manifestaufgabe bietet derzeit Unterstützung für die Canary-Bereitstellungsstrategie. Verwenden Sie die Canary-Bereitstellungsstrategie, um teilweise neue Änderungen bereitzustellen, sodass die neuen Änderungen vor einem vollständigen Rollout mit den aktuellen Bereitstellungen koexistieren.
Weitere Informationen zu Canary-Bereitstellungen mit Pipelines finden Sie unter Verwenden einer Canary-Bereitstellungsstrategie für Kubernetes-Bereitstellungen mit Azure Pipelines.
Kubernetes-Bereitstellungen in mehreren Clouds
Kubernetes wird bei allen Cloudanbietern auf die gleiche Weise ausgeführt. Azure Pipelines kann für die Bereitstellung in Azure Kubernetes Service (AKS), Google Kubernetes Engine (GKE), Amazon Elastic Kubernetes Service (EKS) oder Clustern von anderen Cloudanbietern verwendet werden.
Erstellen Sie zum Einrichten der Multi-Cloud-Bereitstellung eine Umgebung, und fügen Sie dann Ihre Kubernetes-Ressourcen hinzu, die Namespaces von Kubernetes-Clustern zugeordnet sind.
Der generische Anbieteransatz, der auf einem vorhandenen Dienstkonto basiert, funktioniert mit Clustern von jedem Cloudanbieter, einschließlich Azure. Der Vorteil der Verwendung der Option Azure Kubernetes Service ist, dass neue ServiceAccount- und RoleBinding-Objekte erstellt werden (anstatt ein vorhandenes ServiceAccount wiederzuverwenden), sodass das neu erstellte RoleBinding-Objekt die Vorgänge des ServiceAccount nur auf den ausgewählten Namespace beschränken kann.
Wenn Sie den generischen Anbieteransatz verwenden, stellen Sie sicher, dass eine RoleBinding vorhanden ist, die Berechtigungen für das edit
ClusterRole
gewünschte Dienstkonto gewährt. Sie müssen dem richtigen Dienstkonto Berechtigungen erteilen, damit das Dienstkonto von Azure Pipelines zum Erstellen von Objekten im ausgewählten Namespace verwendet werden kann.
Parallele Bereitstellungen in mehreren Clouds
Das folgende Beispiel zeigt, wie Sie parallele Bereitstellungen in Clustern in mehreren Clouds durchführen. In diesem Beispiel gibt es Bereitstellungen für die AKS-, GKE-, EKS- und OpenShift-Cluster. Diese vier Namespaces sind Kubernetes-Ressourcen in der contoso
-Umgebung zugeordnet.
trigger:
- main
jobs:
- deployment:
displayName: Deploy to AKS
pool:
vmImage: ubuntu-latest
environment: contoso.aksnamespace
strategy:
runOnce:
deploy:
steps:
- checkout: self
- task: KubernetesManifest@0
displayName: Deploy to Kubernetes cluster
inputs:
action: deploy
kubernetesServiceConnection: serviceConnection #replace with your service connection
namespace: aksnamespace
manifests: manifests/*
- deployment:
displayName: Deploy to GKE
pool:
vmImage: ubuntu-latest
environment: contoso.gkenamespace
strategy:
runOnce:
deploy:
steps:
- checkout: self
- task: KubernetesManifest@0
displayName: Deploy to Kubernetes cluster
inputs:
action: deploy
kubernetesServiceConnection: serviceConnection #replace with your service connection
namespace: gkenamespace
manifests: manifests/*
- deployment:
displayName: Deploy to EKS
pool:
vmImage: ubuntu-latest
environment: contoso.eksnamespace
strategy:
runOnce:
deploy:
steps:
- checkout: self
- task: KubernetesManifest@0
displayName: Deploy to Kubernetes cluster
inputs:
action: deploy
kubernetesServiceConnection: serviceConnection #replace with your service connection
namespace: eksnamespace
manifests: manifests/*
- deployment:
displayName: Deploy to OpenShift
pool:
vmImage: ubuntu-latest
environment: contoso.openshiftnamespace
strategy:
runOnce:
deploy:
steps:
- checkout: self
- task: KubernetesManifest@0
displayName: Deploy to Kubernetes cluster
inputs:
action: deploy
kubernetesServiceConnection: serviceConnection #replace with your service connection
namespace: openshiftnamespace
manifests: manifests/*
- deployment:
displayName: Deploy to DigitalOcean
pool:
vmImage: ubuntu-latest
environment: contoso.digitaloceannamespace
strategy:
runOnce:
deploy:
steps:
- checkout: self
- task: KubernetesManifest@0
displayName: Deploy to Kubernetes cluster
inputs:
action: deploy
kubernetesServiceConnection: serviceConnection #replace with your service connection
namespace: digitaloceannamespace
manifests: manifests/*