Déployez des charges de travail à partir de DevOps pipelines Azure vers des clusters Amazon EKS privés - Recommandations AWS

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Déployez des charges de travail à partir de DevOps pipelines Azure vers des clusters Amazon EKS privés

Mahendra Ranasiddappa, Amazon Web Services

Récapitulatif

Ce modèle montre comment implémenter l'intégration continue et la livraison continue (CI/CD) à partir de DevOps pipelines Azure vers des clusters privés Amazon Elastic Kubernetes Service (Amazon EKS). Il répond à un défi critique auquel sont confrontées les entreprises qui améliorent leur niveau de sécurité en optant pour des points de terminaison de serveurs d'API privés pour leurs clusters Amazon EKS.

Un point de terminaison public expose le serveur d'API Kubernetes directement à Internet, ce qui crée une plus grande surface d'attaque que des acteurs malveillants pourraient potentiellement cibler. En passant à un point de terminaison privé, l'accès au plan de contrôle du cluster est limité au cloud privé virtuel (VPC) du client.

Bien que la transition d'un cluster Amazon EKS vers un point de terminaison d'API privé améliore considérablement la sécurité, elle pose des problèmes de connectivité pour les CI/CD plateformes externes telles qu'Azure DevOps. Le point de terminaison privé n'est accessible que depuis le VPC ou les réseaux pairs du cluster. Par conséquent, les DevOps agents Azure standard hébergés par Microsoft, opérant en dehors du réseau AWS privé, ne peuvent pas accéder directement au serveur d'API Kubernetes. Cela interrompt les flux de travail de déploiement classiques qui reposent sur des outils tels que kubectl ou Helm exécutés sur ces agents, car ils ne parviennent pas à établir de connexion avec le cluster.

Pour surmonter ce problème, ce modèle illustre une approche efficace en utilisant des DevOps agents Azure auto-hébergés au sein de clusters Amazon EKS privés. Cette solution offre une optimisation des coûts, une efficacité opérationnelle et une évolutivité supérieures tout en préservant les exigences de sécurité. Cette approche profite particulièrement aux entreprises qui cherchent à rationaliser leurs DevOps processus multicloud sans compromettre les performances ou la sécurité.

Conditions préalables et limitations

Prérequis

Limites

Architecture

Ce modèle crée ce qui suit :

  • Référentiel Amazon ECR : le référentiel Amazon Elastic Container Registry (Amazon ECR) stocke l'image Docker avec l' DevOps agent Azure et l'exemple d'application déployé.

  • Pool d' DevOps agents Azure : un pool d'agents DevOps auto-hébergé par Azure enregistre l'agent exécuté sur le cluster Amazon EKS privé.

  • Rôle IAM : rôle AWS Identity and Access Management (IAM) permettant à la connexion au service Azure de fournir l'accès requis à l'agent qui s'exécute sur un cluster Amazon EKS privé.

  • Connexion au DevOps service Azure : connexion au service dans un DevOps compte Azure pour utiliser le rôle IAM qui fournit l'accès requis pour que les tâches du pipeline puissent accéder Services AWS.

Le schéma suivant montre l'architecture du déploiement d'un DevOps agent Azure auto-hébergé sur un cluster Amazon EKS privé et du déploiement d'un exemple d'application sur le même cluster.

Déploiement d'un DevOps agent Azure auto-hébergé et d'un exemple d'application sur un cluster Amazon EKS privé.

Le schéma suivant illustre le flux de travail suivant :

  1. Déployez un DevOps agent Azure auto-hébergé en tant que déploiement au sein d'un cluster Amazon EKS.

  2. Un DevOps agent Azure se connecte au pool d'agents sur un DevOps compte Azure à l'aide d'un jeton d'accès personnel (PAT) pour l'authentification.

  3. Azure Pipelines configure un pipeline à déployer en utilisant le code d'un GitHub référentiel.

  4. Le pipeline s'exécute sur l'agent à partir du pool d'agents configuré dans la configuration du pipeline. L' DevOps agent Azure obtient les informations relatives aux tâches du pipeline en interrogeant constamment le DevOps compte Azure.

  5. L' DevOps agent Azure crée une image Docker dans le cadre de la tâche de pipeline et envoie l'image vers le référentiel Amazon ECR.

  6. L' DevOps agent Azure déploie l'exemple d'application sur un cluster Amazon EKS privé dans un espace de noms appelé. webapp

