Déployer sur Kubernetes

Azure DevOps Services | Azure DevOps Server 2022

Vous pouvez utiliser Azure Pipelines pour déployer sur des clusters Azure Kubernetes Service et Kubernetes proposés par d’autres fournisseurs de cloud. Azure Pipelines dispose de deux tâches pour travailler avec Kubernetes :

  • Tâche KubernetesManifest : effectuez un bake et déployez des manifestes sur des clusters Kubernetes avec Helm, Kompose ou Kustomize
  • Tâche Kubectl : déployez, configurez et mettez à jour un cluster Kubernetes dans Azure Container Service en exécutant des commandes kubectl

Si vous utilisez Azure Kubernetes Service avec ces tâches, le type de connexion de service Azure Resource Manager est le meilleur moyen de vous connecter à un cluster privé ou à un cluster pour lequel les comptes locaux sont désactivés.

Pour une traçabilité de déploiement supplémentaire, utilisez une ressource Kubernetes dans des environnements avec une tâche Kubernetes.

Pour commencer à utiliser Azure Pipelines et Azure Kubernetes Service, consultez Générer et déployer sur Azure Kubernetes Service avec Azure Pipelines. Pour commencer à utiliser Azure Pipelines, Kubernetes et la stratégie de déploiement canary spécifiquement, consultez Utiliser une stratégie de déploiement canary pour les déploiements Kubernetes avec Azure Pipelines.

Tâche KubernetesManifest

La tâche KubernetesManifest vérifie la stabilité de l’objet avant de marquer une tâche en tant que réussite/échec. La tâche peut également effectuer une substitution d’artefact, ajouter des annotations liées à la traçabilité du pipeline, simplifier la création et le référencement d’imagePullSecrets, effectuer un bake de manifestes et faciliter le lancement de la stratégie de déploiement.

Notes

Bien que le pipeline YAML prend en charge les déclencheurs sur un référentiel Git unique, si vous avez besoin d’un déclencheur pour un fichier manifeste stocké dans un autre référentiel Git ou si des déclencheurs sont nécessaires pour Azure Container Registry ou Docker Hub, vous devez utiliser un pipeline classique au lieu d’un pipeline YAML.

Vous pouvez utiliser l’action bake dans la tâche de manifeste Kubernetes pour effectuer un bake des modèles dans des fichiers manifeste Kubernetes. L’action vous permet d’utiliser des outils tels que Helm, Kustomizeet Kompose. L’action bake de la tâche de manifeste Kubernetes offre une visibilité sur la transformation entre les modèles d’entrée et les fichiers manifestes finaux utilisés dans les déploiements. Vous pouvez utiliser des fichiers manifestes bakés en aval (dans les tâches) en tant qu’entrées pour l’action de déploiement de la tâche de manifeste Kubernetes.

Vous pouvez cibler des ressources Kubernetes qui font partie d’environnements avec des travaux de déploiement. Le déploiement d’environnements et de ressources vous permet d’accéder à une meilleure traçabilité des pipelines, et donc de diagnostiquer les problèmes de déploiement. Vous pouvez également déployer sur des clusters Kubernetes avec des travaux normaux sans les mêmes fonctionnalités d’intégrité.

Le code YAML suivant est un exemple de baking de fichiers manifeste à partir de charts Helm

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

Tâche kubectl

En guise d’alternative à la tâche KubernetesManifest, vous pouvez utiliser la tâche Kubectl pour déployer, configurer et mettre à jour un cluster Kubernetes dans Azure Container Service en exécutant des commandes kubectl.

L’exemple suivant montre comment une connexion de service est utilisée pour faire référence au cluster Kubernetes.

- task: Kubernetes@1
  displayName: kubectl apply
  inputs:
    connectionType: Kubernetes Service Connection
    kubernetesServiceEndpoint: Contoso

tâche de script

Vous pouvez également utiliser kubectl avec une tâche de script.

L’exemple suivant utilise un script pour exécuter kubectl.

- script: |
    kubectl apply -f manifest.yml

Stratégies de déploiement Kubernetes

La tâche de manifeste Kubernetes prend actuellement en charge la stratégie de déploiement canary. Utilisez la stratégie de déploiement canary pour déployer partiellement de nouvelles modifications afin que celles-ci coexistent avec les déploiements actuels avant un lancement complet.

Pour plus d’informations sur les déploiements canary avec des pipelines, consultez Utiliser une stratégie de déploiement canary pour les déploiements Kubernetes avec Azure Pipelines.

Déploiements Kubernetes multiclouds

Kubernetes s’exécute de la même façon sur tous les fournisseurs de cloud. Azure Pipelines peut être utilisé pour le déploiement sur Azure Kubernetes Service (AKS), le moteur Google Kubernetes (GKE), Amazon Elastic Kubernetes Service (EKS) ou des clusters provenant de n’importe quel autre fournisseur de cloud.

Pour configurer le déploiement multicloud, créez un environnement, puis ajoutez vos ressources Kubernetes associées aux espaces de noms des clusters Kubernetes.

L’approche de fournisseur générique basée sur un compte de service existant fonctionne avec des clusters de n’importe quel fournisseur cloud, y compris Azure. L’avantage de l’utilisation de l’option Azure Kubernetes Service est qu’elle crée de nouveaux ServiceAccount et objets RoleBinding (au lieu de réutiliser un ServiceAccount existant) afin que l’objet RoleBinding nouvellement créé puisse limiter les opérations de ServiceAccount à l’espace de noms choisi uniquement.

Lorsque vous utilisez l’approche du fournisseur générique, assurez-vous qu’un objet RoleBinding existe, qui accorde des autorisations dans le editClusterRole au compte de service souhaité. Vous devez accorder des autorisations au compte de service approprié afin que celui-ci puisse être utilisé par Azure Pipelines pour créer des objets dans l’espace de noms choisi.

Déploiements parallèles vers plusieurs clouds

L’exemple suivant illustre comment effectuer des déploiements parallèles vers des clusters dans plusieurs clouds. Dans cet exemple, il existe des déploiements sur les clusters AKS, GKE, EKS et OpenShift. Ces quatre espaces de noms sont associés aux ressources Kubernetes sous l’environnement contoso.

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/*