Checkpointing de Contêineres no Kubernetes com uma API Personalizada

Declaração do Problema

Desafio

Organizações que executam aplicativos em contêineres no Kubernetes frequentemente precisam capturar e preservar o estado dos contêineres em execução para:

  • Recuperação de desastres
  • Migração de aplicativos
  • Depuração/resolução de problemas
  • Preservação de estado
  • Reprodução de ambiente

No entanto, não há uma maneira direta e automatizada de:

  1. Criar checkpoints de contêineres sob demanda
  2. Armazenar esses checkpoints em um formato padronizado
  3. Torná-los facilmente acessíveis em clusters
  4. Desencadear a criação de checkpoints por meio de uma interface padrão

Limitações Atuais

  • A criação manual de checkpoints exige acesso direto ao cluster
  • Não há um formato de armazenamento padronizado para checkpoints
  • Integração limitada com registros de contêineres
  • Falta de acesso programático para automação
  • Coordenação complexa entre containerd e sistemas de armazenamento

Solução

Um serviço auxiliar do Kubernetes que:

  1. Expõe funcionalidade de checkpoint via API REST
  2. Converte automaticamente checkpoints em imagens compatíveis com OCI
  3. Armazena imagens no ECR para fácil distribuição
  4. Integra-se com a infraestrutura existente do Kubernetes
  5. Fornece uma interface padronizada para automação

Isso resolve os problemas principais por:

  • Automatizar o processo de checkpoint
  • Padronização do armazenamento de checkpoints
  • Tornando checkpoints portáteis
  • Permitindo acesso programático
  • Simplificando a integração com fluxos de trabalho existentes

Usuários-alvo:

  • Equipes de DevOps
  • Engenheiros de plataforma
  • Desenvolvedores de aplicativos
  • Engenheiros de Confiabilidade de Site (SREs)

O checkpoint forense de contêineres é baseado em Checkpoint/Restore In Userspace (CRIU) e permite a criação de cópias com estado de um contêiner em execução sem que o contêiner saiba que está sendo checkpointed. A cópia do contêiner pode ser analisada e restaurada em um ambiente de sandbox várias vezes sem que o contêiner original tenha conhecimento disso. O checkpoint forense de contêineres foi introduzido como um recurso alfa no Kubernetes v1.25.

Este artigo irá orientá-lo sobre como implantar código Golang que pode ser usado para realizar um checkpoint de contêiner usando uma API. 

O código recebe um identificador de pod, recupera o ID do contêiner do containerd como entrada e, em seguida, utiliza o comando ctr para fazer o checkpoint do contêiner específico no namespace k8s.io do containerd:

Pré-requisitos

  • Cluster Kubernetes
  • Instale a ferramenta ctr commandline. Se você puder executar comandos ctr no kubelet ou nó de trabalho; caso contrário, instale ou ajuste o AMI para conter o ctr.
  • kubectl configurado para se comunicar com seu cluster
  • O Docker instalado localmente
  • Acesso a um registro de contêineres (por exemplo, Docker Hub, ECR)
  • Helm (para instalar o Controlador de Ingresso Nginx)

Etapa 0: Código para Criar um Ponto de Verificação de Contêiner Usando GO

Crie um arquivo chamado checkpoint_container.go com o seguinte conteúdo:

Go

 

Etapa 1: Inicialize o Módulo go

Shell

 

Modifique o arquivo go.mod:

Go

 

Execute o seguinte comando:

Shell

 

Etapa 2: Construa e Publique a Imagem Docker

Crie um Dockerfile no mesmo diretório:

Dockerfile

 

Este Dockerfile faz o seguinte:

  1. Usa golang:1.20 como estágio de compilação para compilar sua aplicação Go.
  2. Usa amazonlinux:2 como imagem base final.
  3. Instala o AWS CLI, Docker (que inclui o containerd) e skopeo usando yum e amazon-linux-extras.
  4. Copia o binário Go compilado do estágio de compilação.
Shell

 

Substitua <seu-repositório-docker> pelo seu repositório Docker real.

Etapa 3: Aplique os recursos de RBAC

Crie um arquivo chamado rbac.yaml:

YAML

 

Aplique os recursos de RBAC:

Shell

 

Passo 4: Criar um Deployment Kubernetes

