Checkpointing dei Container in Kubernetes con un’API Personalizzata

Dichiarazione del Problema

Sfida

Le organizzazioni che eseguono applicazioni containerizzate in Kubernetes spesso devono catturare e preservare lo stato dei container in esecuzione per:

  • Recupero da disastri
  • Migrazione delle applicazioni
  • Debug/troubleshooting
  • Preservazione dello stato
  • Riproduzione dell’ambiente

Tuttavia, non esiste un modo semplice e automatizzato per:

  1. Creare checkpoint dei container su richiesta
  2. Memorizzare questi checkpoint in un formato standardizzato
  3. Rendere facilmente accessibili i checkpoint tra i cluster
  4. Attivare il checkpointing tramite un’interfaccia standard

Limitazioni Attuali

  • La creazione manuale di checkpoint richiede accesso diretto al cluster
  • Nessun formato di memorizzazione standardizzato per i checkpoint
  • Integrazione limitata con i registri dei container
  • Mancanza di accesso programmatico per l’automazione
  • Coordinamento complesso tra containerd e i sistemi di storage

Soluzione

Un servizio sidecar di Kubernetes che:

  1. Espone la funzionalità di checkpoint tramite REST API
  2. Converte automaticamente i checkpoint in immagini conformi a OCI
  3. Memorizza le immagini in ECR per una facile distribuzione
  4. Si integra con l’infrastruttura Kubernetes esistente
  5. Fornisce un’interfaccia standardizzata per l’automazione

Questo risolve i problemi principali:

  • Automatizzando il processo di checkpoint
  • Standardizzazione dello storage dei checkpoint
  • Rendere i checkpoint portabili
  • Abilitare l’accesso programmatico
  • Semplificare l’integrazione con i flussi di lavoro esistenti

Utenti target:

  • Team DevOps
  • Ingegneri di piattaforma
  • Sviluppatori di applicazioni
  • Ingegneri di affidabilità del sito (SRE)

Il checkpointing forense dei container si basa su Checkpoint/Restore In Userspace (CRIU) e consente la creazione di copie stateful di un container in esecuzione senza che il container stesso sappia di essere sottoposto a checkpoint. La copia del container può essere analizzata e ripristinata in un ambiente sandbox più volte senza che il container originale ne sia a conoscenza. Il checkpointing forense dei container è stato introdotto come funzionalità alpha in Kubernetes v1.25.

Questo articolo ti guiderà su come distribuire codice Golang che può essere utilizzato per prendere un checkpoint di un container utilizzando un’API.

Il codice prende un identificatore del pod, recupera l’ID del container da containerd come input e poi utilizza il comando ctr per checkpointare il container specifico nel namespace k8s.io di containerd:

Requisiti

  • Cluster Kubernetes
  • Installare lo strumento ctr commandline. se sei in grado di eseguire comandi ctr sul kubelet o sul nodo worker; in caso contrario, installare o regolare AMI per contenere il ctr
  • kubectl configurato per comunicare con il tuo cluster
  • Docker installato localmente
  • Accesso a un registro dei container (ad esempio, Docker Hub, ECR)
  • Helm (per installare Nginx Ingress Controller)

Passo 0: Codice per Creare un Punto di Controllo del Container Utilizzando GO

Crea un file chiamato checkpoint_container.go con il seguente contenuto:

Go

 

Passo 1: Inizializzare il modulo go

Shell

 

Modifica il file go.mod:

Go

 

Esegui il seguente comando:

Shell

 

Passo 2: Costruisci e Pubblica l’Immagine Docker

Crea un Dockerfile nella stessa directory:

Dockerfile

 

Questo Dockerfile fa quanto segue:

  1. Utilizza golang:1.20 come fase di compilazione per compilare la tua applicazione Go.
  2. Utilizza amazonlinux:2 come immagine di base finale.
  3. Installa AWS CLI, Docker (che include containerd) e skopeo usando yum e amazon-linux-extras.
  4. Copia il binario Go compilato dalla fase di build.
Shell

 

Sostituisci <your-docker-repo> con il tuo effettivo repository Docker.

Passo 3: Applica le risorse RBAC

Crea un file chiamato rbac.yaml:

YAML

 

Applica le risorse RBAC:

Shell

 

Passo 4: Creare un Deployment Kubernetes

Crea un file chiamato deployment.yaml:

YAML

 

