Mein zukünftiges Open-Source Projekt: KubeRegistrySync – Deklarative Image-Synchronisation für Kubernetes Edge/GitOps

(Stand: 12. April 2025)

Ich plane die Entwicklung eines neuen Open-Source-Projekts, um eine kritische Lücke im Management von Container-Images für verteilte Kubernetes-Umgebungen zu schließen, die mir besonders im Edge-Computing und bei Air-Gap-Szenarien aufgefallen ist. Mein Ziel für dieses Projekt mit dem Arbeitstitel “KubeRegistrySync” ist es, eine nahtlose Integration in bestehende GitOps-Workflows zu ermöglichen.

Die Problemstellung (The Challenge)

Bei der Arbeit mit modernen Cloud-Native-Anwendungen, insbesondere im Edge-Computing oder in Multi-Cluster-Umgebungen, sehe ich immer wieder erhebliche Herausforderungen bei der Verwaltung und Verteilung von Container-Images:

  • Konnektivität & Bandbreite: Edge-Standorte oder abgeschottete Umgebungen (Air-Gap) haben oft eingeschränkten, teuren oder unzuverlässigen Zugang zu zentralen, öffentlichen Container-Registries. Das direkte Pullen von Images ist häufig nicht möglich oder ineffizient.
  • Latenz: Das Herunterladen von Images über WAN-Verbindungen kann Deployment-Zeiten erheblich verlangsamen.
  • Konsistenz & Kontrolle: Ich sehe oft die Notwendigkeit für Organisationen, eine zentrale Kontrolle darüber zu haben, welche spezifischen Image-Versionen (identifiziert durch ihren Digest/SHA) an den Edge-Standorten verfügbar sind, um Konsistenz und Sicherheit zu gewährleisten.
  • GitOps-Integration: Während Konfigurationen und Deployments zunehmend über GitOps (z.B. mit FluxCD, Argo CD, Rancher Fleet) verwaltet werden, fehlt oft eine automatisierte, deklarative Lösung für die Bereitstellung der benötigten Container-Images in lokalen oder Edge-Registries. Manuelle Schritte oder separate Skripte stören hier den Workflow.
  • Fehlende Standardlösung: Mir ist keine etablierte, Kubernetes-native Open-Source-Lösung bekannt, die es erlaubt, den gewünschten Satz von Container-Images in einer Ziel-Registry deklarativ über eine Kubernetes-Ressource zu definieren und diesen Zustand automatisch herstellen zu lassen.

Mein Lösungsansatz: Der “EdgeImageSet” Controller

Meine Kernidee ist die Entwicklung eines Kubernetes Controllers (Operators), der eine neue Custom Resource namens EdgeImageSet (oder ähnlich) einführt und verwaltet.

  • Die EdgeImageSet Custom Resource (CR): Diese Ressource soll vom Benutzer (oder einer CI-Pipeline) im Kubernetes-Cluster erstellt werden, um den gewünschten Zustand zu definieren. Sie würde enthalten:

    • Eine Referenz auf die Ziel-Registry.
    • Eine Liste von Container-Images (idealerweise mit **Digest**), die in der Ziel-Registry vorhanden sein sollen.
    • Optional: Referenzen auf Kubernetes Secrets (clientSecretName) für die Authentifizierung.

    Konzeptionelles Beispiel (EdgeImageSet.yaml):

    apiVersion: edge.example.com/v1alpha1 # Beispiel API Group/Version
    kind: EdgeImageSet
    metadata:
      name: production-edge-images
      namespace: fleet-local # Beispiel-Namespace
    spec:
      destinationRegistry: "edge-registry.local:5000"
      # Optional: Secret für Schreibzugriff auf Ziel-Registry
      # destinationClientSecretName: edge-registry-creds 
      images:
        # Images idealerweise mit Digest für Unveränderlichkeit
        - image: registry.gitlab.com/vsv-rewe/spring-app-source@sha256:abc...def
          # Optional: Secret für Lesezugriff auf Quell-Registry (falls privat)
          # sourceClientSecretName: gitlab-registry-creds 
        - image: registry.gitlab.com/vsv-rewe/angular-app-source@sha256:123...456
          # sourceClientSecretName: gitlab-registry-creds
        - image: docker.io/library/nginx:1.25@sha256:fed...cba
          # Kein Secret, da öffentliche Quelle
    status: # Wird vom Controller verwaltet
      observedGeneration: 1
      conditions:
      - type: Synced
        status: "True"
        lastTransitionTime: "2025-04-12T12:00:00Z"
        reason: SyncSuccessful
        message: "All declared images are present in the destination registry."
      synchronizedImages:
      - registry.gitlab.com/vsv-rewe/spring-app-source@sha256:abc...def
      - registry.gitlab.com/vsv-rewe/angular-app-source@sha256:123...456
      - docker.io/library/nginx:1.25@sha256:fed...cba
      lastSyncTime: "2025-04-12T12:00:00Z" 
    
  • Der KubeRegistrySync Controller: Ein Operator, den ich entwickeln möchte, der im Cluster läuft und:

    • EdgeImageSet-Ressourcen beobachtet.
    • Den deklarierten Zustand mit dem Ist-Zustand in der Ziel-Registry vergleicht.
    • Fehlende Images identifiziert.
    • Automatisch Kubernetes Jobs startet, die skopeo copy ausführen, um die fehlenden Images zu synchronisieren.
    • Den Status der EdgeImageSet-CR aktualisiert.

Ziele & Nutzen (Value Proposition)

