Implante cargas de trabalho dos DevOps pipelines do Azure em clusters privados do Amazon EKS - Recomendações da AWS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Implante cargas de trabalho dos DevOps pipelines do Azure em clusters privados do Amazon EKS

Mahendra Revanasiddappa, Amazon Web Services

Resumo

Esse padrão demonstra como implementar a integração contínua e a entrega contínua (CI/CD) dos DevOps pipelines do Azure para clusters privados do Amazon Elastic Kubernetes Service (Amazon EKS). Ele aborda um desafio crítico enfrentado por organizações que estão aprimorando sua postura de segurança ao fazer a transição para endpoints de servidor de API privados para seus clusters do Amazon EKS.

Um endpoint público expõe o servidor da API do Kubernetes diretamente à Internet, criando uma superfície de ataque maior que agentes mal-intencionados poderiam potencialmente atingir. Ao mudar para um endpoint privado, o acesso ao ambiente de gerenciamento do cluster é restrito à nuvem privada virtual (VPC) do cliente.

Embora a transição de um cluster Amazon EKS para um endpoint de API privado aumente significativamente a segurança, ela introduz desafios de conectividade para plataformas externas, como o Azure. CI/CD DevOps O endpoint privado só pode ser acessado de dentro da VPC ou das redes emparelhadas do cluster. Portanto, os DevOps agentes padrão do Azure hospedados pela Microsoft, operando fora da rede AWS privada, não podem acessar diretamente o servidor da API Kubernetes. Isso interrompe os fluxos de trabalho de implantação típicos que dependem de ferramentas como kubectl ou Helm executadas nesses agentes porque eles não conseguem estabelecer uma conexão com o cluster.

Para superar esse problema, esse padrão mostra uma abordagem eficiente usando DevOps agentes do Azure auto-hospedados em clusters privados do Amazon EKS. Essa solução oferece otimização de custos, eficiência operacional e escalabilidade superiores, preservando os requisitos de segurança. Essa abordagem beneficia particularmente as empresas que buscam otimizar seus DevOps processos multinuvem sem comprometer o desempenho ou a segurança.

Pré-requisitos e limitações

Pré-requisitos

Limitações

  • Alguns Serviços da AWS não estão disponíveis em todos Regiões da AWS. Para conferir a disponibilidade de uma região, consulte AWS Services by Region. Para endpoints específicos, consulte Service endpoints and quotas e clique no link correspondente ao serviço desejado.

Arquitetura

Este padrão cria o seguinte:

  • Repositório Amazon ECR — O repositório Amazon Elastic Container Registry (Amazon ECR) armazena a imagem do Docker com o agente do DevOps Azure e o aplicativo de amostra que é implantado.

  • Pool de DevOps agentes do Azure - Um pool de agentes DevOps auto-hospedado do Azure registra o agente em execução no cluster privado do Amazon EKS.

  • Função do IAM - Uma função AWS Identity and Access Management (IAM) da conexão de serviço do Azure para fornecer o acesso necessário ao agente que está sendo executado em um cluster privado do Amazon EKS.

  • Conexão DevOps de serviço do Azure - Uma conexão de serviço em uma DevOps conta do Azure para usar a função do IAM que fornece o acesso necessário para que os trabalhos do pipeline acessem Serviços da AWS.

O diagrama a seguir mostra a arquitetura da implantação de um DevOps agente do Azure auto-hospedado em um cluster privado do Amazon EKS e da implantação de um aplicativo de amostra no mesmo cluster.

Implantação do DevOps agente do Azure auto-hospedado e do aplicativo de amostra no cluster privado Amazon EKS.

