Container-Checkpointing in Kubernetes mit einer benutzerdefinierten API

Problemstellung

Herausforderung

Organisationen, die containerisierte Anwendungen in Kubernetes ausführen, müssen oft den Zustand laufender Container für:

  • Wiederherstellung nach Katastrophen
  • Anwendungsmigration
  • Debugging/Fehlerbehebung
  • Zustandserhaltung
  • Umgebungsreproduktion

erfassen und bewahren. Allerdings gibt es keinen direkten, automatisierten Weg, um:

  1. Container-Checkpoints bei Bedarf zu erstellen
  2. Diese Checkpoints in einem standardisierten Format zu speichern
  3. Sie leicht zugänglich über Cluster zu machen
  4. Checkpointing über eine standardisierte Schnittstelle auszulösen

Aktuelle Einschränkungen

  • Manuelle Erstellung von Checkpoints erfordert direkten Zugriff auf den Cluster
  • Kein standardisiertes Speicherformat für Checkpoints
  • Begrenzte Integration mit Container-Registern
  • Fehlender programmatischer Zugriff für Automatisierung
  • Komplexe Koordination zwischen Containerd und Speichersystemen

Lösung

Ein Kubernetes Sidecar-Service, der:

  1. Checkpoint-Funktionalität über REST-API bereitstellt
  2. Checkpoints automatisch in OCI-konforme Images konvertiert
  3. Bilder in ECR speichert für einfache Verteilung
  4. Integration mit bestehender Kubernetes-Infrastruktur
  5. Standardisierte Schnittstelle für Automatisierung bereitstellt

Dies löst die Kernprobleme durch:

  • Automatisierung des Checkpoint-Prozesses
  • Standardisierung der Checkpoint-Speicherung
  • Checkpoints portabel machen
  • Programmgesteuerten Zugriff ermöglichen
  • Integration mit bestehenden Workflows vereinfachen

Zielbenutzer:

  • DevOps-Teams
  • Plattformingenieure
  • Anwendungsentwickler
  • Site Reliability Engineers (SREs)

Forensisches Container-Checkpointing basiert auf Checkpoint/Restore In Userspace (CRIU) und ermöglicht die Erstellung von zustandsbehafteten Kopien eines laufenden Containers, ohne dass der Container weiß, dass er gecheckpointet wird. Die Kopie des Containers kann analysiert und in einer Sandbox-Umgebung mehrfach wiederhergestellt werden, ohne dass der ursprüngliche Container davon Kenntnis hat. Forensisches Container-Checkpointing wurde als Alpha-Funktion in Kubernetes v1.25 eingeführt.

Dieser Artikel wird Sie anleiten, wie Sie Golang-Code bereitstellen, der verwendet werden kann, um einen Container-Checkpoint über eine API zu erstellen.

Der Code nimmt eine Pod-ID, ruft die Container-ID von containerd als Eingabe ab und verwendet dann den ctr-Befehl, um den spezifischen Container im k8s.io-Namespace von containerd zu checkpointen:

Voraussetzungen

  • Kubernetes-Cluster
  • Installieren Sie das ctr-Befehlszeilen-Tool. Wenn Sie in der Lage sind, ctr-Befehle auf dem kubelet oder Worker-Knoten auszuführen; wenn nicht, installieren oder passen Sie das AMI an, um den ctr zu enthalten
  • kubectl konfiguriert, um mit Ihrem Cluster zu kommunizieren
  • Docker lokal installiert
  • Zugriff auf ein Container-Registry (z.B. Docker Hub, ECR)
  • Helm (zur Installation des Nginx Ingress Controllers)

Schritt 0: Code zum Erstellen eines Container-Checkpoint mit GO

Erstellen Sie eine Datei mit dem Namen checkpoint_container.go mit dem folgenden Inhalt:

Go

 

Schritt 1: Initialisieren des go-Moduls

Shell

 

Ändern Sie die Datei go.mod:

Go

 

Führen Sie den folgenden Befehl aus:

Shell

 

Schritt 2: Docker-Image erstellen und veröffentlichen

Erstellen Sie ein Dockerfile im selben Verzeichnis:

Dockerfile

 

Dieses Dockerfile tut folgendes:

  1. Verwendet golang:1.20 als Build-Stage zum Kompilieren Ihrer Go-Anwendung.
  2. Verwendet amazonlinux:2 als endgültiges Basisimage.
  3. Installiert die AWS CLI, Docker (einschließlich containerd) und skopeo unter Verwendung von yum und amazon-linux-extras.
  4. Kopiert das kompilierte Go-Binary aus der Build-Stage.
Shell

 

Ersetzen Sie <your-docker-repo> durch Ihr tatsächliches Docker-Repository.

Schritt 3: Die RBAC-Ressourcen anwenden

Erstellen Sie eine Datei mit dem Namen rbac.yaml:

YAML

 

Wenden Sie die RBAC-Ressourcen an:

Shell

 

Schritt 4: Erstellen einer Kubernetes-Bereitstellung

Erstellen Sie eine Datei namens deployment.yaml:

YAML

 

Bewerben Sie die Bereitstellung:

