Environnement - Ressource Kubernetes

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

La vue des ressources Kubernetes indique l’état d’objets dans l’espace de noms qui sont mappés à la ressource. L’affichage des ressources superpose également la traçabilité du pipeline afin que vous puissiez effectuer le suivi d’un objet Kubernetes vers le pipeline, puis revenir au commit.

Utilisez des ressources Kubernetes pour cibler des clusters Kubernetes dans un environnement pour le déploiement. Utilisez des pipelines pour déployer sur Azure Kubernetes Service (AKS) et des clusters à partir de n’importe quel autre fournisseur de cloud.

Vous pouvez utiliser des ressources Kubernetes avec des clusters publics ou privés. Pour en savoir plus sur le fonctionnement des ressources, consultez ressources dans YAML et sécurité avec les ressources.

Vue d’ensemble

Découvrez les avantages suivants de l’utilisation des vues de ressources Kubernetes dans des environnements :

  • Traçabilité du pipeline : la tâche de manifeste Kubernetes, utilisée pour les déploiements, ajoute d’autres annotations pour afficher la traçabilité du pipeline dans les vues de ressources. La traçabilité du pipeline permet d'identifier l'organisation, le projet et le pipeline Azure DevOps à l'origine des mises à jour apportées à un objet dans l'espace de noms.

    Pipeline traceability

  • Diagnostiquer l’intégrité des ressources : les états de charge de travail peuvent être utiles pour déboguer rapidement des erreurs ou des régressions qui ont été introduites par un nouveau déploiement. Par exemple, pour les images non configurées PullSecrets entraînant des erreurs ImagePullBackOff, les informations d’état du pod peuvent vous aider à identifier la cause racine du problème.

    ImagePullBackOff

  • Vérifier l’application - l’application de révision fonctionne en déployant chaque demande de tirage à partir de votre référentiel Git vers une ressource Kubernetes dynamique sous l’environnement. Les réviseurs peuvent voir à quoi ressemblent ces modifications et fonctionnent avec d’autres services dépendants avant qu’elles ne soient fusionnées dans la branche cible et déployées en production.

Utiliser Azure Kubernetes Service

Un ServiceAccount est créé dans le cluster et l’espace de noms de votre choix lorsque vous utilisez Azure Kubernetes Service (AKS). Pour un cluster Kubernetes RBAC, RoleBinding est également créé pour limiter l’étendue du compte de service créé à l’espace de noms choisi. Pour un cluster Kubernetes RBAC désactivé, le ServiceAccount créé dispose de privilèges à l’échelle du cluster (entre espaces de noms).

Ajouter une ressource Kubernetes AKS

  1. Dans la page des détails de l’environnement, sélectionnez Ajouter une ressource , puis choisissez Kubernetes.

  2. Sélectionnez Azure Kubernetes Service dans la liste déroulante Fournisseur.

  3. Choisissez l’abonnement Azure, le cluster et l’espace de noms (nouveau/existant).

  4. Sélectionnez Valider et créer pour créer la ressource Kubernetes.

  5. Vérifiez que vous voyez un cluster pour votre environnement. Le texte « Jamais déployé » s’affiche si vous n’avez pas encore déployé de code sur votre cluster.

    Add a Kubernetes cluster.

Utiliser un compte de service existant

Azure Kubernetes Service mappe une ressource Kubernetes dans votre environnement à un espace de noms.

Pour plus d’informations sur la configuration d’une connexion de service Kubernetes en dehors d’un environnement, consultez la section Connexion au service Kubernetes dans Connexions de service.

Conseil

Utilisez le fournisseur générique (compte de service existant) pour mapper une ressource Kubernetes à un espace de noms à partir d’un cluster non AKS.

Ajouter une ressource Kubernetes AKS

  1. Dans la page des détails de l’environnement, sélectionnez Ajouter une ressource, puis choisissez Kubernetes.

  2. Sélectionnez Fournisseur générique (compte de service existant) pour votre fournisseur.

  3. Ajoutez le nom du cluster et les valeurs d’espace de noms.

  4. Ajoutez l’URL du serveur. Vous pouvez obtenir l’URL avec la commande suivante :

    kubectl config view --minify -o 'jsonpath={.clusters[0].cluster.server}'
    
  5. Pour obtenir l’objet secret.

    Kubernetes 1.22+

    Remplacez service-account-name par le nom de votre compte.

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

    Si vous n’obtenez rien, consultez Créer manuellement un jeton d’API de longue durée pour un ServiceAccount.

    Kubernetes 1.22 et versions antérieures :

    1. Rechercher le nom du secret du compte de service
    kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
    
    1. remplacez <service-account-secret-name> dans cette commande par la valeur dans la commande précédente
    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  6. Obtenez l’objet secret à l’aide de la sortie de l’étape précédente.

    kubectl get secret <service-account-secret-name> -n <namespace> -o json
    
  7. Copiez et collez l’objet Secret extrait au format JSON dans le champ Secret.

  8. Sélectionnez Valider et créer pour créer la ressource Kubernetes.

Référencer vos ressources Kubernetes dans un pipeline

Si vous utilisez Azure Kubernetes Service et que vous créez un pipeline YAML, le moyen le plus simple de configurer votre pipeline consiste à utiliser un modèle. Connectez-vous à votre dépôt et sélectionnez l’une des deux options Kubernetes Service suivantes :

Les modèles vous permettent de configurer Vérifier l’application sans avoir besoin d’écrire du code YAML à partir de zéro ou de créer manuellement des liaisons de rôle explicites.

Kubernetes template options.

Configurer l’application révision

Dans l’exemple suivant, le premier travail de déploiement est exécuté pour les branches non PR et effectue des déploiements sur une ressource Kubernetes normale dans des environnements. Le deuxième travail s’exécute uniquement pour les branches de demande de tirage et se déploie sur les ressources d’application de révision (espaces de noms à l’intérieur du cluster Kubernetes) générées à la demande. Les ressources sont étiquetées avec « Révision » dans la vue de liste des ressources de l’environnement. Définissez des variables à utiliser dans le pipeline. Si vous utilisez le modèle Déployer sur Azure Kubernetes Services, ces variables sont définies pour vous.

# 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"

Pour utiliser ce travail dans un pipeline existant, la connexion de service qui sauvegarde la ressource d’environnement Kubernetes standard doit être modifiée en « Utiliser les informations d’identification d’administrateur de cluster ». Dans le cas contraire, des liaisons de rôle doivent être créées pour le compte de service sous-jacent dans l’espace de noms Vérifier l’application.

Étapes suivantes