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ó
Rebalanceamento de grupos do Auto Scaling em todas as zonas de disponibilidade
Encerramento da instância do EC2 por meio da API ou do Console de Gerenciamento da AWS
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 superiorAWS 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.](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:
O evento de encerramento da instância do EC2 de escalabilidade automática é enviado para a fila SQS.
O NTH Pod monitora novas mensagens na fila SQS.
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 é executado em várias zonas de disponibilidade para assegurar alta disponibilidade.
Para escalabilidade automática, o Amazon EKS oferece suporte ao Kubernetes Cluster
Autoscaler e ao Karpenter .
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-eks
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
Tarefa | Descrição | Habilidades necessárias |
---|---|---|
Clone o repositório. | Para clonar o repositório usando SSH (Secure Shell), execute o comando a seguir.
Para clonar o repositório usando HTTPS, execute o comando a seguir.
A clonagem do repositório cria uma pasta chamada Mude para esse diretório.
| 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 DevOps, DevOps engenheiro, desenvolvedor de aplicativos |
Tarefa | Descrição | Habilidades necessárias |
---|---|---|
Configure os parâmetros. | No arquivo
| Desenvolvedor de aplicativos, AWS DevOps, DevOps engenheiro |
Crie o pipeline de CI/CD para implantar o NTH. | Execute o script 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 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.
Depois que o pipeline é executado com sucesso, a versão | Desenvolvedor de aplicativos, AWS DevOps, DevOps engenheiro |
Tarefa | Descrição | 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:
| |
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 |
Tarefa | Descrição | Habilidades necessárias |
---|---|---|
Limpe todos os recursos da AWS. | Para limpar os recursos criados por esse padrão, execute o comando a seguir.
Isso limpará todos os recursos criados nesse padrão excluindo a CloudFormation pilha. | DevOps engenheiro |
Solução de problemas
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.
Para definir o registro com
|
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