Automatize a implantação do Manipulador do término do nó no Amazon EKS usando um pipeline de CI/CD - 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á.

Automatize a implantação do Manipulador do término do nó no Amazon EKS usando um pipeline de CI/CD

Criado por Sandip Gangapadhyay (AWS), John Vargas (AWS), Pragtideep Singh (AWS), Sandeep Gawande (AWS) e Viyoma Sachdeva (AWS)

Repositório de código: implante o NTH no EKS

Ambiente: produção

Tecnologias: contêineres e microsserviços; DevOps

Serviços da AWS: AWS CodePipeline; Amazon EKS; AWS CodeBuild

Resumo

Na Nuvem da Amazon Web Services (AWS), você pode usar o AWS Manipulador do término do nó, um projeto de código aberto, para lidar com o desligamento da instância do Amazon Elastic Compute Cloud (Amazon EC2) no Kubernetes sem problemas. O AWS Manipulador do término do nó ajuda a garantir que o ambiente de gerenciamento do Kubernetes responda adequadamente aos eventos que podem fazer com que sua instância do EC2 fique indisponível. Esses eventos incluem o seguinte:

Se um evento não for tratado, o código do aplicativo pode não parar normalmente. Também pode levar mais tempo para recuperar a disponibilidade total ou programar acidentalmente o trabalho nos nós que estão sendo desativados. O aws-node-termination-handler (NTH) pode operar em dois modos diferentes: serviço de metadados de instância (IMDS) ou Processador de filas. Para obter mais informações sobre os dois modos, consulte o arquivo Readme.

Esse padrão automatiza a implantação do NTH usando o Processador de Filas por meio de um pipeline de integração e entrega contínuas (CI/CD).

Nota: Se você estiver usando grupos de nós gerenciados pelo EKS, não precisará do aws-node-termination-handler.

Pré-requisitos e limitações

Pré-requisitos

  • Uma conta AWS ativa

  • Um navegador da web compatível com o Console de Gerenciamento da AWS. Consulte a lista de navegadores compatíveis.

  • AWS Cloud Development Kit (AWS CDK), instalado.

  • kubectl, a ferramenta de linha de comando do Kubernetes, instalada.

  • eksctl, a AWS Command Line Interface (AWS CLI) para o Amazon Elastic Kubernetes Service (Amazon EKS), instalado.

  • Um cluster EKS em execução com a versão 1.20 ou superior.

  • Um grupo de nós autogerenciados conectado ao cluster do EKS. Para criar um cluster do Amazon EKS com um grupo de nós autogerenciado, execute o comando a seguir.

    eksctl create cluster --managed=false --region <region> --name <cluster_name>

    Para obter mais informações sobre eksctl, consulte a documentação do eksctl.

  • AWS Identity and Access Management (IAM) provedor OpenID Connect (OIDC) para o seu cluster. Para obter mais informações, consulte Criar um provedor IAM OIDC para o cluster.

Limitações

  • Você deve usar uma região da AWS que ofereça suporte ao serviço Amazon EKS.

Versões do produto

  • Kubernetes versão 1.20 ou superior

  • eksctl versão 0.107.0 ou superior

  • AWS CDK versão 2.27.0 ou superior

Arquitetura

Pilha de tecnologias de destino

  • Uma nuvem privada virtual (VPC)

  • Um cluster do EKS

  • Amazon Simple Queue Service (Amazon SQS)

  • IAM

  • Kubernetes

Arquitetura de destino 

O diagrama a seguir mostra a visão de alto nível das end-to-end etapas em que a terminação do nó é iniciada.

Uma VPC com um grupo de Auto Scaling, um cluster EKS com Node Termination Handler e uma fila SQS.

O fluxo de trabalho mostrado no diagrama consiste nas seguintes etapas de alto nível:

  1. O evento de encerramento da instância do EC2 de escalabilidade automática é enviado para a fila SQS.

  2. O NTH Pod monitora novas mensagens na fila SQS.

  3. O NTH Pod recebe a nova mensagem e faz o seguinte:

    • Protege o nó para que o novo pod não seja executado no nó.

    • Drena o nó, para que o pod existente seja evacuado

    • Envia um sinal de gancho do ciclo de vida para o grupo do Auto Scaling para que o nó possa ser encerrado.