O diagrama mostra o seguinte fluxo de trabalho:

  1. Implante um DevOps agente do Azure auto-hospedado como uma implantação dentro de um cluster Amazon EKS.

  2. Um DevOps agente do Azure se conecta ao pool de agentes em uma DevOps conta do Azure usando um token de acesso pessoal (PAT) para autenticação.

  3. O Azure Pipelines configura um pipeline para implantação usando o código de um GitHub repositório.

  4. O pipeline é executado no agente pelo do pool de agentes que foi configurado na configuração do pipeline. O DevOps agente do Azure obtém as informações do trabalho do pipeline fazendo pesquisas constantes na DevOps conta do Azure.

  5. O DevOps agente do Azure cria uma imagem do Docker como parte do trabalho do pipeline e envia a imagem para o repositório Amazon ECR.

  6. O DevOps agente do Azure implanta o aplicativo de amostra em um cluster privado do Amazon EKS em um namespace chamado. webapp

Ferramentas

Ferramentas

Outras ferramentas

  • O Docker é um conjunto de produtos de plataforma como serviço (PaaS) que usam a virtualização no nível do sistema operacional para fornecer software em contêineres.

  • kubectl é uma interface de linha de comando que ajuda você na execução de comandos em clusters do Kubernetes.

Repositório de código

Práticas recomendadas

Épicos

TarefaDescriptionHabilidades necessárias

Encontre o GUID da DevOps organização do Azure.

Entre na sua DevOps conta do Azure e use a seguinte URL para encontrar o GUID da organização: https://dev.azure.com/{DevOps_Org_ID}/_apis/projectCollections?api-version=6.0 Na URL, {DevOps_org_ID} substitua pela ID da DevOps organização do Azure.

AWS DevOps

Configure um IdP na Conta da AWS.

Para configurar um provedor de identidade (IdP) no Conta da AWS para uma conexão de serviço do Azure, use as seguintes etapas:

  1. Faça login no Console de gerenciamento da AWS e abra o console do IAM em https://console.aws.amazon.com/iam/.

  2. No painel à esquerda, escolha Provedores de identidade.

  3. Selecione Add Provider (Adicionar provedor).

  4. Escolha OpenID Connect como o Tipo de provedor.

  5. Em URL do provedor, insira a URL do DevOps emissor do Azure. Cada inquilino do Azure DevOps tem um exclusivo OrganizationGUID que normalmente usa o seguinte formato: https://vstoken.dev.azure.com/{OrganizationGUID} {OrganizationGUID} Substitua pelo ID DevOps da sua organização do Azure.

  6. Em Audience, insira api: //Azure ADToken Exchange. Esse é um valor fixo para o Azure DevOps.

  7. Selecione Add Provider (Adicionar provedor).

  8. Anote o ARN do provedor recém-criado para seu uso na próxima tarefa.

Para obter mais detalhes, consulte Como federar a AWS partir do Azure DevOps usando o OpenID Connect.

AWS DevOps

Crie uma política do IAM na Conta da AWS.

Para criar uma política do IAM para fornecer as permissões necessárias para a função do IAM usada pelo DevOps pipeline do Azure, use as seguintes etapas:

  1. No console do IAM, no painel à esquerda, escolha Políticas.

  2. Escolha Create Policy.

  3. Em Especificar permissões, no Editor de política, selecione JSON. Substitua a política JSON padrão pelo seguinte JSON:

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

  5. Em Nome da política, digite um nome para a política do IAM. Este padrão usa o nome ADO-policy.

  6. Selecione Criar política.

AWS DevOps

Crie um perfil do IAM na Conta da AWS.

Para configurar uma função do IAM na conexão Conta da AWS de serviço do Azure, use as seguintes etapas:

  1. No console do IAM, no painel à esquerda, selecione Perfis.

  2. Selecione Criar perfil.

  3. Em Tipo de entidade confiável, selecione Identidade Web.

  4. Selecione o IdP correto na lista suspensa. O nome do IdP começa com vstoken.dev.azure.com/{OrganizationGUID}.

  5. Na lista suspensa Audiência, selecione api: ADToken //Azure Exchange.

  6. Para limitar esse perfil a apenas uma conexão de serviço, adicione uma condição. Em Condição, selecione Adicionar condição e, em Chave, selecione vstoken.dev.azure.com/{OrganizationGUID}:sub. Em Condição, selecione StringEquals. Em Valor, use o seguinte formato: sc://{OrganizationName}/{ProjectName}/{ServiceConnectionName}. Em ServiceConnectionName, use aws-sc. Você criará essa conexão de serviço na próxima tarefa.

  7. Escolha Próximo.

  8. Em Adicionar permissões, selecione ADO-policy, que é a política que você criou em uma tarefa anterior.

  9. Escolha Próximo, e em Nome do perfil, insira ado-role. Em Selecionar entidades confiáveis, use a seguinte política de confiança:

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

