Checkpoint de Contêineres no Kubernetes com uma API Personalizada

Declaração do Problema

Desafio

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

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

No entanto, não existe uma maneira simples e automatizada de:

  1. Criar pontos de verificação de contêiner sob demanda
  2. Armazenar esses pontos de verificação em um formato padronizado
  3. Torná-los facilmente acessíveis entre clusters
  4. Acionar o ponto de verificação através de uma interface padrão

Limitações Atuais

  • A criação manual de pontos de verificação requer acesso direto ao cluster
  • Não há um formato de armazenamento padronizado para pontos de verificação
  • 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 sidecar do Kubernetes que:

  1. Exponha a funcionalidade de ponto de verificação via API REST
  2. Converta automaticamente os pontos de verificação em imagens compatíveis com OCI
  3. Armazene imagens no ECR para fácil distribuição
  4. Integre-se à infraestrutura existente do Kubernetes
  5. Forneça uma interface padronizada para automação

Isso resolve os problemas centrais ao:

  • Automatizar o processo de ponto de verificação
  • Padronizando armazenamento de checkpoints
  • Tornando checkpoints portáteis
  • Permitindo acesso programático
  • Simplificando integração com fluxos de trabalho existentes

Usuários-alvo:

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

O checkpoint de contêiner forense é 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 várias vezes em um ambiente de sandbox sem que o contêiner original tenha conhecimento disso. O checkpoint de contêiner forense foi introduzido como um recurso alfa no Kubernetes v1.25.

Este artigo irá guiá-lo sobre como implantar código Golang que pode ser usado para fazer 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, usa 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ê conseguir executar comandos ctr no kubelet ou no nó de trabalho; se não, instale ou ajuste a AMI para contener o ctr.
  • kubectl configurado para se comunicar com seu cluster
  • Docker instalado localmente
  • Acesso a um registro de contêiner (por exemplo, Docker Hub, ECR)
  • Helm (para instalar o Nginx Ingress Controller)

Passo 0: Código para Criar Checkpoint de Contêiner Usando GO

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

Go

 

Passo 1: Inicialize o módulo go

Shell

 

Modifique o arquivo go.mod:

Go

 

Execute o seguinte comando:

Shell

 

Passo 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 a fase de construção para compilar seu aplicativo Go.
  2. Usa amazonlinux:2 como a imagem base final.
  3. Instala o AWS CLI, Docker (que inclui containerd) e skopeo usando yum e amazon-linux-extras.
  4. Copia o binário Go compilado da fase de construção.
Shell

 

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

Passo 3: Aplique os recursos RBAC

Crie um arquivo chamado rbac.yaml:

YAML

 

Aplicar os recursos 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 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.
    • Implemente HTTPS configurando certificados TLS
    • Adicione autenticação à API
  2. Monitoramento. Configure log 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 tratamento de erros robusto na aplicação Go.
  5. Testes. Teste minuciosamente a configuração em um ambiente não de produção antes de implantá-la na produção.
  6. Documentação. Mantenha uma documentação clara sobre como usar a API de checkpoint.

Conclusão

Esta configuração implanta o container de checkpoint 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 checkpoints de contêiner em um ambiente Kubernetes.

Específico do AWS/EKS

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

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

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

Shell

 

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

Shell

 

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

Nota: Certifique-se de ter as permissões IAM necessárias configuradas para o Controlador do 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

 

Aplique o Ingress:

Shell

 

Passo 9: Testar a API

1. Obtenha o nome do DNS do ALB:

Shell

 

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

2. Envie uma solicitação de teste:

Shell

 

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

Considerações Adicionais para o AWS ALB

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

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

YAML

 

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

YAML

 

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

YAML

 

5. Autenticação. Você pode configurar a autenticação usando o Amazon Cognito ou OIDC usando as anotações apropriadas do Controlador de Ingress do ALB.

Essas alterações configurarão seu Ingress usando um Balanceador de Carga de Aplicativo da AWS em vez do Nginx. O Controlador de Ingress do ALB provisionará e configurará automaticamente 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 geralmente envolve a criação de uma política IAM e uma conta de serviço com as permissões adequadas.

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

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