Outils

Outils

Autres outils

  • Docker est un ensemble de produits de plateforme en tant que service (PaaS) qui utilisent la virtualisation au niveau du système d'exploitation pour fournir des logiciels dans des conteneurs.

  • kubectl est une interface de ligne de commande qui vous permet d'exécuter des commandes sur des clusters Kubernetes.

Référentiel de code

Bonnes pratiques

Épopées

TâcheDescriptionCompétences requises

Trouvez le GUID de DevOps l'organisation Azure.

Connectez-vous à votre DevOps compte Azure, puis utilisez l'URL suivante pour trouver le GUID de l'organisation : https://dev.azure.com/{DevOps_Org_ID}/_apis/projectCollections?api-version=6.0 dans l'URL, remplacez-le par votre identifiant {DevOps_org_ID} d' DevOps organisation Azure.

AWS DevOps

Configurez un IdP dans le. Compte AWS

Pour configurer un fournisseur d'identité (IdP) dans le cadre Compte AWS d'une connexion au service Azure, procédez comme suit :

  1. Connectez-vous à la AWS Management Console console IAM et ouvrez-la à https://console.aws.amazon.com/iam/l'adresse.

  2. Dans le volet de gauche, sélectionnez Fournisseurs d'identité.

  3. Choisissez Ajouter un fournisseur.

  4. Choisissez OpenID Connect comme type de fournisseur.

  5. Pour URL du fournisseur, entrez l'URL de l' DevOps émetteur Azure. Chaque locataire d'Azure DevOps possède un identifiant unique OrganizationGUID qui utilise généralement le format suivant : https://vstoken.dev.azure.com/{OrganizationGUID} Remplacez {OrganizationGUID} par votre identifiant d' DevOps organisation Azure.

  6. Pour Audience, entrez api : //Azure ADToken Exchange. Il s'agit d'une valeur fixe pour Azure DevOps.

  7. Choisissez Ajouter un fournisseur.

  8. Prenez note de l'ARN du fournisseur nouvellement créé pour votre utilisation lors de la prochaine tâche.

Pour plus de détails, consultez Comment créer une fédération AWS depuis Azure à DevOps l'aide d'OpenID Connect.

AWS DevOps

Créez une politique IAM dans le Compte AWS.

Pour créer une politique IAM afin de fournir les autorisations requises au rôle IAM utilisé par le DevOps pipeline Azure, procédez comme suit :

  1. Dans le volet gauche de la console IAM, sélectionnez Policies.

  2. Choisissez Create Policy (Créer une politique).

  3. Pour Spécifier les autorisations, dans l'éditeur de politiques, sélectionnez JSON. Remplacez la politique JSON par défaut par le JSON suivant :

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Action": [ "ecr:*", "eks:DescribeCluster", "eks:ListClusters" ], "Resource": "*" } ] }
  4. Choisissez Suivant.

  5. Dans Nom de la stratégie, entrez le nom de la stratégie IAM. Ce modèle utilise le nom ADO-Policy.

  6. Choisissez Create Policy (Créer une politique).

AWS DevOps

Créez un rôle IAM dans le Compte AWS.

