Distribuisci carichi di lavoro dalle DevOps pipeline di Azure ai cluster Amazon EKS privati - Prontuario AWS

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Distribuisci carichi di lavoro dalle DevOps pipeline di Azure ai cluster Amazon EKS privati

Mahendra Revanasiddappa, Amazon Web Services

Riepilogo

Questo modello dimostra come implementare l'integrazione continua e la distribuzione continua (CI/CD) dalle DevOps pipeline di Azure ai cluster privati di Amazon Elastic Kubernetes Service (Amazon EKS). Risolve una sfida critica affrontata dalle organizzazioni che stanno migliorando il proprio livello di sicurezza passando a endpoint server API privati per i propri cluster Amazon EKS.

Un endpoint pubblico espone il server dell'API Kubernetes direttamente a Internet, creando una superficie di attacco più ampia che i malintenzionati potrebbero potenzialmente prendere di mira. Passando a un endpoint privato, l'accesso al piano di controllo del cluster è limitato all'interno del cloud privato virtuale (VPC) del cliente.

Sebbene la transizione di un cluster Amazon EKS a un endpoint API privato migliori in modo significativo la sicurezza, introduce sfide di connettività per piattaforme esterne CI/CD come Azure. DevOps L'endpoint privato è accessibile solo dall'interno del VPC o dalle reti peer del cluster. Pertanto, DevOps gli agenti Azure standard ospitati da Microsoft, che operano all'esterno della rete AWS privata, non possono raggiungere direttamente il server dell'API Kubernetes. Ciò interrompe i flussi di lavoro di distribuzione tipici che si basano su strumenti come kubectl o Helm in esecuzione su questi agenti perché non riescono a stabilire una connessione al cluster.

Per ovviare a questo problema, questo modello mostra un approccio efficiente utilizzando DevOps agenti di Azure ospitati autonomamente all'interno di cluster Amazon EKS privati. Questa soluzione offre un'ottimizzazione dei costi, un'efficienza operativa e una scalabilità superiori, preservando al contempo i requisiti di sicurezza. Questo approccio è particolarmente vantaggioso per le aziende che cercano di semplificare i DevOps processi multi-cloud senza compromettere le prestazioni o la sicurezza.

Prerequisiti e limitazioni

Prerequisiti

Limitazioni

Architettura

Questo modello crea quanto segue:

  • Repository Amazon ECR - Il repository Amazon Elastic Container Registry (Amazon ECR) archivia l'immagine Docker con l'agente DevOps Azure e l'app di esempio distribuita.

  • Pool di DevOps agenti di Azure: un pool di agenti con DevOps hosting autonomo di Azure registra l'agente in esecuzione sul cluster privato Amazon EKS.

  • Ruolo IAM: un ruolo AWS Identity and Access Management (IAM) per la connessione al servizio Azure per fornire l'accesso richiesto all'agente in esecuzione su un cluster Amazon EKS privato.

  • Connessione DevOps al servizio Azure: una connessione di servizio in un DevOps account Azure per usare il ruolo IAM che fornisce l'accesso richiesto per l'accesso ai job della pipeline. Servizi AWS

Il diagramma seguente mostra l'architettura di distribuzione di un DevOps agente di Azure con hosting autonomo su un cluster Amazon EKS privato e la distribuzione di un'applicazione di esempio sullo stesso cluster.

Distribuzione di un DevOps agente Azure con hosting autonomo e di un'applicazione di esempio su cluster Amazon EKS privato.

Il diagramma mostra il flusso di lavoro seguente:

  1. Implementa un DevOps agente di Azure ospitato autonomamente come distribuzione all'interno di un cluster Amazon EKS.

  2. Un DevOps agente di Azure si connette al pool di agenti su un DevOps account Azure usando un token di accesso personale (PAT) per l'autenticazione.

  3. Azure Pipelines configura una pipeline da distribuire usando il codice di un repository. GitHub

  4. La pipeline viene eseguita sull'agente dal pool di agenti configurato nella configurazione della pipeline. L' DevOps agente di Azure ottiene le informazioni sul lavoro della pipeline effettuando costantemente il polling sull'account Azure. DevOps

  5. L' DevOps agente di Azure crea un'immagine Docker come parte del processo della pipeline e la invia al repository Amazon ECR.

  6. L' DevOps agente di Azure distribuisce l'applicazione di esempio su un cluster Amazon EKS privato in uno spazio dei nomi chiamato. webapp

