Checkpointing de contenedores en Kubernetes con una API personalizada

Declaración del Problema

Desafío

Las organizaciones que ejecutan aplicaciones en contenedores en Kubernetes a menudo necesitan capturar y preservar el estado de los contenedores en ejecución para:

  • Recuperación ante desastres
  • Migración de aplicaciones
  • Depuración/resolución de problemas
  • Preservación del estado
  • Reproducción del entorno

Sin embargo, no hay una forma sencilla y automatizada de:

  1. Crear puntos de control de contenedores a pedido
  2. Almacenar estos puntos de control en un formato estandarizado
  3. Hacerlos fácilmente accesibles en todos los clústeres
  4. Disparar la creación de puntos de control a través de una interfaz estándar

Limitaciones Actuales

  • La creación manual de puntos de control requiere acceso directo al clúster
  • No hay un formato de almacenamiento estandarizado para los puntos de control
  • Integración limitada con registros de contenedores
  • Falta de acceso programático para la automatización
  • Coordinación compleja entre containerd y sistemas de almacenamiento

Solución

Un servicio auxiliar de Kubernetes que:

  1. Expone la funcionalidad de puntos de control a través de una API REST
  2. Convierte automáticamente los puntos de control en imágenes compatibles con OCI
  3. Almacena las imágenes en ECR para una distribución fácil
  4. Se integra con la infraestructura de Kubernetes existente
  5. Proporciona una interfaz estandarizada para la automatización

Esto resuelve los problemas principales mediante:

  • Automatizar el proceso de puntos de control
  • Estándarización del almacenamiento de checkpoints
  • Haciendo checkpoints portables
  • Facilitando el acceso programático
  • Simplificando la integración con flujos de trabajo existentes

Usuarios objetivo:

  • Equipos de DevOps
  • Ingenieros de plataforma
  • Desarrolladores de aplicaciones
  • Ingenieros de Confiabilidad del Sitio (SREs)

El checkpointing forense de contenedores se basa en Checkpoint/Restore In Userspace (CRIU) y permite la creación de copias con estado de un contenedor en ejecución sin que el contenedor se dé cuenta de que está siendo checkpointeado. La copia del contenedor puede ser analizada y restaurada en un entorno de sandbox múltiples veces sin que el contenedor original lo sepa. El checkpointing forense de contenedores se introdujo como una característica alfa en Kubernetes v1.25.

Este artículo te guiará sobre cómo implementar código en Golang que se puede utilizar para realizar un checkpoint de contenedor utilizando una API. 

El código toma un identificador de pod, recupera el ID del contenedor de containerd como entrada, y luego utiliza el comando ctr para realizar el checkpoint del contenedor específico en el espacio de nombres k8s.io de containerd:

Requisitos previos

  • Cluster de Kubernetes
  • Instale la herramienta de línea de comandos ctr. si puede ejecutar comandos ctr en el kubelet o en el nodo worker; si no, instale o ajuste la AMI para contener el ctr
  • kubectl configurado para comunicarse con su clúster
  • Docker instalado localmente
  • Acceso a un registro de contenedores (por ejemplo, Docker Hub, ECR)
  • Helm (para instalar el controlador de Ingress de Nginx)

Paso 0: Código para crear un punto de control de contenedor usando GO

Cree un archivo llamado checkpoint_container.go con el siguiente contenido:

Go

 

Paso 1: Inicialice el módulo de go

Shell

 

Modifique el archivo go.mod:

Go

 

Ejecute el siguiente comando:

Shell

 

Paso 2: Construir y Publicar la Imagen de Docker

Cree un Dockerfile en el mismo directorio:

Dockerfile

 

Este Dockerfile hace lo siguiente:

  1. Utiliza golang:1.20 como etapa de compilación para compilar su aplicación Go.
  2. Utiliza amazonlinux:2 como imagen base final.
  3. Instala AWS CLI, Docker (que incluye containerd), y skopeo usando yum y amazon-linux-extras.
  4. Copia el binario Go compilado de la etapa de compilación.
Shell

 

Reemplace <su-repositorio-docker> con su repositorio Docker real.

Paso 3: Aplicar los recursos RBAC

Cree un archivo llamado rbac.yaml:

YAML

 

Aplique los recursos RBAC:

Shell

 