Mit diesem Projekt möchte ich folgende Vorteile erreichen:

  • Echter GitOps-Workflow für Images: Eine vollständig deklarative Verwaltung des Image-Bestands in Edge-/Air-Gap-Registries, gesteuert über das GitOps-Repository.
  • Automatisierung: Die Eliminierung manueller Schritte und Skripte für die Image-Verteilung.
  • Effizienz: Reduzierung von Latenz und externer Bandbreitennutzung am Edge.
  • Zuverlässigkeit: Sicherstellung der Image-Verfügbarkeit vor dem Deployment und Unterstützung von Offline-Szenarien.
  • Sicherheit & Compliance: Ermöglichung der Durchsetzung genehmigter Image-Versionen und sicheres Credential-Handling.
  • Cloud-/Registry-Unabhängigkeit: Durch Nutzung von Standard-Tools wie skopeo soll der Controller registry-agnostisch sein.

Geplante Architektur (Konzeptuell)

+-----------------------+      +-------------------------+      +--------------------------+
|   GitOps Repository   | ---->|   GitOps Engine (Fleet) | ---->| Kubernetes API Server    |
| (fleet-config)        |      | (im K3s Cluster)        |      | (im K3s Cluster)         |
|                       |      |                         |      | - Speichert EdgeImageSet |
| - EdgeImageSet.yaml   |      | - Wendet YAML an        |      | - Speichert Secrets      |
| - Helm Charts         |      |                         |      | - Speichert Jobs         |
| - ...                 |      +-------------------------+      +------------+-------------+
+-----------------------+                                                    | Watch        ^
                                                                             |              | API Calls
                                                     +-----------------------+v-------------+
                                                     | KubeRegistrySync Controller (Operator)|
                                                     | (Deployment im K3s Cluster)           |
                                                     |---------------------------------------|
                                                     | 1. Watch EdgeImageSet/Secrets         |
                                                     | 2. Lese/Vergleiche Spec vs. Registry  |
                                                     | 3. Erstelle K8s Jobs für 'skopeo copy'|
                                                     | 4. Überwache Jobs                     |
                                                     | 5. Update EdgeImageSet Status         |
                                                     +------------------------+--------------+
                                                                              | Creates/Manages
                                                                              v
+------------------------+      +-------------------------------------------+      +------------------------+
| Zentrale Registry      |<-----| Kubernetes Job (Pod mit skopeo)           |----->| Edge Registry          |
| (z.B. GitLab Registry) |      | (Läuft im K3s Cluster)                    |      | (Deployment im K3s     |
|                        |      | - skopeo copy src -> dest                 |      |  Cluster)              |
|                        |      | - Nutzt Credentials aus gemounteten Secrets|      |                        |
+------------------------+      +-------------------------------------------+      +------------------------+

Geplante Entwicklungsschritte (Meine Roadmap)

  1. Phase 1: Grundlagen & CRD Definition
    • Projekt-Setup (Go-Modul, Git, Lizenz, etc.).
    • Auswahl des Operator Frameworks (Meine Präferenz: Kubebuilder).
    • Definition der EdgeImageSet API (Go Structs).
    • Generierung des CRD-Manifests.
    • Basis-Controller-Scaffolding.
  2. Phase 2: Basis-Reconciliation Loop
    • Implementierung der Kern-Reconcile-Funktion.
  3. Phase 3: Interaktion mit Ziel-Registry & State Check
    • Logik zum Auflisten/Prüfen von Images in der Ziel-Registry.
    • Vergleich: Soll vs. Ist.
  4. Phase 4: Implementierung der Synchronisation (via Kubernetes Jobs)
    • Generierung und Erstellung von K8s Job-Definitionen für fehlende Images.
    • Konfiguration der Job-Pods (skopeo-Image, Argumente, Credentials).
    • Überwachung der Jobs.
  5. Phase 5: Handling von Credentials
    • Lesen der Secrets.
    • Unterstützung gängiger Secret-Typen.
    • Sichere Übergabe an die skopeo-Jobs.
  6. Phase 6: Status-Updates & Fehlerbehandlung
    • Detaillierte Status-Updates für EdgeImageSet (Conditions etc.).
    • Fehlerbehandlung und Retry-Logik.
  7. Phase 7: Tests, Dokumentation, Deployment
    • Unit-/Integrationstests.
    • Dokumentation.
    • Helm-Chart für den Controller.
    • Container-Image für den Controller.
  8. Phase 8 (Optional): Advanced Features
    • Prometheus-Metriken.
    • Konfigurierbare Parallelität.
    • Unterstützung weiterer skopeo-Optionen.
    • Integration mit Image Scannern.

Zusammenfassung & Wertversprechen

Mein Ziel ist es, mit KubeRegistrySync die Verwaltung von Edge- und Multi-Cluster-Deployments zu vereinfachen. Ich möchte manuelle Image-Kopieraktionen und Bandbreiten-Engpässe überflüssig machen, indem ich eine deklarative Methode zur Definition des gewünschten Image-Zustands in Edge-Registries biete. Der Operator soll dies automatisch, sicher und effizient synchronisieren und sich nahtlos in bestehende GitOps-Workflows integrieren. Ich strebe danach, Kontrolle, Zuverlässigkeit und Geschwindigkeit für verteilte Anwendungen zu verbessern.

Interesse & Mitwirkung

Ich plane, dieses Projekt als Open Source zu entwickeln, da ich glaube, dass es einen echten Bedarf dafür gibt. Wenn Sie Interesse an diesem Thema haben – sei es als potenzieller Anwender, Mitwirkender oder Kunde, der eine solche Lösung benötigt – freue ich mich sehr über Ihre Kontaktaufnahme und Ihr Feedback!

Copyrighted Image