Strumenti

Strumenti

Altri strumenti

  • Docker è un insieme di prodotti Platform as a Service (PaaS) che utilizzano la virtualizzazione a livello di sistema operativo per fornire software in container.

  • kubectl è un'interfaccia a riga di comando che consente di eseguire comandi sui cluster Kubernetes.

Archivio di codice

Best practice

Epiche

AttivitàDescrizioneCompetenze richieste

Trova il GUID dell' DevOps organizzazione di Azure.

Accedi al tuo DevOps account Azure, quindi usa il seguente URL per trovare il GUID dell'organizzazione: https://dev.azure.com/{DevOps_Org_ID}/_apis/projectCollections?api-version=6.0 Nell'URL, sostituiscilo {DevOps_org_ID} con il tuo ID dell'organizzazione Azure. DevOps

AWS DevOps

Configura un IdP in. Account AWS

Per configurare un provider di identità (IdP) Account AWS per una connessione al servizio Azure, usa i seguenti passaggi:

  1. Accedi a e apri AWS Management Console la console IAM all'indirizzo. https://console.aws.amazon.com/iam/

  2. Nel riquadro di sinistra, scegli Provider di identità.

  3. Scegliere Aggiungi provider.

  4. Scegli OpenID Connect come tipo di provider.

  5. Per l'URL del provider, inserisci l'URL dell' DevOps emittente di Azure. Ogni tenant di Azure ne DevOps ha uno univoco OrganizationGUID che in genere usa il seguente formato: https://vstoken.dev.azure.com/{OrganizationGUID} Sostituisci {OrganizationGUID} con l'ID dell'organizzazione di Azure. DevOps

  6. Per Audience, inserisci api: //Azure Exchange. ADToken Si tratta di un valore fisso per Azure. DevOps

  7. Scegliere Aggiungi provider.

  8. Prendi nota dell'ARN del provider appena creato da utilizzare nell'attività successiva.

Per altri dettagli, vedi Come eseguire la federazione AWS da Azure usando DevOps OpenID Connect.

AWS DevOps

Crea una policy IAM in Account AWS.

Per creare una policy IAM che fornisca le autorizzazioni richieste al ruolo IAM usato dalla DevOps pipeline di Azure, usa i seguenti passaggi:

  1. Nella console IAM, nel riquadro a sinistra, scegli Policies.

  2. Scegliere Create Policy (Crea policy).

  3. Per Specificare le autorizzazioni, nell'editor delle politiche, seleziona JSON. Sostituisci la policy JSON predefinita con la seguente JSON:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Action": [ "ecr:*", "eks:DescribeCluster", "eks:ListClusters" ], "Resource": "*" } ] }
  4. Scegli Next (Successivo).

  5. Per il nome della policy, inserisci un nome per la policy IAM. Questo modello utilizza il nome ADO-Policy.

  6. Scegliere Create Policy (Crea policy).

AWS DevOps

Crea un ruolo IAM in Account AWS.

Per configurare un ruolo IAM nella Account AWS connessione al servizio Azure, usa i seguenti passaggi:

  1. Nella console IAM, nel riquadro a sinistra, scegli Ruoli.

  2. Scegliere Crea ruolo.

  3. Per il tipo di entità affidabile, seleziona Web Identity.

  4. Seleziona l'IdP corretto dall'elenco a discesa. Il nome IdP inizia con. vstoken.dev.azure.com/{OrganizationGUID}

  5. Nell'elenco a discesa Audience, seleziona api: ADToken //Azure Exchange.

  6. Per limitare questo ruolo a una sola connessione di servizio, aggiungi una condizione. In Condizione, seleziona Aggiungi condizione e per Chiave, seleziona vstoken.dev.azure.com/ {organizationGUID} :sub. StringEqualsIn Condizione, seleziona. Per Valore, usa il seguente formato:sc://{OrganizationName}/{ProjectName}/{ServiceConnectionName}. PerServiceConnectionName, usa aws-sc. Creerai questa connessione al servizio nella prossima attività.

  7. Scegli Next (Successivo).

  8. Per Aggiungi autorizzazioni, seleziona ADO-Policy, che è la politica che hai creato in un'attività precedente.

  9. Scegli Avanti e, per Nome del ruolo, inserisci ado-role. Per Select Trusted Entities, utilizza la seguente politica di fiducia:

