Checkpointing des conteneurs dans Kubernetes avec une API personnalisée

Énoncé du problème

Défi

Les organisations qui exécutent des applications conteneurisées dans Kubernetes ont souvent besoin de capturer et de préserver l’état des conteneurs en cours d’exécution pour :

  • La reprise après sinistre
  • La migration d’application
  • Le débogage/le dépannage
  • La préservation de l’état
  • La reproduction de l’environnement

Cependant, il n’existe pas de moyen direct et automatisé pour :

  1. Créer des points de contrôle de conteneurs à la demande
  2. Stocker ces points de contrôle dans un format normalisé
  3. Les rendre facilement accessibles à travers les clusters
  4. Déclencher la création de points de contrôle via une interface standard

Limitations actuelles

  • La création manuelle de points de contrôle nécessite un accès direct au cluster
  • Aucun format de stockage normalisé pour les points de contrôle
  • Intégration limitée avec les registres de conteneurs
  • Manque d’accès programmatique pour l’automatisation
  • Coordination complexe entre containerd et les systèmes de stockage

Solution

Un service auxiliaire Kubernetes qui :

  1. Expose la fonctionnalité de points de contrôle via une API REST
  2. Convertit automatiquement les points de contrôle en images conformes à OCI
  3. Stocke les images dans ECR pour une distribution facile
  4. S’intègre à l’infrastructure Kubernetes existante
  5. Fournit une interface normalisée pour l’automatisation

Cela résout les problèmes essentiels en :

  • Automatisant le processus de point de contrôle
  • Normalisation du stockage des checkpoints
  • Rendre les checkpoints portables
  • Activation de l’accès programmatique
  • Simplification de l’intégration avec les flux de travail existants

Utilisateurs cibles :

  • Équipes DevOps
  • Ingénieurs de plateforme
  • Développeurs d’applications
  • Ingénieurs de fiabilité des sites (SRE)

La prise de checkpoints des conteneurs forensiques est basée sur Checkpoint/Restore In Userspace (CRIU) et permet de créer des copies étatiques d’un conteneur en cours d’exécution sans que le conteneur ne sache qu’il est en cours de checkpoint. La copie du conteneur peut être analysée et restaurée plusieurs fois dans un environnement sandbox sans que le conteneur d’origine en soit conscient. La prise de checkpoints des conteneurs forensiques a été introduite en tant que fonctionnalité alpha dans Kubernetes v1.25.

Cet article vous guidera sur la manière de déployer du code Golang qui peut être utilisé pour prendre un checkpoint de conteneur en utilisant une API.

Le code prend un identifiant de pod, récupère l’ID du conteneur à partir de containerd en tant qu’entrée, puis utilise la commande ctr pour prendre le checkpoint spécifique du conteneur dans l’espace de noms k8s.io de containerd :

Prérequis

  • Cluster Kubernetes
  • Installez l’outil en ligne de commande ctr. Si vous pouvez exécuter des commandes ctr sur le kubelet ou le nœud worker; sinon, installez ou ajustez l’AMI pour contenir le ctr
  • kubectl configuré pour communiquer avec votre cluster
  • Docker installé localement
  • Accès à un registre de conteneurs (par exemple, Docker Hub, ECR)
  • Helm (pour installer le contrôleur d’ingress Nginx)

Étape 0 : Code pour créer un point de contrôle de conteneur en utilisant GO

Créez un fichier nommé checkpoint_container.go avec le contenu suivant :

Go

 

Étape 1 : Initialiser le module Go

Shell

 

Modifiez le fichier go.mod :

Go

 

Exécutez la commande suivante :

Shell

 

Étape 2 : Construire et publier l’image Docker

Créez un Dockerfile dans le même répertoire :

Dockerfile

 

Ce Dockerfile fait ce qui suit :

  1. Utilise golang:1.20 comme étape de construction pour compiler votre application Go.
  2. Utilise amazonlinux:2 comme image de base finale.
  3. Installe l’AWS CLI, Docker (qui inclut containerd) et skopeo en utilisant yum et amazon-linux-extras.
  4. Copie le binaire Go compilé depuis l’étape de construction.
Shell

 

Remplacez <votre-docker-repo> par votre dépôt Docker réel.

Étape 3 : Appliquer les ressources RBAC

Créez un fichier nommé rbac.yaml :

YAML

 

Appliquez les ressources RBAC :

Shell

 

Étape 4 : Créer un déploiement Kubernetes