Na política, forneça suas informações para os seguintes espaços reservados:

  • {account_id}- Conta da AWS IDENTIFICAÇÃO

  • {OrganizationGUID}- GUID DevOps da organização do Azure

  • {OrganizationName}- Nome DevOps da organização Azure

  • {ProjectName}- Nome do DevOps projeto Azure

  • {ServiceConnectionName}- Nome da conexão do DevOps serviço Azure. Use aws-sc. Você criará essa conexão de serviço na próxima tarefa.

AWS DevOps

Crie uma conexão de serviço na DevOps conta do Azure.

Para configurar uma conexão de serviço do Azure, siga as etapas abaixo:

  1. Em seu DevOps projeto do Azure, selecione Configurações do projeto, Conexões de serviço.

  2. Escolha Nova conexão de serviço, selecione o tipo de conexão de serviço como aws e, em seguida, selecione Próximo.

  3. Em Perfil a ser assumido, insira o arn para o perfil do IAM ado-role. Você criou ado-role na tarefa anterior Crie um perfil do IAM na Conta da AWS.

  4. Marque a caixa de seleção Usar OIDC.

  5. Em Nome da conexão de serviço, insira aws-sc nas propriedades da tarefa.

  6. Escolha Salvar.

Para obter mais detalhes, consulte Create a service connection na documentação da Microsoft.

AWS DevOps

Adicione o perfil do IAM ao arquivo de configuração do Amazon EKS.

O perfil do IAM deve ter permissões necessárias para executar as operações necessárias no cluster do Amazon EKS. Por ser uma função de pipeline, o perfil do IAM deve ser capaz de gerenciar quase todos os tipos de recursos no cluster. Portanto, a permissão do grupo system:masters é apropriada para esse perfil.

Para adicionar a configuração necessária a aws-auth ConfigMap no Kubernetes, use o seguinte código:

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

{account_id}Substitua pelo seu Conta da AWS ID.

Para obter mais informações, consulte Como o Amazon EKS funciona com o IAM na documentação do Amazon EKS.

AWS DevOps
TarefaDescriptionHabilidades necessárias

Crie um pool de agentes auto-hospedado.

Para configurar um pool de agentes auto-hospedado na DevOps conta do Azure, use as seguintes etapas:

  1. Entre na organização da sua DevOps conta do Azure.

  2. Escolha Azure DevOps Organization.

  3. Escolha seu DevOps projeto do Azure.

  4. Escolha Configurações do projeto.

  5. Escolha Pools de agentes.

  6. Escolha Adicionar pool.

  7. Selecione Auto-hospedado.

  8. Em Nome, insira eks-agent.

  9. Marque a caixa de seleção Conceder permissão de acesso a todos os pipelines.

  10. Escolha Criar.

Para obter mais detalhes, consulte Create and manage agent pools na documentação da Microsoft.

TarefaDescriptionHabilidades necessárias

Crie um repositório do Amazon ECR.

As imagens do Docker usadas para implantar o DevOps agente do Azure e o aplicativo de amostra (webapp) no cluster privado do Amazon EKS devem ser armazenadas em um repositório Amazon ECR. Para criar um repositório do Amazon ECR, siga as etapas abaixo:

  1. Abra o console do Amazon ECR nos https://console.aws.amazon.com/ecr/repositórios.

  2. Na barra de navegação, selecione a Região da AWS na qual criará o seu repositório.

  3. Na página Repositórios, escolha Repositórios privados e depois Criar repositório.

  4. Em Nome do repositório, insira webapp. Para que a aplicação de exemplo neste padrão funcione, o nome do repositório do Amazon ECR deve usar webapp. Se você usar um nome diferente para o repositório, consulte Solução de problemas.