Pour configurer un rôle IAM dans Compte AWS la connexion au service Azure, procédez comme suit :

  1. Dans le volet gauche de la console IAM, sélectionnez Rôles.

  2. Choisissez Créer un rôle.

  3. Pour Type d'entité fiable, sélectionnez Identité Web.

  4. Sélectionnez l'IdP approprié dans la liste déroulante. Le nom de l'IdP commence par. vstoken.dev.azure.com/{OrganizationGUID}

  5. Dans la liste déroulante Audience, sélectionnez api : //Azure Exchange ADToken.

  6. Pour limiter ce rôle à une seule connexion de service, ajoutez une condition. Sous Condition, sélectionnez Ajouter une condition, et pour Clé, sélectionnez vstoken.dev.azure.com/ {organizationGUID} :sub. Dans Condition, sélectionnez StringEquals. Pour Value, utilisez le format suivant :sc://{OrganizationName}/{ProjectName}/{ServiceConnectionName}. PourServiceConnectionName, utilisez aws-sc. Vous allez créer cette connexion de service dans la tâche suivante.

  7. Choisissez Suivant.

  8. Pour Ajouter des autorisations, sélectionnez ADO-Policy, qui est la politique que vous avez créée lors d'une tâche précédente.

  9. Choisissez Next, et dans Nom du rôle, entrez ado-role. Pour Select Trusted Entities, appliquez la politique de confiance suivante :

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::{account_id}:oidc-provider/vstoken.dev.azure.com/{OrganizationGUID}" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "vstoken.dev.azure.com/{OrganizationGUID}:aud": "api://AzureADTokenExchange", "vstoken.dev.azure.com/{OrganizationGUID}:sub": "sc://{OrganizationName}/{ProjectName}/{ServiceConnectionName}" } } } ] }

Dans la politique, fournissez vos informations pour les espaces réservés suivants :

  • {account_id}- Compte AWS Identifiant

  • {OrganizationGUID}- GUID de DevOps l'organisation Azure

  • {OrganizationName}- Nom de DevOps l'organisation Azure

  • {ProjectName}- Nom DevOps du projet Azure

  • {ServiceConnectionName}- Nom DevOps de connexion au service Azure. Utilisez aws-sc. Vous allez créer cette connexion de service dans la tâche suivante.

AWS DevOps

Créez une connexion de service dans le DevOps compte Azure.

Pour configurer une connexion au service Azure, procédez comme suit :

  1. Dans votre DevOps projet Azure, sélectionnez Paramètres du projet, Connexions aux services.

  2. Choisissez Nouvelle connexion de service, sélectionnez le type de connexion de service en tant queaws, puis sélectionnez Suivant.

  3. Dans Role to Assume, entrez l'ARN du rôle IAM ado-role. Vous avez créé un rôle secondaire dans la tâche précédente Créez un rôle IAM dans le. Compte AWS

  4. Cochez la case Utiliser OIDC.

  5. Pour le nom de la connexion au service, entrez aws-sc dans les propriétés de la tâche.

  6. Choisissez Enregistrer.

Pour plus de détails, consultez la section Créer une connexion de service dans la documentation Microsoft.

AWS DevOps

Ajoutez le rôle IAM au fichier de configuration Amazon EKS.

Le rôle IAM doit disposer des autorisations nécessaires pour effectuer les opérations requises sur le cluster Amazon EKS. Comme il s'agit d'un rôle de pipeline, le rôle IAM doit être capable de gérer presque tous les types de ressources du cluster. Par conséquent, l'autorisation de system:masters groupe est appropriée pour ce rôle.

Pour ajouter la configuration requise à Kubernetes, utilisez le code aws-auth ConfigMap suivant :

- groups: - system:masters rolearn: arn:aws:iam::{account_id}:role/ADO-role username: ADO-role

{account_id}Remplacez-le par votre Compte AWS identifiant.

Pour plus d'informations, consultez Comment Amazon EKS fonctionne avec IAM dans la documentation Amazon EKS.

AWS DevOps
TâcheDescriptionCompétences requises

Créez un pool d'agents auto-hébergé.

Pour configurer un pool d'agents auto-hébergé dans le DevOps compte Azure, procédez comme suit :

  1. Connectez-vous à l'organisation de votre DevOps compte Azure.

  2. Choisissez Azure DevOps Organization.

  3. Choisissez votre DevOps projet Azure.

  4. Choisissez Project settings (Paramètres du projet).

  5. Choisissez les pools d'agents.

  6. Choisissez Ajouter un pool.

  7. Sélectionnez Auto-hébergé.

  8. Dans le champ Nom, saisissez eks-agent.

  9. Cochez la case Accorder l'autorisation d'accès à tous les pipelines.

  10. Choisissez Créer.

Pour plus de détails, consultez la section Création et gestion de pools d'agents dans la documentation Microsoft.