Créez un fichier nommé deployment.yaml:

YAML

 

Appliquez le déploiement:

Shell

 

Dans deployment.yaml, mettez à jour ce qui suit:

YAML

Étape 5 : Service Kubernetes

Créez un fichier nommé service.yaml:

YAML

 

Appliquez le service:

Shell

 

Étape 6 : Installer le contrôleur Ngnix Ingress

Shell

 

Étape 7 : Créer la ressource Ingress

Créez un fichier nommé ingress.yaml:

YAML

 

Appliquez l’Ingress:

Shell

 

Étape 8 : Tester l’API

Shell

 

Shell

 

Remplacez <EXTERNAL-IP> par l’adresse IP externe réelle.

Considérations supplémentaires

  1. Sécurité.
    • Mettre en place HTTPS en configurant des certificats TLS
    • Ajouter une authentification à l’API
  2. Surveillance. Mettre en place le suivi des journaux et de la surveillance pour l’API et le processus de point de contrôle.
  3. Gestion des ressources. Configurer les demandes de ressources et les limites pour le conteneur auxiliaire.
  4. Gestion des erreurs. Mettre en place une gestion d’erreurs robuste dans l’application Go.
  5. Tests. Tester rigoureusement la configuration dans un environnement non productif avant de la déployer en production.
  6. Documentation. Maintenir une documentation claire sur l’utilisation de l’API de point de contrôle.

Conclusion

Cette configuration déploie le conteneur de checkpoint en tant que sidecar dans Kubernetes et expose sa fonctionnalité via une API accessible depuis l’extérieur du cluster. Cela fournit une solution flexible pour gérer les checkpoints de conteneurs dans un environnement Kubernetes.

Spécifique à AWS/EKS

Étape 7 : Installer le contrôleur de répartiteur de charge AWS

Au lieu d’utiliser le contrôleur d’entrée Nginx, nous utiliserons le contrôleur de répartiteur de charge AWS. Ce contrôleur créera et gérera des ALB pour nos ressources d’entrée.

1. Ajouter le référentiel de chart EKS à Helm :

Shell

 

2. Installer le contrôleur de répartiteur de charge AWS :

Shell

 

Remplacez <votre-nom-de-cluster> par le nom de votre cluster EKS.

Remarque : Assurez-vous d’avoir les autorisations IAM nécessaires configurées pour le contrôleur de répartiteur de charge AWS. Vous pouvez trouver la politique IAM détaillée dans la documentation AWS.

Étape 8 : Créer la ressource Ingress

Créez un fichier nommé ingress.yaml :

YAML

 

Appliquez l’Ingress :

Shell

 

Étape 9 : Tester l’API

1. Obtenez le nom DNS de l’ALB :

Shell

 

Recherchez le champ ADRESSE, qui sera le nom DNS de l’ALB.

2. Envoyez une requête de test :

Shell

 

Remplacez <NOM-DNS-ALB> par le nom DNS réel de votre ALB de l’étape 1.

Considérations supplémentaires pour AWS ALB

1. Groupes de sécurité. L’ALB aura un groupe de sécurité créé automatiquement. Assurez-vous qu’il autorise le trafic entrant sur le port 80 (et 443 si vous configurez HTTPS).

2. SSL/TLS: Pour activer HTTPS, vous pouvez ajouter les annotations suivantes à votre Ingress:

YAML

 

3. Journaux d’accès. Activez les journaux d’accès pour votre ALB en ajoutant ceci:

YAML

 

4. Intégration WAF. Si vous souhaitez utiliser AWS WAF avec votre ALB, vous pouvez ajouter ceci:

YAML

 

5. Authentification. Vous pouvez configurer l’authentification en utilisant Amazon Cognito ou OIDC en utilisant les annotations appropriées du contrôleur ALB Ingress.

Ces changements configureront votre Ingress en utilisant un répartiteur de charge d’application AWS au lieu de Nginx. Le contrôleur ALB Ingress provisionnera et configurera automatiquement l’ALB en fonction de votre ressource Ingress.

Conclusion

N’oubliez pas de vous assurer que votre cluster EKS dispose des autorisations IAM nécessaires pour créer et gérer les ALB. Cela implique généralement de créer une stratégie IAM et un compte de service avec les autorisations appropriées.

Cette configuration utilisera désormais la solution de répartition de charges native d’AWS, qui s’intègre bien avec d’autres services AWS et peut être plus rentable dans un environnement AWS.

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