Para obter mais detalhes, consulte Creating an Amazon ECR private repository to store images na documentação do Amazon ECR.

AWS DevOps

Crie um Dockerfile para criar o agente do Azure DevOps .

Crie um Dockerfile para criar a imagem do Docker que tem o agente do Azure DevOps instalado. Armazene o seguinte conteúdo em um arquivo chamado 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

Crie um script para o DevOps agente do Azure.

Para criar o script start.sh, siga as etapas abaixo:

  1. Vá para o procedimento Create and build the Dockerfile na documentação da Microsoft e navegue até a etapa 5. Salve o conteúdo a seguir em ~/azp-agent-in-docker/start.sh, certificando-se de usar terminações de linha no estilo UNIX (LF).

  2. Copie o conteúdo do script e salve-o em um arquivo chamado start.sh no mesmo diretório do Dockerfile.

AWS DevOps

Crie uma imagem do Docker com o DevOps agente do Azure.

Para criar uma imagem do Docker para instalar o DevOps agente do Azure, use o Dockerfile que você criou anteriormente para criar a imagem. No mesmo diretório em que o Dockerfile está armazenado, execute os seguintes comandos:

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

regionSubstitua aws_account_id e por seu Conta da AWS ID Região da AWS e.

AWS DevOps
TarefaDescriptionHabilidades necessárias

Gere um token de acesso pessoal do Azure.

