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 Amazon EKS.

Um endpoint público expõe o servidor da API 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 plano de controle 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

Arquitetura

Esse 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 a partir 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

TarefaDescriçãoHabilidades 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 no. 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 AWS Management Console e abra o console do IAM em https://console.aws.amazon.com/iam/.

  2. No painel esquerdo, 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 no 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 esquerdo, escolha Políticas.

  2. Escolha Create Policy.

  3. Em Especificar permissões, no editor de políticas, 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, insira um nome para a política do IAM. Esse padrão usa o nome ADO-Policy.

  6. Selecione Criar política.

AWS DevOps

Crie uma função do IAM no 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 esquerdo, escolha Roles.

  2. Selecione Criar perfil.

  3. Em Tipo de entidade confiável, selecione Identidade da 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 essa função 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. Para Valor, use o seguinte formato:sc://{OrganizationName}/{ProjectName}/{ServiceConnectionName}. ParaServiceConnectionName, 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 Avançar e, em Nome da função, insira ado-role. Para 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, use as seguintes etapas:

  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 eaws, em seguida, selecione Avançar.

  3. Em Role to Assume, insira o arn para a função do IAM ado-role. Você criou ado-role na tarefa anterior Crie uma função do IAM no Conta da AWS.

  4. Selecione 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 Criar uma conexão de serviço na documentação da Microsoft.

AWS DevOps

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

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

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

- 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
TarefaDescriçãoHabilidades 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 grupos 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 Criar e gerenciar grupos de agentes na documentação da Microsoft.

TarefaDescriçãoHabilidades 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 Amazon ECR, use as seguintes etapas:

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

  2. Na barra de navegação, escolha a opção Região da AWSpara criar 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 o aplicativo de amostra nesse padrão funcione, o nome do repositório 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 Criação de um repositório privado do Amazon ECR para armazenar imagens 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 conteúdo a seguir em um arquivo chamadoDockerfile:

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 start.sh script, use as seguintes etapas:

  1. Vá para o procedimento Criar e criar o Dockerfile na documentação da Microsoft e vá 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
TarefaDescriçãoHabilidades 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, 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}).

  1. Na sua página inicial, abra suas 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 grupos 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 chamadoado-secret.yaml. <PAT Token>Substitua 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 Registrar um agente usando um token de acesso pessoal (PAT) na documentação da Microsoft.

AWS DevOps

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

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 Azure Devops no cluster privado 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 à seguinte:

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

Certifique-se de que a READY coluna seja exibida1/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 agenteseks-agent, use as seguintes etapas:

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

  2. Escolha Configurações do projeto.

  3. Escolha grupos 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
TarefaDescriçãoHabilidades 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 dos 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. Para Configurar seu pipeline, selecione Arquivo YAML existente do Azure Pipelines.

  8. Em Selecionar um arquivo YAML existente, selecione main para Branch e azure_pipelines.yaml para path.

  9. Escolha Continuar.

  10. Em Revise o YAML do pipeline, substitua os valores dos parâmetros de entrada por 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 EXECUTAR.

AWS DevOps

Verifique se o aplicativo de amostra foi implantado.

Após a conclusão do pipeline, verifique a implantação bem-sucedida do aplicativo de amostra verificando o repositório Amazon ECR e o cluster Amazon EKS.

Para verificar artefatos no repositório Amazon ECR, use as seguintes etapas:

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

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

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

  • Gráfico do leme — <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 namespacewebapp, 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 de 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 Amazon ECR não corresponde webapp

O aplicativo de amostra espera que o nome do repositório Amazon ECR corresponda ao projectName: webapp parâmetro em. azure_pipeline.yml

Para resolver esse problema, renomeie seu repositório Amazon ECR ou webapp 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 projectName parâmetro azure_pipeline.yml para que corresponda ao nome do seu repositório Amazon ECR.

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

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

Para resolver esse problema, verifique o seguinte:

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

  • Verifique as configurações de autenticação do seu cluster 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