Automação e escala

Ferramentas

Serviços da AWS

  • O AWS Cloud Development Kit (AWS CDK) é uma estrutura de desenvolvimento de software que ajuda você a definir e provisionar a infraestrutura da Nuvem AWS em código.

  • CodeBuildA AWS é um serviço de criação totalmente gerenciado que ajuda você a compilar o código-fonte, executar testes unitários e produzir artefatos prontos para implantação.

  • CodeCommitA AWS é um serviço de controle de versão que ajuda você a armazenar e gerenciar repositórios Git de forma privada, sem precisar gerenciar seu próprio sistema de controle de origem.

  • CodePipelineA AWS ajuda você a modelar e configurar rapidamente os diferentes estágios de uma versão de software e automatizar as etapas necessárias para liberar alterações de software continuamente.

  • O Amazon Elastic Kubernetes Service (Amazon EKS) ajuda você a executar o Kubernetes na AWS sem precisar instalar e manter seus próprios nós ou ambiente de gerenciamento do Kubernetes.

  • Amazon EC2 Auto Scaling ajuda você a manter a disponibilidade do aplicativo e permite adicionar ou remover instâncias do Amazon EC2 automaticamente de acordo com as condições que você definir.

  • O Amazon Simple Queue Service (Amazon SQS) fornece uma fila hospedada segura, durável e disponível que ajuda a integrar e desacoplar sistemas e componentes de software distribuídos.

Outras ferramentas

  • Kubectl é uma ferramenta de linha de comando para executar comandos em clusters do Kubernetes. Você pode usar o kubectl para implantar aplicativos, inspecionar e gerenciar recursos de cluster e visualizar registros.

Código

O código desse padrão está disponível no deploy-nth-to-eksrepositório em GitHub .com. O repositório do código contém os seguintes arquivos e pastas.

  • nth folder— O gráfico do Helm, os arquivos de valores e os scripts para escanear e implantar o CloudFormation modelo da AWS para o Node Termination Handler.

  • config/config.json: o arquivo de parâmetros de configuração do aplicativo. Esse arquivo contém todos os parâmetros necessários para a implantação do CDK.

  • cdk: o código-fonte do AWS CDK.

  • setup.sh: o script usado para implantar o aplicativo AWS CDK para criar o pipeline de CI/CD necessário e outros recursos necessários.

  • uninstall.sh: o script usado para limpar os recursos.

Para usar o código de exemplo, siga as instruções na seção Épicos.

Práticas recomendadas

Para obter as melhores práticas ao automatizar o Manipulador do término do nó da AWS, consulte o seguinte:

Épicos

TarefaDescriçãoHabilidades necessárias

Clone o repositório.

Para clonar o repositório usando SSH (Secure Shell), execute o comando a seguir.

git clone git@github.com:aws-samples/deploy-nth-to-eks.git

Para clonar o repositório usando HTTPS, execute o comando a seguir.

git clone https://github.com/aws-samples/deploy-nth-to-eks.git

A clonagem do repositório cria uma pasta chamada deploy-nth-to-eks.

Mude para esse diretório.

cd deploy-nth-to-eks
Desenvolvedor de aplicativos, AWS DevOps, DevOps engenheiro

Defina o arquivo kubeconfig.

Defina as suas credenciais da AWS em seu terminal e confirme se você tem direitos para assumir a função de cluster. Você pode usar o seguinte exemplo de código.

aws eks update-kubeconfig --name <Cluster_Name> --region <region>--role-arn <Role_ARN>
AWS DevOps, DevOps engenheiro, desenvolvedor de aplicativos
TarefaDescriçãoHabilidades necessárias

Configure os parâmetros.