O agente em execução no cluster privado do Amazon EKS requer um token de acesso pessoal (PAT) para que possa se autenticar com a conta do Azure DevOps . Para gerar um PAT, siga as etapas abaixo:

  1. Entre com a conta de usuário que você planeja usar na sua DevOps organização do Azure (https://dev.azure.com/{Your_Organization}).

  1. Na sua página inicial, abra as configurações de usuário e selecione Tokens de acesso pessoal.

  2. Escolha Novo token.

  3. Insira o Nome do token.

  4. Escolha Mostrar todos os escopos.

  5. Para Pools de agentes, marque a caixa de seleção Ler e gerenciar.

  6. Escolha Criar.

  7. Para criar um segredo no cluster privado do Amazon EKS, use a seguinte configuração:

apiVersion: v1 kind: Secret metadata: name: azdevops-pat namespace: default type: Opaque stringData: AZP_TOKEN: <PAT Token>
  1. Armazene a configuração em um arquivo chamado ado-secret.yaml. Substitua <PAT Token> pelo token de acesso pessoal que você acabou de criar. Para criar o segredo, execute o seguinte comando:

kubectl create -f ado-secret.yaml

Para obter mais detalhes, consulte Register an agent using a personal access token (PAT) na documentação da Microsoft.

AWS DevOps

Use o arquivo de manifesto do Kubernetes para a implantação de agentes.

Para implantar o DevOps agente do Azure no cluster privado do Amazon EKS, copie o seguinte arquivo de manifesto e armazene o arquivo comoagent-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: {}

Substitua aws_account_id e <Azure account URL> por sua Conta da AWS ID e URL DevOps da conta do Azure.

AWS DevOps

Implante o agente no cluster privado do Amazon EKS.

Para implantar o agente do Azure Devops no cluster privado do Amazon EKS, use o seguinte comando:

kubectl create -f agent-deployment.tf
AWS DevOps

Verifique se o agente está em execução.

Para verificar se o DevOps agente do Azure está em execução, use o seguinte comando:

kubectl get deploy azure-pipelines-agent-eks

A saída esperada deve ser semelhante ao seguinte:

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

Certifique-se de que a coluna READY mostre 1/1.

AWS DevOps

Verifique se o agente está registrado no pool de DevOps agentes do Azure.

Para verificar se o agente está implantado no cluster privado do Amazon EKS e está registrado no pool de agentes eks-agent, siga as etapas abaixo:

  1. Entre na sua DevOps organização do Azure (https://dev.azure.com/{Your_Organization}).

  2. Escolha Configurações do projeto.

  3. Escolha Pools de agentes.

  4. Selecione o pool eks-agent e, em seguida, verifique a guia Agentes.

Você deve ver um agente listado com o status Online e o nome do agente deve começar com azure-pipelines-agent-eks-*.

AWS DevOps
TarefaDescriptionHabilidades necessárias

Bifurque o repositório de aplicativos de amostra para sua GitHub conta.

Bifurque o seguinte repositório de AWS amostras para sua GitHub conta:

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

AWS DevOps

Crie um pipeline.

Para criar um pipeline na sua DevOps conta do Azure, use as seguintes etapas:

  1. Entre com a conta de usuário que você planeja usar na sua DevOps organização do Azure (https://dev.azure.com/{Your_Organization}).

  2. Navegue até o console do seu projeto e pipelines.

  3. Escolha New Pipeline.

  4. Em Onde está seu código, escolha GitHub.

  5. Forneça as credenciais necessárias para que o pipeline se conecte à sua conta GitHub

  6. Selecione o repositório deploy-kubernetes-resources-to- amazon-eks-using-azure -devops.

  7. Em Configure your pipeline, selecione Existing Azure Pipelines YAML file.

  8. Em Select an existing YAML file, selecione main para Branch e azure_pipelines.yaml para path.

  9. Escolha Continuar.

  10. Em Review your pipeline YAML, substitua os valores dos parâmetros de entrada awsRegion e awsEKSClusterName por suas informações:

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

AWS DevOps

Verifique se a aplicação de exemplo foi implantada.

Após a conclusão do pipeline, verifique se a implantação da aplicação de exemplo foi bem-sucedida conferindo o repositório do Amazon ECR e o cluster do Amazon EKS.

Para verificar artefatos no repositório do Amazon ECR, siga as etapas abaixo:

  1. Navegue até o repositório webapp do Amazon ECR.

  2. Confirme a presença dos seguintes novos artefatos:

  • Imagem do Docker: <date>.<build_number>-image

  • Chart do Helm: <date>.<build_number>-helm

Por exemplo, 20250501.1-image e 20250501.1-helm.

Para verificar a implantação no cluster privado do Amazon EKS no namespace webapp, use o seguinte comando:

kubectl get deploy -n webapp

A saída esperada é a seguinte:

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

Observação: se essa for sua primeira execução do pipeline, talvez seja necessário autorizar a conexão de serviço e o pool de agentes. Procure solicitações de permissão na interface do DevOps pipeline do Azure e aprove-as para continuar.

AWS DevOps

Solução de problemas

ProblemaSolução

O pipeline falha quando o nome do repositório do Amazon ECR não corresponde a webapp

A aplicação de exemplo espera que o nome do repositório do Amazon ECR corresponda ao parâmetro projectName: webapp em azure_pipeline.yml.

Para resolver esse problema, renomeie seu repositório do Amazon ECR para webapp ou atualize o seguinte:

  • Renomeie o webapp diretório em seu repositório bifurcado para corresponder ao nome do seu GitHub repositório Amazon ECR.

  • Atualize o parâmetro projectName em azure_pipeline.yml para que corresponda ao nome do seu repositório do Amazon ECR.

Erro: cluster do Kubernetes inacessível: o servidor solicitou que o cliente fornecesse credenciais

Se você encontrar esse erro na etapa “Pull and Deploy Helm Chart” no pipeline do Azure, a causa-raiz geralmente decorre de uma configuração incorreta do perfil do IAM no aws-auth ConfigMap do cluster do Amazon EKS.

Para resolver esse problema, verifique o seguinte:

  • Verifique sua configuração aws-auth ConfigMap.

  • Verifique as configurações de autenticação do seu cluster do Amazon EKS: abra o console do Amazon EKS, Detalhes do cluster, Configuração de acesso. Certifique-se de que o modo de autenticação esteja definido como API EKS e ConfigMap (não apenas API EKS).

Recursos relacionados

AWS Blogs

Serviços da AWS documentação

Documentação da Microsoft