Crie um arquivo chamado deployment.yaml:

YAML

 

Aplique o deployment:

Shell

 

No arquivo deployment.yaml, atualize o seguinte:

YAML

Passo 5: Serviço Kubernetes

Crie um arquivo chamado service.yaml:

YAML

 

Aplique o serviço:

Shell

 

Passo 6: Instalar o Controlador de Ingress Ngnix

Shell

 

Passo 7: Criar Recurso de Ingress

Crie um arquivo chamado ingress.yaml:

YAML

 

Aplique o Ingress:

Shell

 

Passo 8: Testar a API

Shell

 

Shell

 

Substitua <EXTERNAL-IP> pelo IP externo real.

Considerações Adicionais

  1. Segurança.
    • Implementar HTTPS configurando certificados TLS
    • Adicionar autenticação à API
  2. Monitoramento. Configure o registro e monitoramento para a API e processo de checkpoint.
  3. Gerenciamento de Recursos. Configure solicitações e limites de recursos para o contêiner sidecar.
  4. Tratamento de Erros. Implemente um tratamento de erros robusto na aplicação Go.
  5. Testes. Teste minuciosamente a configuração em um ambiente não produtivo antes de implantá-lo em produção.
  6. Documentação. Mantenha uma documentação clara sobre como usar a API de checkpoint.

Conclusão

Esta configuração implanta o contêiner de verificação como um sidecar no Kubernetes e expõe sua funcionalidade por meio de uma API acessível de fora do cluster. Ele fornece uma solução flexível para gerenciar verificações de contêiner em um ambiente Kubernetes.

Específico do AWS/EKS

Passo 7: Instalar o Controlador de Balanceador de Carga da AWS

Em vez de usar o Controlador de Ingress do Nginx, iremos usar o Controlador de Balanceador de Carga da AWS. Este controlador criará e gerenciará ALBs para nossos recursos de Ingress.

1. Adicione o repositório de gráficos do EKS ao Helm:

Shell

 

2. Instale o Controlador de Balanceador de Carga da AWS:

Shell

 

Substitua <nome-do-seu-cluster> pelo nome do seu cluster EKS.

Observação: Certifique-se de que as permissões IAM necessárias estejam configuradas para o Controlador de Balanceador de Carga da AWS. Você pode encontrar a política IAM detalhada na documentação da AWS.

Passo 8: Criar Recurso de Ingress

Crie um arquivo chamado ingress.yaml:

YAML

 

Aplicar o Ingress:

Shell

 

Passo 9: Testar a API

1. Obter o nome DNS do ALB:

Shell

 

Procure pelo campo ENDEREÇO, que será o nome DNS do ALB.

2. Enviar uma solicitação de teste:

Shell

 

Substitua <NOME-DNS-ALB> pelo nome DNS real do seu ALB do passo 1.

Considerações adicionais para AWS ALB

1. Grupos de segurança. O ALB terá um grupo de segurança criado automaticamente. Certifique-se de que permite tráfego de entrada na porta 80 (e 443 se configurou HTTPS).

2. SSL/TLS: Para habilitar HTTPS, você pode adicionar as seguintes anotações ao seu Ingress:

YAML

 

3. Logs de acesso. Ative logs de acesso para seu ALB adicionando o seguinte:

YAML

 

4. Integração WAF. Se deseja usar AWS WAF com seu ALB, você pode adicionar:

YAML

 

5. Autenticação. Você pode configurar autenticação usando Amazon Cognito ou OIDC através das anotações apropriadas do controlador de Ingress do ALB.

Essas alterações configurarão seu Ingress usando um Balanceador de Carga de Aplicativo AWS em vez do Nginx. O Controlador de Ingress do ALB irá automaticamente provisionar e configurar o ALB com base no seu recurso de Ingress.

Conclusão

Lembre-se de garantir que seu cluster EKS tenha as permissões IAM necessárias para criar e gerenciar ALBs. Isso normalmente envolve criar uma política IAM e uma conta de serviço com as permissões apropriadas.

Essa configuração agora utilizará a solução de balanceamento de carga nativa da AWS, que se integra bem com outros serviços da AWS e pode ser mais econômica em um ambiente AWS.

Source:
https://dzone.com/articles/container-checkpointing-kubernetes-api