No arquivo config/config.json, configure os seguintes parâmetros necessários.

  • pipelineName: o nome do pipeline de CI/CD a ser criado pelo AWS CDK (por exemplo, deploy-nth-to-eks-pipeline). A AWS CodePipeline criará um pipeline com esse nome.

  • repositoryName: O CodeCommit repositório da AWS a ser criado (por exemplo,deploy-nth-to-eks-repo). O AWS CDK criará esse repositório e o definirá como origem para o pipeline de CI/CD.

    Observação: essa solução criará esse CodeCommit repositório e a ramificação (fornecida no parâmetro de ramificação a seguir).

  • branch: o nome da ramificação no repositório (por exemplo, main). Uma confirmação com essa ramificação iniciará o pipeline de CI/CD.

  • cfn_scan_script: o caminho do script que será usado para escanear o CloudFormation modelo da AWS para NTH (scan.sh). Esse script existe na nth pasta que fará parte do CodeCommit repositório da AWS.

  • cfn_deploy_script: O caminho do script que será usado para implantar o CloudFormation modelo da AWS para NTH (installApp.sh).

  • stackName: o nome da CloudFormation pilha a ser implantada.

  • eksClusterName: o nome do cluster existente do EKS.

  • eksClusterRole: o perfil do IAM que será usado para acessar o cluster EKS para todas as chamadas da API Kubernetes (por exemplo, clusteradmin). Normalmente, essa função é adicionada em aws-auth ConfigMap.

  • create_cluster_role: para criar o eksClusterRole perfil do IAM, digite sim. Se você quiser fornecer uma função de cluster existente no parâmetro eksClusterRole, digite não.

  • create_iam_oidc_provider: para criar um provedor de identidade OIDC do IAM para o cluster, insira sim. Se um provedor IAM OIDC já existir, digite não. Para obter mais informações, consulte Criar um provedor IAM OIDC para o cluster.

  • AsgGroupName: uma lista separada por vírgulas dos nomes de grupos do Auto Scaling que fazem parte do cluster EKS (por exemplo,) ASG_Group_1,ASG_Group_2.

  • region: o nome da região da AWS onde o cluster está localizado (por exemplo, us-east-2).

  • install_cdk: Se o AWS CDK não estiver instalado atualmente na máquina, digite sim. Execute o comando cdk --version para verificar se a versão instalada do AWS CDK é 2.27.0 ou superior. Nesse caso, digite não.

    Se você digitar sim, o script setup.sh executará o comando sudo npm install -g cdk@2.27.0 para instalar o AWS CDK na máquina. O script requer permissões sudo, portanto, forneça a senha da conta quando solicitado.

Desenvolvedor de aplicativos, AWS DevOps, DevOps engenheiro

Crie o pipeline de CI/CD para implantar o NTH.

Execute o script setup.sh.

./setup.sh

O script implantará o aplicativo AWS CDK que criará o CodeCommit repositório com o código de exemplo, o pipeline e os CodeBuild projetos com base nos parâmetros de entrada do usuário no config/config.json arquivo.

Esse script solicitará a senha ao instalar pacotes npm com o comando sudo.

Desenvolvedor de aplicativos, AWS DevOps, DevOps engenheiro

Analise o pipeline de CI/CD.

Abra o Console de Gerenciamento da AWS e analise os seguintes recursos criados na pilha.

  • CodeCommit repositório com o conteúdo da pasta nth

  • CodeBuild Projeto da AWScfn-scan, que examinará o CloudFormation modelo em busca de vulnerabilidades.

  • CodeBuild projetoNth-Deploy, que implantará o CloudFormation modelo da AWS e os gráficos NTH Helm correspondentes por meio do pipeline da AWS CodePipeline .

  • Um CodePipeline pipeline para implantar o NTH.

Depois que o pipeline é executado com sucesso, a versão aws-node-termination-handler do Helm é instalada no cluster EKS. Além disso, um pod chamado aws-node-termination-handler está sendo executado no namespace kube-system do cluster.

Desenvolvedor de aplicativos, AWS DevOps, DevOps engenheiro
TarefaDescriçãoHabilidades necessárias

Simule um evento de escalonamento de grupo do Auto Scaling.

Para simular um evento de escalonamento automático, faça o seguinte:

  1. No console da AWS, abra o console do EC2 e escolha grupos do Auto Scaling.

  2. Selecione o grupo do Auto Scaling que tem o mesmo nome do fornecido em config/config.json e escolha Editar.

  3. Diminua a capacidade desejada e mínima em 1.

  4. Selecione Atualizar.

Revise os registros.

Durante o evento de expansão, o NTH Pod isolará e drenará o nó de processamento correspondente (a instância do EC2 que será encerrada como parte do evento de expansão). Para verificar os registros, use o código na seção Informações adicionais.