TâcheDescriptionCompétences requises

Créez un référentiel Amazon ECR.

Les images Docker utilisées pour déployer l' DevOps agent Azure et l'exemple d'application (webapp) sur le cluster Amazon EKS privé doivent être stockées dans un référentiel Amazon ECR. Pour créer un référentiel Amazon ECR, procédez comme suit :

  1. Ouvrez la console Amazon ECR dans les https://console.aws.amazon.com/ecr/référentiels.

  2. Dans la barre de navigation, choisissez le dans lequel Région AWScréer votre dépôt.

  3. Sur la page Référentiels, choisissez Dépôts privés, puis sélectionnez Créer un référentiel.

  4. Dans Nom du référentiel, entrez webapp. Pour que l'exemple d'application de ce modèle fonctionne, le nom du référentiel Amazon ECR doit utiliser webapp. Si vous utilisez un autre nom pour le référentiel, consultez la section Résolution des problèmes.

Pour plus de détails, consultez la section Création d'un référentiel privé Amazon ECR pour stocker des images dans la documentation Amazon ECR.

AWS DevOps

Créez un Dockerfile pour créer l'agent Azure DevOps .

Créez un Dockerfile pour créer l'image Docker sur laquelle l'agent Azure DevOps est installé. Stockez le contenu suivant dans un fichier nommé Dockerfile :

FROM ubuntu:22.04 ENV TARGETARCH="linux-x64" RUN apt update && apt upgrade -y && apt install -y curl git jq libicu70 unzip wget RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" RUN unzip awscliv2.zip RUN ./aws/install RUN rm -rf aws awscliv2.zip RUN curl -sSL https://get.docker.com/ | sh RUN curl -sL https://aka.ms/InstallAzureCLIDeb | bash RUN mkdir -p azp WORKDIR /azp/ COPY ./start.sh ./ RUN chmod +x ./start.sh RUN useradd -m -d /home/agent agent RUN chown -R agent:agent /azp /home/agent RUN groupadd -f docker RUN usermod -aG docker agent USER agent ENTRYPOINT [ "./start.sh" ]
AWS DevOps

Créez un script pour l' DevOps agent Azure.

Pour créer le start.sh script, procédez comme suit :

  1. Accédez à la procédure Créer et compiler le Dockerfile dans la documentation Microsoft, puis passez à l'étape 5. Enregistrez le contenu suivant dans~/azp-agent-in-docker/start.sh, en veillant à utiliser des fins de ligne de style Unix (LF).

  2. Copiez le contenu du script et enregistrez-le dans un fichier nommé start.sh dans le même répertoire que le Dockerfile.

AWS DevOps

Créez une image Docker avec l' DevOps agent Azure.

Pour créer une image Docker afin d'installer l' DevOps agent Azure, utilisez le Dockerfile que vous avez créé précédemment pour créer l'image. Dans le répertoire où le Dockerfile est stocké, exécutez les commandes suivantes :

aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com docker build --platform linux/amd64 -t ado-agent:latest . docker tag ado-agent:latest aws_account_id.dkr.ecr.region.amazonaws.com/webapp:latest docker push aws_account_id.dkr.ecr.region.amazonaws.com/webapp:latest

Remplacez aws_account_id et region par votre Compte AWS identifiant et Région AWS.

AWS DevOps
TâcheDescriptionCompétences requises

Générez un jeton d'accès personnel Azure.

L'agent exécuté sur le cluster privé Amazon EKS a besoin d'un jeton d'accès personnel (PAT) afin de pouvoir s'authentifier auprès du DevOps compte Azure. Pour générer un PAT, procédez comme suit :

  1. Connectez-vous avec le compte utilisateur que vous prévoyez d'utiliser dans votre DevOps organisation Azure (https://dev.azure.com/{Your_Organization}).

  1. Sur votre page d'accueil, ouvrez vos paramètres utilisateur, puis sélectionnez Jetons d'accès personnels.

  2. Choisissez Nouveau jeton.

  3. Entrez le nom du jeton.

  4. Choisissez Afficher toutes les étendues.

  5. Pour les pools d'agents, cochez la case Lire et gérer.

  6. Choisissez Créer.

  7. Pour créer un secret sur le cluster privé Amazon EKS, utilisez la configuration suivante :