Paso 4: Crear un despliegue de Kubernetes

Crea un archivo llamado deployment.yaml:

YAML

 

Aplica el despliegue:

Shell

 

En deployment.yaml, actualiza lo siguiente:

YAML

Paso 5: Servicio de Kubernetes

Crea un archivo llamado service.yaml:

YAML

 

Aplica el servicio:

Shell

 

Paso 6: Instalar el controlador de Ingress de Ngnix

Shell

 

Paso 7: Crear un recurso de Ingress

Crea un archivo llamado ingress.yaml:

YAML

 

Aplica el Ingress:

Shell

 

Paso 8: Probar la API

Shell

 

Shell

 

Reemplaza <EXTERNAL-IP> con la IP externa real.

Consideraciones adicionales

  1. Seguridad.
    • Implementar HTTPS configurando certificados TLS
    • Agregar autenticación a la API
  2. Monitoreo. Configurar el registro y monitoreo para la API y el proceso de punto de control.
  3. Administración de recursos. Configurar solicitudes y límites de recursos para el contenedor auxiliar.
  4. Manejo de errores. Implementar un manejo de errores sólido en la aplicación Go.
  5. Pruebas. Probar minuciosamente la configuración en un entorno no productivo antes de implementarla en producción.
  6. Documentación. Mantener una documentación clara sobre cómo utilizar la API de punto de control.

Conclusión

Esta configuración despliega el contenedor de checkpoint como un sidecar en Kubernetes y expone su funcionalidad a través de una API accesible desde fuera del clúster. Proporciona una solución flexible para gestionar checkpoints de contenedores en un entorno de Kubernetes.

Específico de AWS/EKS

Paso 7: Instalar el Controlador del Balanceador de Carga de AWS

En lugar de utilizar el Controlador de Ingress de Nginx, utilizaremos el Controlador del Balanceador de Carga de AWS. Este controlador creará y gestionará ALBs para nuestros recursos de Ingress.

1. Agregar el repositorio del gráfico de EKS a Helm:

Shell

 

2. Instalar el Controlador del Balanceador de Carga de AWS:

Shell

 

Sustituir <nombre-de-tu-clúster> con el nombre de tu clúster de EKS.

Nota: Asegúrate de tener configurados los permisos IAM necesarios para el Controlador del Balanceador de Carga de AWS. Puedes encontrar la política IAM detallada en la documentación de AWS.

Paso 8: Crear Recurso de Ingress

Crear un archivo llamado ingress.yaml:

YAML

 

Aplicar el Ingress:

Shell

 

Paso 9: Probar la API

1. Obtener el nombre DNS del ALB:

Shell

 

Buscar el campo DIRECCIÓN, que será el nombre DNS del ALB.

2. Enviar una solicitud de prueba:

Shell

 

Sustituir <NOMBRE-DNS-ALB> con el nombre DNS real de tu ALB del paso 1.

Consideraciones adicionales para AWS ALB

1. Grupos de seguridad. El ALB tendrá un grupo de seguridad creado automáticamente. Asegúrate de que permita tráfico entrante en el puerto 80 (y 443 si configuraste HTTPS).

2. SSL/TLS: Para habilitar HTTPS, puedes agregar las siguientes anotaciones a tu Ingress:

YAML

 

3. Registros de acceso. Habilita los registros de acceso para tu ALB agregando lo siguiente:

YAML

 

4. Integración de WAF. Si deseas utilizar AWS WAF con tu ALB, puedes agregar:

YAML

 

5. Autenticación. Puedes configurar la autenticación utilizando Amazon Cognito u OIDC mediante las anotaciones apropiadas del controlador de Ingress de ALB.

Estos cambios configurarán tu Ingress utilizando un Balanceador de Carga de Aplicaciones de AWS en lugar de Nginx. El Controlador de Ingress de ALB provisionará y configurará automáticamente el ALB en función de tu recurso de Ingress.

Conclusión

Recuerda asegurarte de que tu clúster de EKS tenga los permisos IAM necesarios para crear y gestionar ALBs. Esto generalmente implica crear una política IAM y una cuenta de servicio con los permisos adecuados.

Esta configuración ahora utilizará la solución de equilibrio de carga nativa de AWS, que se integra bien con otros servicios de AWS y puede ser más rentable en un entorno de AWS.

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