Desenvolvedor de aplicativos, AWS DevOps, DevOps engenheiro
TarefaDescriçãoHabilidades necessárias

Limpe todos os recursos da AWS.

Para limpar os recursos criados por esse padrão, execute o comando a seguir.

./uninstall.sh

Isso limpará todos os recursos criados nesse padrão excluindo a CloudFormation pilha.

DevOps engenheiro

Solução de problemas

ProblemaSolução

O registro npm não está configurado corretamente.

Durante a instalação dessa solução, o script instala o npm install para baixar todos os pacotes necessários. Se, durante a instalação, você se deparar com uma mensagem que diz “Não é possível encontrar o módulo”, o registro npm pode não estar configurado corretamente. Para ver a configuração de registro atual, use o comando a seguir.

npm config get registry

Para definir o registro com https://registry.npmjs.org/, execute o seguinte comando.

npm config set registry https://registry.npmjs.org

Atrasar a entrega de mensagens do SQS.

Como parte da solução de problemas, se quiser atrasar a entrega da mensagem SQS para o NTH Pod, você pode ajustar o parâmetro de atraso na entrega do SQS. Para obter mais informações, consulte Filas de atraso do Amazon SQS.

Recursos relacionados

Mais informações

1. Encontre o nome do NTH Pod.

kubectl get pods -n kube-system |grep aws-node-termination-handler aws-node-termination-handler-65445555-kbqc7 1/1 Running 0 26m kubectl get pods -n kube-system |grep aws-node-termination-handler aws-node-termination-handler-65445555-kbqc7 1/1 Running 0 26m

2. Verificar os logs. Um log de exemplo se parece com o seguinte. Isso mostra que o nó foi isolado e drenado antes de enviar o sinal de conclusão do gancho do ciclo de vida do grupo do Auto Scaling.

kubectl -n kube-system logs aws-node-termination-handler-65445555-kbqc7 022/07/17 20:20:43 INF Adding new event to the event store event={"AutoScalingGroupName":"eksctl-my-cluster-target-nodegroup-ng-10d99c89-NodeGroup-ZME36IGAP7O1","Description":"ASG Lifecycle Termination event received. Instance will be interrupted at 2022-07-17 20:20:42.702 +0000 UTC \n","EndTime":"0001-01-01T00:00:00Z","EventID":"asg-lifecycle-term-33383831316538382d353564362d343332362d613931352d383430666165636334333564","InProgress":false,"InstanceID":"i-0409f2a9d3085b80e","IsManaged":true,"Kind":"SQS_TERMINATE","NodeLabels":null,"NodeName":"ip-192-168-75-60.us-east-2.compute.internal","NodeProcessed":false,"Pods":null,"ProviderID":"aws:///us-east-2c/i-0409f2a9d3085b80e","StartTime":"2022-07-17T20:20:42.702Z","State":""} 2022/07/17 20:20:44 INF Requesting instance drain event-id=asg-lifecycle-term-33383831316538382d353564362d343332362d613931352d383430666165636334333564 instance-id=i-0409f2a9d3085b80e kind=SQS_TERMINATE node-name=ip-192-168-75-60.us-east-2.compute.internal provider-id=aws:///us-east-2c/i-0409f2a9d3085b80e 2022/07/17 20:20:44 INF Pods on node node_name=ip-192-168-75-60.us-east-2.compute.internal pod_names=["aws-node-qchsw","aws-node-termination-handler-65445555-kbqc7","kube-proxy-mz5x5"] 2022/07/17 20:20:44 INF Draining the node 2022/07/17 20:20:44 ??? WARNING: ignoring DaemonSet-managed Pods: kube-system/aws-node-qchsw, kube-system/kube-proxy-mz5x5 2022/07/17 20:20:44 INF Node successfully cordoned and drained node_name=ip-192-168-75-60.us-east-2.compute.internal reason="ASG Lifecycle Termination event received. Instance will be interrupted at 2022-07-17 20:20:42.702 +0000 UTC \n" 2022/07/17 20:20:44 INF Completed ASG Lifecycle Hook (NTH-K8S-TERM-HOOK) for instance i-0409f2a9d3085b80e