Shell

 

In deployment.yaml aktualisieren Sie folgendes:

YAML

Schritt 5: Kubernetes-Service

Erstellen Sie eine Datei namens service.yaml:

YAML

 

Bewerben Sie den Service:

Shell

 

Schritt 6: Ngnix Ingress-Controller installieren

Shell

 

Schritt 7: Ingress-Ressource erstellen

Erstellen Sie eine Datei namens ingress.yaml:

YAML

 

Bewerben Sie den Ingress:

Shell

 

Schritt 8: API testen

Shell

 

Shell

 

Ersetzen Sie <EXTERNAL-IP> durch die tatsächliche externe IP.

Zusätzliche Überlegungen

  1. Sicherheit.
    • Richten Sie HTTPS durch Einrichten von TLS-Zertifikaten ein
    • Fügen Sie der API Authentifizierung hinzu
  2. Überwachung. Richten Sie Logging und Überwachung für die API und den Checkpoint-Prozess ein.
  3. Ressourcenmanagement. Konfigurieren Sie Ressourcenanfragen und -limits für den Sidecar-Container.
  4. Fehlerbehandlung. Implementieren Sie eine robuste Fehlerbehandlung in der Go-Anwendung.
  5. Testen. Testen Sie die Einrichtung gründlich in einer nicht produktiven Umgebung, bevor Sie sie in die Produktion übernehmen.
  6. Dokumentation. Pflegen Sie eine klare Dokumentation zur Verwendung der Checkpoint-API.

Abschluss

Dieses Setup implementiert den Checkpoint-Container als Sidecar in Kubernetes und stellt dessen Funktionalität über eine von außerhalb des Clusters zugängliche API bereit. Es bietet eine flexible Lösung zur Verwaltung von Container-Checkpoints in einer Kubernetes-Umgebung.

AWS/EKS-Spezifisch

Schritt 7: Installieren des AWS Load Balancer Controllers

Anstelle des Nginx Ingress Controllers verwenden wir den AWS Load Balancer Controller. Dieser Controller erstellt und verwaltet ALBs für unsere Ingress-Ressourcen.

1. Fügen Sie das EKS-Chart-Repository zu Helm hinzu:

Shell

 

2. Installieren Sie den AWS Load Balancer Controller:

Shell

 

Ersetzen Sie <Ihr-Cluster-Name> durch den Namen Ihres EKS-Clusters.

Hinweis: Stellen Sie sicher, dass Sie die erforderlichen IAM-Berechtigungen für den AWS Load Balancer Controller eingerichtet haben. Die detaillierte IAM-Richtlinie finden Sie in der AWS-Dokumentation.

Schritt 8: Erstellen der Ingress-Ressource

Erstellen Sie eine Datei mit dem Namen ingress.yaml:

YAML

 

Wenden Sie die Ingress-Ressource an:

Shell

 

Schritt 9: Testen der API

1. Holen Sie sich den ALB-DNS-Namen:

Shell

 

Suchen Sie nach dem ADDRESS-Feld, das der DNS-Name des ALB ist.

2. Senden Sie eine Testanfrage:

Shell

 

Ersetzen Sie <ALB-DNS-NAME> durch den tatsächlichen DNS-Namen Ihres ALB aus Schritt 1.

Zusätzliche Überlegungen für AWS ALB

1. Sicherheitsgruppen. Die ALB wird automatisch eine Sicherheitsgruppe erstellen. Stellen Sie sicher, dass sie den eingehenden Datenverkehr auf Port 80 zulässt (und 443, wenn Sie HTTPS eingerichtet haben).

2. SSL/TLS: Um HTTPS zu aktivieren, können Sie die folgenden Annotationen zu Ihrem Ingress hinzufügen:

YAML

 

3. Zugriffsprotokolle. Aktivieren Sie die Zugriffsprotokolle für Ihren ALB, indem Sie Folgendes hinzufügen:

YAML

 

4. WAF-Integration. Wenn Sie AWS WAF mit Ihrem ALB verwenden möchten, können Sie Folgendes hinzufügen:

YAML

 

5. Authentifizierung. Sie können die Authentifizierung mithilfe von Amazon Cognito oder OIDC einrichten, indem Sie die entsprechenden ALB Ingress Controller-Annotationen verwenden.

Diese Änderungen richten Ihren Ingress mithilfe eines AWS Application Load Balancers anstelle von Nginx ein. Der ALB Ingress Controller wird den ALB basierend auf Ihrem Ingress-Ressourcen automatisch bereitstellen und konfigurieren.

Schlussfolgerung

Vergewissern Sie sich, dass Ihr EKS-Cluster über die erforderlichen IAM-Berechtigungen verfügt, um ALBs zu erstellen und zu verwalten. Dies beinhaltet in der Regel das Erstellen einer IAM-Richtlinie und eines Dienstkontos mit den entsprechenden Berechtigungen.

Diese Konfiguration wird jetzt die native Lastenausgleichslösung von AWS verwenden, die gut mit anderen AWS-Diensten integriert ist und in einer AWS-Umgebung kosteneffizienter sein kann.

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