Automatize a implantação do Manipulador do término do nó no Amazon EKS usando um pipeline de CI/CD - Recomendações da AWS

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

Sandip Gangapadhyay, Sandeep Gawande, Viyoma Sachdeva, Pragtideep Singh e John Vargas, Amazon Web Services

Resumo

Aviso: o AWS CodeCommit não está mais disponível para novos clientes. Os clientes atuais do AWS CodeCommit podem continuar usando o serviço normalmente. Saiba mais

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.

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

nota

Se você estiver usando grupos de nós gerenciados do EKS, não é necessário usar o 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 etapas de ponta a ponta quando a terminação do nó é iniciada.

Uma VPC com um grupo do Auto Scaling, um cluster do EKS com o Node Termination Handler e uma fila do 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.

  • O AWS CodeBuild é um serviço de compilação totalmente gerenciado que ajuda a compilar código-fonte, executar testes de unidade e produzir artefatos prontos para implantação.

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

  • O AWS CodePipeline ajuda você a modelar e configurar rapidamente os diferentes estágios de um lançamento de software e automatiza as etapas necessárias para lançar as alterações feitas continuamente no software.

  • 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 repositório deploy-nth-to-eks no GitHub.com. O repositório do código contém os seguintes arquivos e pastas.

  • nth folder: o chart do Helm, os arquivos de valores e os scripts para escanear e implantar o modelo do AWS CloudFormation para o Manipulador do término do nó.

  • 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, engenheiro de DevOps

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, engenheiro de DevOps, 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). O AWS CodePipeline criará um pipeline com esse nome.

  • repositoryName: o repositório do AWS CodeCommit 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.

    nota

    Com esta solução, serão criados o repositório do CodeCommit e a ramificação fornecida no parâmetro de ramificação apresentado 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 modelo do AWS CloudFormation para NTH (scan.sh). Esse script existe na pasta nth que fará parte do repositório do AWS CodeCommit.

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

  • stackName: o nome da pilha do CloudFormation 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, engenheiro de DevOps

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 repositório CodeCommit com código de exemplo, o pipeline e os projetos do CodeBuild com base nos parâmetros de entrada do usuário no arquivo config/config.json.

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

Desenvolvedor de aplicativos, AWS DevOps, engenheiro de DevOps

Analise o pipeline de CI/CD.

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

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

  • cfn-scan do projeto AWS CodeBuild, que examinará o modelo do CloudFormation em busca de vulnerabilidades.

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

  • Um pipeline do CodePipeline 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, engenheiro de DevOps
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, engenheiro de DevOps
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 pilha do CloudFormation.

Engenheiro de DevOps

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