{ "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}" } } } ] }

Nella politica, fornisci le tue informazioni per i seguenti segnaposto:

  • {account_id}- ID Account AWS

  • {OrganizationGUID}- GUID DevOps dell'organizzazione di Azure

  • {OrganizationName}- Nome dell'organizzazione di Azure DevOps

  • {ProjectName}- Nome del progetto Azure DevOps

  • {ServiceConnectionName}- Nome della connessione al DevOps servizio Azure. Usa aws-sc. Creerai questa connessione al servizio nella prossima attività.

AWS DevOps

Crea una connessione di servizio nell' DevOps account Azure.

Per configurare una connessione al servizio Azure, usa i seguenti passaggi:

  1. Nel tuo progetto Azure, seleziona Impostazioni DevOps del progetto, Connessioni ai servizi.

  2. Scegli Nuova connessione al servizio, seleziona il tipo di connessione al servizio comeaws, quindi seleziona Avanti.

  3. In Role to Assume, inserisci l'arn per il ruolo IAM ado-role. Hai creato un ruolo IAM nel task precedente. Crea un ruolo IAM in. Account AWS

  4. Seleziona la casella di controllo Usa OIDC.

  5. Per il nome della connessione al servizio, inserisci aws-sc nelle proprietà dell'attività.

  6. Scegli Save (Salva).

Per ulteriori dettagli, consulta Creare una connessione di servizio nella documentazione Microsoft.

AWS DevOps

Aggiungi il ruolo IAM al file di configurazione di Amazon EKS.

Il ruolo IAM deve disporre delle autorizzazioni necessarie per eseguire le operazioni richieste sul cluster Amazon EKS. Poiché si tratta di un ruolo di pipeline, il ruolo IAM deve essere in grado di gestire quasi tutti i tipi di risorse sul cluster. Pertanto, l'autorizzazione system:masters di gruppo è appropriata per questo ruolo.

Per aggiungere la configurazione richiesta all'aws-auth ConfigMapinterno di Kubernetes, usa il codice seguente:

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

Sostituiscilo {account_id} con il tuo ID. Account AWS

Per ulteriori informazioni, consulta Come funziona Amazon EKS con IAM nella documentazione di Amazon EKS.

AWS DevOps
AttivitàDescrizioneCompetenze richieste

Crea un pool di agenti ospitati autonomamente.

Per configurare un pool di agenti ospitati autonomamente nell' DevOps account Azure, usa i seguenti passaggi:

  1. Accedi all'organizzazione del tuo account Azure. DevOps

  2. Scegli Azure Organization. DevOps

  3. Scegli il tuo progetto Azure. DevOps

  4. Selezionare Project settings (Impostazioni del progetto).

  5. Scegli Agent pool.

  6. Scegli Aggiungi pool.

  7. Seleziona Self-hosted.

  8. Per Nome, inserisci eks-agent.

  9. Seleziona la casella di controllo Concedi l'autorizzazione di accesso a tutte le pipeline.

  10. Scegli Create (Crea).

Per ulteriori dettagli, consulta Creare e gestire pool di agenti nella documentazione Microsoft.

AttivitàDescrizioneCompetenze richieste

Crea un repository Amazon ECR.

Le immagini Docker utilizzate per distribuire l' DevOps agente Azure e l'applicazione di esempio (webapp) sul cluster Amazon EKS privato devono essere archiviate in un repository Amazon ECR. Per creare un repository Amazon ECR, utilizza i seguenti passaggi:

  1. Apri la console Amazon ECR nei https://console.aws.amazon.com/ecr/repository.

  2. Dalla barra di navigazione, scegli in cui Regione AWScreare il tuo repository.

  3. Nella pagina Repository, scegli Archivi privati, quindi scegli Crea repository.

  4. Per il nome del repository, inserisci webapp. Affinché l'applicazione di esempio in questo modello funzioni, il nome del repository Amazon ECR deve utilizzare webapp. Se utilizzi un nome diverso per il repository, consulta Risoluzione dei problemi.