apiVersion: v1 kind: Secret metadata: name: azdevops-pat namespace: default type: Opaque stringData: AZP_TOKEN: <PAT Token>
  1. Stockez la configuration dans un fichier nomméado-secret.yaml. <PAT Token>Remplacez-le par le jeton d'accès personnel que vous venez de créer. Pour créer le secret, exécutez la commande suivante :

kubectl create -f ado-secret.yaml

Pour plus de détails, voir Enregistrer un agent à l'aide d'un jeton d'accès personnel (PAT) dans la documentation Microsoft.

AWS DevOps

Utilisez le fichier manifeste Kubernetes pour le déploiement de l'agent.

Pour déployer l' DevOps agent Azure sur le cluster privé Amazon EKS, copiez le fichier manifeste suivant et stockez-le sous le nom agent-deployment.yaml :

apiVersion: apps/v1 kind: Deployment metadata: name: azure-pipelines-agent-eks labels: app: azure-pipelines-agent spec: replicas: 1 selector: matchLabels: app: azure-pipelines-agent template: metadata: labels: app: azure-pipelines-agent spec: containers: - name: docker image: docker:dind securityContext: privileged: true volumeMounts: - name: shared-workspace mountPath: /workspace - name: dind-storage mountPath: /var/lib/docker env: - name: DOCKER_TLS_CERTDIR value: "" - name: azure-pipelines-agent image: aws_account_id.dkr.ecr.region.amazonaws.com/webapp:latest env: - name: AZP_URL value: "<Azure account URL>" - name: AZP_POOL value: "eks-agent" - name: AZP_TOKEN valueFrom: secretKeyRef: name: azdevops-pat key: AZP_TOKEN - name: AZP_AGENT_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: DOCKER_HOST value: tcp://localhost:2375 volumeMounts: - mountPath: /workspace name: shared-workspace volumes: - name: dind-storage emptyDir: {} - name: shared-workspace emptyDir: {}

Remplacez aws_account_id et <Azure account URL> par votre Compte AWS identifiant et l'URL de votre DevOps compte Azure.

AWS DevOps

Déployez l'agent sur le cluster Amazon EKS privé.

Pour déployer l'agent Azure Devops sur le cluster privé Amazon EKS, utilisez la commande suivante :

kubectl create -f agent-deployment.tf
AWS DevOps

Vérifiez que l'agent est en cours d'exécution.

Pour vérifier que l' DevOps agent Azure est en cours d'exécution, utilisez la commande suivante :

kubectl get deploy azure-pipelines-agent-eks

Le résultat attendu doit être similaire à ce qui suit :

NAME READY UP-TO-DATE AVAILABLE AGE azure-pipelines-agent-eks 1/1 1 1 58s

Assurez-vous que la READY colonne s'affiche1/1.

AWS DevOps

Vérifiez que l'agent est enregistré dans le pool d' DevOps agents Azure.

