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 plus d’informations sur le fonctionnement des ressources, consultez les ressources dans YAML et la sécurité avec des ressources.
Remarque
Si vous utilisez un cluster AKS privé, vérifiez que vous êtes connecté au réseau virtuel du cluster, car le point de terminaison du serveur d’API n’est pas exposé via une adresse IP publique.
Azure Pipelines recommande de configurer un agent auto-hébergé au sein d’un réseau virtuel qui a accès au réseau virtuel du cluster. Pour plus d’informations, consultez les options de connexion au cluster privé.
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.
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.
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
Dans la page des détails de l’environnement, sélectionnez Ajouter une ressource , puis choisissez Kubernetes.
Sélectionnez Azure Kubernetes Service dans la liste déroulante Fournisseur.
Choisissez l’abonnement Azure, le cluster et l’espace de noms (nouveau/existant).
Sélectionnez Valider et créer pour créer la ressource Kubernetes.
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.
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
Dans la page des détails de l’environnement, sélectionnez Ajouter une ressource, puis choisissez Kubernetes.
Sélectionnez Fournisseur générique (compte de service existant) pour votre fournisseur.
Ajoutez le nom du cluster et les valeurs d’espace de noms.
Ajoutez l’URL du serveur. Vous pouvez obtenir l’URL avec la commande suivante :
kubectl config view --minify -o 'jsonpath={.clusters[0].cluster.server}'
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 :
- Rechercher le nom du secret du compte de service
kubectl get serviceAccounts <service-account-name> -n <namespace> -o 'jsonpath={.secrets[*].name}'
- 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
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
Copiez et collez l’objet Secret extrait au format JSON dans le champ Secret.
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 :
- Déployer sur le modèle Azure Kubernetes Service
- Déployer sur Kubernetes - Passer en revue l'application avec Azure DevSpaces
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.
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.