Per ulteriori dettagli, consulta Creazione di un repository privato Amazon ECR per archiviare immagini nella documentazione di Amazon ECR.

AWS DevOps

Crea un Dockerfile per creare l'agente Azure DevOps .

Crea un Dockerfile per creare l'immagine Docker su cui è installato l'agente Azure. DevOps Archivia il seguente contenuto in un file denominato: 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

Crea script per l' DevOps agente di Azure.

Per creare lo start.sh script, usa i seguenti passaggi:

  1. Vai alla procedura Crea e crea il Dockerfile nella documentazione di Microsoft e scorri fino al passaggio 5. Salva il seguente contenuto in ~/azp-agent-in-docker/start.sh, assicurandoti di utilizzare terminazioni di riga in stile Unix (LF).

  2. Copia il contenuto dello script e salvalo in un file denominato start.sh nella stessa directory del Dockerfile.

AWS DevOps

Crea un'immagine Docker con l'agente Azure. DevOps

Per creare un'immagine Docker per installare l' DevOps agente di Azure, usa il Dockerfile che hai creato in precedenza per creare l'immagine. Nella stessa directory in cui è archiviato il Dockerfile, esegui i seguenti comandi:

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

Sostituisci aws_account_id e region con il tuo Account AWS ID e. Regione AWS

AWS DevOps
AttivitàDescrizioneCompetenze richieste

Genera un token di accesso personale di Azure.

L'agente in esecuzione sul cluster privato Amazon EKS richiede un token di accesso personale (PAT) per potersi autenticare con l'account Azure DevOps . Per generare un PAT, usa i seguenti passaggi:

  1. Accedi con l'account utente che intendi usare nella tua DevOps organizzazione Azure ()https://dev.azure.com/{Your_Organization}.

  1. Dalla tua home page, apri le impostazioni utente, quindi seleziona Token di accesso personali.

  2. Scegli Nuovo token.

  3. Inserisci il nome per il token.

  4. Scegli Mostra tutti gli ambiti.

  5. Per Agent Pools, seleziona la casella di controllo Leggi e gestisci.

  6. Scegli Create (Crea).

  7. Per creare un segreto sul cluster Amazon EKS privato, utilizza la seguente configurazione:

apiVersion: v1 kind: Secret metadata: name: azdevops-pat namespace: default type: Opaque stringData: AZP_TOKEN: <PAT Token>
  1. Memorizza la configurazione in un file denominatoado-secret.yaml. Sostituiscila <PAT Token> con il token di accesso personale che hai appena creato. Per creare il segreto, esegui il seguente comando:

kubectl create -f ado-secret.yaml

Per ulteriori dettagli, consulta Registrare un agente utilizzando un token di accesso personale (PAT) nella documentazione Microsoft.

AWS DevOps

Utilizza il file manifest di Kubernetes per la distribuzione degli agenti.

Per distribuire l' DevOps agente di Azure sul cluster privato Amazon EKS, copia il seguente file manifest e archivia il file come: 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: {}

Sostituisci aws_account_id e <Azure account URL> con il tuo Account AWS ID e l'URL dell'account Azure. DevOps

AWS DevOps

Implementa l'agente sul cluster privato Amazon EKS.

Per distribuire l'agente Azure Devops sul cluster privato Amazon EKS, usa il seguente comando:

kubectl create -f agent-deployment.tf
AWS DevOps

Verifica che l'agente sia in esecuzione.

Per verificare che l' DevOps agente di Azure sia in esecuzione, usa il seguente comando:

kubectl get deploy azure-pipelines-agent-eks

L'output previsto dovrebbe essere simile al seguente:

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

Assicurati che la READY colonna sia visualizzata1/1.

AWS DevOps

Verifica che l'agente sia registrato nel pool di DevOps agenti di Azure.

Per verificare che l'agente sia distribuito nel cluster privato Amazon EKS e sia registrato nel pool di agentieks-agent, utilizza i seguenti passaggi:

  1. Accedi alla tua DevOps organizzazione Azure ()https://dev.azure.com/{Your_Organization}.

  2. Selezionare Project settings (Impostazioni del progetto).

  3. Scegli Agent pool.

  4. Seleziona il pool eks-agent, quindi controlla la scheda Agenti.