Pour vérifier que l'agent est déployé sur le cluster privé Amazon EKS et qu'il est enregistré dans le pool d'agentseks-agent, procédez comme suit :

  1. Connectez-vous à votre DevOps organisation Azure (https://dev.azure.com/{Your_Organization}).

  2. Choisissez Project settings (Paramètres du projet).

  3. Choisissez les pools d'agents.

  4. Sélectionnez le pool eks-agent, puis vérifiez l'onglet Agents.

Vous devriez voir un agent répertorié avec un statut en ligne, et le nom de l'agent doit commencer par azure-pipelines-agent-eks-*.

AWS DevOps
TâcheDescriptionCompétences requises

Ajoutez le référentiel d'exemples d'applications à votre GitHub compte.

Ajoutez le référentiel AWS d'échantillons suivant à votre GitHub compte :

https://github.com/aws-samples/deploy-kubernetes-resources-to- amazon-eks-using-azure devops

AWS DevOps

Créez un pipeline.

Pour créer un pipeline dans votre DevOps compte Azure, procédez comme suit :

  1. Connectez-vous avec le compte utilisateur que vous prévoyez d'utiliser dans votre DevOps organisation Azure (https://dev.azure.com/{Your_Organization}).

  2. Accédez à la console de votre projet et de vos pipelines.

  3. Choisissez New Pipeline.

  4. Pour Où est votre code, choisissez GitHub.

  5. Fournissez les informations d'identification requises pour que le pipeline se connecte à votre GitHub compte

  6. Sélectionnez le dépôt deploy-kubernetes-resources-to- amazon-eks-using-azure -devops.

  7. Pour Configurer votre pipeline, sélectionnez le fichier YAML Azure Pipelines existant.

  8. Pour Sélectionner un fichier YAML existant, sélectionnez main pour Branch et azure_pipelines.yaml pour le chemin.

  9. Choisissez Continuer.

  10. Pour Revoir votre pipeline YAML, remplacez les valeurs des paramètres d'entrée pour awsRegion et awsEKSClusterName par vos informations :

pool: name: eks-agent #pool: self-hosted # If you are running self-hosted Azure DevOps Agents stages: # Refering the pipeline template, input parameter that are not specified will be added with defaults - template: ./pipeline_templates/main_template.yaml parameters: serviceConnectionName: aws-sc awsRegion: <your region> awsEKSClusterName: <name of your EKS cluster> projectName: webapp
  1. Choisissez RUN.

AWS DevOps

Vérifiez que l'exemple d'application a été déployé.

Une fois le pipeline terminé, vérifiez le déploiement réussi de l'exemple d'application en vérifiant à la fois le référentiel Amazon ECR et le cluster Amazon EKS.

Pour vérifier les artefacts dans le référentiel Amazon ECR, procédez comme suit :

  1. Accédez au référentiel webapp Amazon ECR.

  2. Confirmez la présence des nouveaux artefacts suivants :

  • Image Docker — <date>.<build_number>-image

  • Tableau du casque — <date>.<build_number>-helm

Par exemple : 20250501.1-image et 20250501.1-helm.

Pour vérifier le déploiement sur le cluster privé Amazon EKS dans l'espace de nomswebapp, utilisez la commande suivante :

kubectl get deploy -n webapp

La sortie attendue est la suivante :

NAME READY UP-TO-DATE AVAILABLE webapp 1/1 1 1

Remarque : s'il s'agit de votre première exécution de pipeline, vous devrez peut-être autoriser la connexion au service et le pool d'agents. Recherchez les demandes d'autorisation dans l'interface du DevOps pipeline Azure et approuvez-les pour continuer.

AWS DevOps

Résolution des problèmes

ProblèmeSolution

Le pipeline échoue lorsque le nom du référentiel Amazon ECR ne correspond pas webapp

L'exemple d'application s'attend à ce que le nom du référentiel Amazon ECR corresponde au projectName: webapp paramètre indiqué dansazure_pipeline.yml.

Pour résoudre ce problème, renommez votre référentiel Amazon ECR en ou mettez à jour webapp ce qui suit :

  • Renommez le webapp répertoire de votre référentiel bifurqué pour qu'il corresponde au nom de votre GitHub référentiel Amazon ECR.

  • Mettez à jour le projectName paramètre azure_pipeline.yml pour qu'il corresponde au nom de votre référentiel Amazon ECR.

Erreur : le cluster Kubernetes est inaccessible : le serveur a demandé au client de fournir des informations d'identification

Si vous rencontrez cette erreur à l'étape « Pull and Deploy Helm Chart » de votre pipeline Azure, la cause première provient généralement d'une configuration incorrecte des rôles IAM dans celui de aws-auth ConfigMap votre cluster Amazon EKS.

Pour résoudre ce problème, vérifiez les points suivants :

  • Vérifiez votre aws-auth ConfigMap configuration.

  • Vérifiez les paramètres d'authentification de votre cluster Amazon EKS : ouvrez la console Amazon EKS, détails du cluster, configuration des accès. Assurez-vous que le mode d'authentification est défini sur l'API EKS et ConfigMap (pas uniquement sur l'API EKS).

Ressources connexes

AWS Blogs

Services AWS documentation

Documentation Microsoft