Applica il deployment:

Shell

 

Nel file deployment.yaml, aggiorna quanto segue:

YAML

Passo 5: Servizio Kubernetes

Crea un file chiamato service.yaml:

YAML

 

Applica il servizio:

Shell

 

Passo 6: Installa Ngnix Ingress Controller

Shell

 

Passo 7: Crea una Risorsa Ingress

Crea un file chiamato ingress.yaml:

YAML

 

Applica l’Ingress:

Shell

 

Passo 8: Testa l’API

Shell

 

Shell

 

Sostituisci <EXTERNAL-IP> con l’effettivo IP esterno.

Considerazioni Aggiuntive

  1. Sicurezza.
    • Implementare HTTPS configurando certificati TLS
    • Aggiungere autenticazione all’API
  2. Monitoraggio. Configurare logging e monitoraggio per l’API e il processo del checkpoint.
  3. Gestione delle Risorse. Configurare richieste e limiti delle risorse per il container del sidecar.
  4. Gestione degli Errori. Implementare una gestione degli errori robusta nell’applicazione Go.
  5. Test. Testare approfonditamente la configurazione in un ambiente non di produzione prima di implementarla in produzione.
  6. Documentazione. Mantenere una documentazione chiara su come utilizzare l’API del checkpoint.

Conclusione

Questa configurazione dispiega il contenitore del checkpoint come sidecar in Kubernetes ed espone la sua funzionalità tramite un’API accessibile dall’esterno del cluster. Fornisce una soluzione flessibile per gestire i checkpoint dei contenitori in un ambiente Kubernetes.

Specifico per AWS/EKS

Passaggio 7: Installa il Controller del Bilanciatore di Carico AWS

Invece di utilizzare il Controller di Ingress Nginx, useremo il Controller del Bilanciatore di Carico AWS. Questo controller creerà e gestirà gli ALB per le nostre risorse di Ingress.

1. Aggiungi il repository del chart EKS a Helm:

Shell

 

2. Installa il Controller del Bilanciatore di Carico AWS:

Shell

 

Sostituisci <nome-del-tuo-cluster> con il nome del tuo cluster EKS.

Nota: Assicurati di avere le necessarie autorizzazioni IAM configurate per il Controller del Bilanciatore di Carico AWS. Puoi trovare la policy IAM dettagliata nella documentazione AWS.

Passaggio 8: Crea la Risorsa di Ingress

Crea un file chiamato ingress.yaml:

YAML

 

Applica l’Ingress:

Shell

 

Passaggio 9: Testa l’API

1. Ottieni il nome DNS dell’ALB:

Shell

 

Cerca il campo INDIRIZZO, che sarà il nome DNS dell’ALB.

2. Invia una richiesta di test:

Shell

 

Sostituisci <NOME-DNS-ALB> con il nome DNS effettivo del tuo ALB dal passaggio 1.

Considerazioni aggiuntive per AWS ALB

1. Gruppi di sicurezza. L’ALB avrà un gruppo di sicurezza creato automaticamente. Assicurati che consenta il traffico in ingresso sulla porta 80 (e sulla 443 se hai configurato HTTPS).

2. SSL/TLS: Per abilitare HTTPS, puoi aggiungere le seguenti annotazioni al tuo Ingress:

YAML

 

3. Log di accesso. Abilita i log di accesso per il tuo ALB aggiungendo quanto segue:

YAML

 

4. Integrazione WAF. Se desideri utilizzare AWS WAF con il tuo ALB, puoi aggiungere:

YAML

 

5. Autenticazione. Puoi configurare l’autenticazione utilizzando Amazon Cognito o OIDC tramite le opportune annotazioni del controller di Ingress ALB.

Queste modifiche configureranno il tuo Ingress utilizzando un bilanciatore di carico delle applicazioni AWS anziché Nginx. Il controller di Ingress ALB provvederà automaticamente a creare e configurare l’ALB in base alla risorsa Ingress.

Conclusione

Ricorda di assicurarti che il tuo cluster EKS abbia le autorizzazioni IAM necessarie per creare e gestire gli ALB. Di solito ciò comporta la creazione di una policy IAM e di un account servizio con le autorizzazioni appropriate.

Questa configurazione utilizzerà ora la soluzione di bilanciamento del carico nativa di AWS, che si integra bene con altri servizi AWS e può essere più conveniente in un ambiente AWS.

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