

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 Node Termination Handler no Amazon EKS usando um pipeline CI/CD
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline"></a>

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

## Resumo
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-summary"></a>

**Aviso**: CodeCommit A AWS não está mais disponível para novos clientes. Os clientes atuais da AWS CodeCommit podem continuar usando o serviço normalmente. [Saiba mais](https://aws.amazon.com/blogs/devops/how-to-migrate-your-aws-codecommit-repository-to-another-git-provider/)

Na nuvem da Amazon Web Services (AWS), você pode usar o [AWS Node Termination Handler](https://github.com/aws/aws-node-termination-handler), um projeto de código aberto, para lidar com o desligamento de instâncias do Amazon Elastic Compute Cloud (Amazon EC2) no Kubernetes sem problemas. O AWS Node Termination Handler ajuda a garantir que o plano de controle do Kubernetes responda adequadamente aos eventos que podem fazer com que sua instância fique indisponível. EC2 Esses eventos incluem o seguinte:
+ [EC2 manutenção programada por instância](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instances-status-check_sched.html)
+ [Interrupções da Amazon EC2 Spot Instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-interruptions.html)
+ [Escala de grupos do Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/AutoScalingGroupLifecycle.html#as-lifecycle-scale-in)
+ [Rebalanceamento de grupos do Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/auto-scaling-benefits.html#AutoScalingBehavior.InstanceUsage) em todas as zonas de disponibilidade
+ EC2 encerramento da instância por meio da API ou do AWS Management Console

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](https://github.com/aws/aws-node-termination-handler#readme).

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

**nota**  
Se você estiver usando [grupos de nós gerenciados do EKS](https://docs.aws.amazon.com/eks/latest/userguide/managed-node-groups.html), não é necessário usar o `aws-node-termination-handler`.

## Pré-requisitos e limitações
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-prereqs"></a>

**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](https://aws.amazon.com/premiumsupport/knowledge-center/browsers-management-console/).
+ AWS Cloud Development Kit (AWS CDK), [instalado](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install).
+ `kubectl`, a ferramenta de linha de comando do Kubernetes, [instalada](https://kubernetes.io/docs/tasks/tools/).
+ `eksctl`, a AWS Command Line Interface (AWS CLI) para o Amazon Elastic Kubernetes Service (Amazon EKS), [instalado](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html).
+ 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](https://eksctl.io/usage/creating-and-managing-clusters/).
+ 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](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html).

**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
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-architecture"></a>

**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 do Auto Scaling, um cluster do EKS com o Node Termination Handler e uma fila do SQS.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/970dfb73-9526-4942-a974-e8eef6416596/images/9e0125ae-d55b-49dd-ae70-ccaedf03832a.png)


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

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

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

1. 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**
+ O código é gerenciado e implantado pelo AWS CDK, apoiado por pilhas CloudFormation aninhadas da AWS.
+ O [ambiente de gerenciamento do Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/disaster-recovery-resiliency.html) é executado em várias zonas de disponibilidade para assegurar alta disponibilidade.
+ [Para [escalabilidade automática, o](https://docs.aws.amazon.com/eks/latest/userguide/autoscaling.html) Amazon EKS oferece suporte ao Kubernetes [Cluster](https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler) Autoscaler e ao Karpenter](https://karpenter.sh/).

## Ferramentas
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-tools"></a>

**Serviços da AWS**
+ O [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) é uma estrutura de desenvolvimento de software que ajuda você a definir e provisionar a infraestrutura da Nuvem AWS em código.
+  CodeBuildA [AWS](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) é 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](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) é 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](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) 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)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) ajuda você a executar o Kubernetes na AWS sem precisar instalar e manter seus próprios nós ou ambiente de gerenciamento do Kubernetes.
+ [O Amazon EC2 Auto Scaling](https://docs.aws.amazon.com/autoscaling/ec2/userguide/what-is-amazon-ec2-auto-scaling.html) ajuda você a manter a disponibilidade do aplicativo e permite que você adicione ou remova automaticamente EC2 instâncias da Amazon de acordo com as condições definidas por você.
+ O [Amazon Simple Queue Service (Amazon SQS)](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) 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](https://kubernetes.io/docs/reference/kubectl/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-eks](https://github.com/aws-samples/deploy-nth-to-eks)repositó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 CI/CD pipeline 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
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-best-practices"></a>

Para obter as melhores práticas ao automatizar o Manipulador do término do nó da AWS, consulte o seguinte:
+ [Guias de melhores práticas do EKS](https://aws.github.io/aws-eks-best-practices/)
+ [Manipulador do término do nó - Configuração](https://github.com/aws/aws-node-termination-handler/tree/main/config/helm/aws-node-termination-handler)

## Épicos
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-epics"></a>

### Configurar o ambiente
<a name="set-up-your-environment"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Clone o repositório. | Para clonar o repositório usando SSH (Secure Shell), execute o comando a seguir.<pre>git clone git@github.com:aws-samples/deploy-nth-to-eks.git</pre>Para clonar o repositório usando HTTPS, execute o comando a seguir.<pre>git clone https://github.com/aws-samples/deploy-nth-to-eks.git</pre>A clonagem do repositório cria uma pasta chamada `deploy-nth-to-eks`.Mude para esse diretório.<pre>cd deploy-nth-to-eks</pre> | 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.<pre>aws eks update-kubeconfig --name <Cluster_Name> --region <region>--role-arn <Role_ARN></pre> | AWS DevOps, DevOps engenheiro, desenvolvedor de aplicativos | 

### Implante o CI/CD pipeline
<a name="deploy-the-ci-cd-pipeline"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Configure os parâmetros. | No arquivo `config/config.json`, configure os seguintes parâmetros necessários.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html) | Desenvolvedor de aplicativos, AWS DevOps, DevOps engenheiro | 
| Crie o CI/CD pipeline para implantar o NTH. | Execute o script setup.sh.<pre>./setup.sh</pre>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 | 
| Revise o CI/CD pipeline. | Abra o Console de Gerenciamento da AWS e analise os seguintes recursos criados na pilha.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html)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 | 

### Teste a implantação do NTH
<a name="test-nth-deployment"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Simule um evento de escalonamento de grupo do Auto Scaling. | Para simular um evento de escalonamento automático, faça o seguinte:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline.html) |  | 
| Revise os registros. | Durante o evento de expansão, o NTH Pod isolará e drenará o nó de trabalho correspondente (a EC2 instância 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 | 

### Limpeza
<a name="clean-up"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Limpe todos os recursos da AWS. | Para limpar os recursos criados por esse padrão, execute o comando a seguir.<pre>./uninstall.sh</pre>Isso limpará todos os recursos criados nesse padrão excluindo a CloudFormation pilha. | DevOps engenheiro | 

## Solução de problemas
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-troubleshooting"></a>


| Problema | Soluçã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.<pre>npm config get registry</pre>Para definir o registro com `https://registry.npmjs.org/`, execute o seguinte comando.<pre>npm config set registry https://registry.npmjs.org</pre> | 
| 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](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html). | 

## Recursos relacionados
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-resources"></a>
+ [Código-fonte do Manipulador do término do nó da AWS](https://github.com/aws/aws-node-termination-handler)
+ [EC2 oficina](https://ec2spotworkshops.com/using_ec2_spot_instances_with_eks/070_selfmanagednodegroupswithspot/deployhandler.html)
+ [AWS CodePipeline](https://aws.amazon.com/codepipeline/)
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://aws.amazon.com/eks/)
+ [Kit de desenvolvimento da Nuvem AWS](https://aws.amazon.com/cdk/)
+ [AWS CloudFormation](https://aws.amazon.com/cloudformation/)

## Mais informações
<a name="automate-deployment-of-node-termination-handler-in-amazon-eks-by-using-a-ci-cd-pipeline-additional"></a>

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
```