Dovresti vedere un agente elencato con lo stato Online e il nome dell'agente dovrebbe iniziare con azure-pipelines-agent-eks -*.

AWS DevOps
AttivitàDescrizioneCompetenze richieste

Inserisci il repository di applicazioni di esempio nel tuo GitHub account.

Effettua il fork del seguente repository AWS di esempi sul tuo account: GitHub

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

AWS DevOps

Creare una pipeline.

Per creare una pipeline nel tuo DevOps account Azure, usa i seguenti passaggi:

  1. Accedi con l'account utente che intendi usare nella tua DevOps organizzazione Azure (). https://dev.azure.com/{Your_Organization}

  2. Accedi alla console del progetto e delle pipeline.

  3. Scegli New Pipeline.

  4. Per Dov'è il tuo codice, scegliGitHub.

  5. Fornisci le credenziali necessarie affinché la pipeline si connetta al tuo account GitHub

  6. Seleziona il repository deploy-kubernetes-resources-to - -devops. amazon-eks-using-azure

  7. Per Configura la pipeline, seleziona il file YAML di Azure Pipelines esistente.

  8. Per Seleziona un file YAML esistente, seleziona main per Branch e azure_pipelines.yaml per percorso.

  9. Scegli Continua.

  10. Per Review your pipeline YAML, sostituisci i valori dei parametri di input per e con le tue informazioni: awsRegion awsEKSClusterName

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. Scegli RUN.

AWS DevOps

Verifica che l'applicazione di esempio sia stata distribuita.

Una volta completata la pipeline, verifica la corretta implementazione dell'applicazione di esempio controllando sia il repository Amazon ECR che il cluster Amazon EKS.

Per verificare gli artefatti nel repository Amazon ECR, utilizza i seguenti passaggi:

  1. Accedi al repository webapp Amazon ECR.

  2. Conferma la presenza dei seguenti nuovi artefatti:

  • Immagine Docker: <date>.<build_number>-image

  • Diagramma di timone — <date>.<build_number>-helm

Ad esempio 20250501.1-image e 20250501.1-helm.

Per verificare la distribuzione sul cluster Amazon EKS privato nello spazio dei nomiwebapp, usa il seguente comando:

kubectl get deploy -n webapp

L'output previsto è il seguente:

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

Nota: se questa è la prima esecuzione della pipeline, potrebbe essere necessario autorizzare la connessione al servizio e il pool di agenti. Cerca le richieste di autorizzazione nell'interfaccia della DevOps pipeline di Azure e approvale per procedere.

AWS DevOps

Risoluzione dei problemi

ProblemaSoluzione

La pipeline fallisce quando il nome del repository Amazon ECR non corrisponde webapp

L'applicazione di esempio si aspetta che il nome del repository Amazon ECR corrisponda al projectName: webapp parametro in. azure_pipeline.yml

Per risolvere questo problema, rinomina il tuo repository Amazon ECR o aggiorna webapp quanto segue:

  • Rinomina la webapp directory nel tuo repository biforcato in modo che corrisponda al nome del tuo GitHub repository Amazon ECR.

  • Aggiorna il projectName parametro in azure_pipeline.yml modo che corrisponda al nome del tuo repository Amazon ECR.

Errore: cluster Kubernetes irraggiungibile: il server ha richiesto al client di fornire le credenziali

Se riscontri questo errore nella fase «Pull and Deploy Helm Chart» nella pipeline di Azure, la causa principale in genere deriva da una configurazione errata del ruolo IAM nel tuo cluster Amazon EKS. aws-auth ConfigMap

Per risolvere questo problema, controlla quanto segue:

  • Verifica la tua aws-auth ConfigMap configurazione.

  • Controlla le impostazioni di autenticazione del tuo cluster Amazon EKS: apri la console Amazon EKS, i dettagli del cluster, la configurazione di Access. Assicurati che la modalità di autenticazione sia impostata sull'API EKS e ConfigMap (non solo sull'API EKS).

Risorse correlate

AWS Blog

Servizi AWS documentazione

Documentazione Microsoft