Diese Seite bietet einen Ausgangspunkt zum Planen und Entwerfen von CI/CD-GitOps-Pipelines für Kubernetes, mit dem Sie Config Sync optimal nutzen können.
GitOps selbst ist eine universelle Best Practice für Organisationen, die die Kubernetes-Konfiguration in großem Maßstab verwalten. Bei der Architektur dieser Lösung haben Sie jedoch viele Möglichkeiten. Wenn Sie die Optionen sowie die Vor- und Nachteile dieser Entscheidungen kennen, können Sie vermeiden, Ihre Architektur in Zukunft neu zu schreiben.
Sie müssen nicht alle auf dieser Seite aufgeführten Best Practices verwenden. Welche Best Practices Sie anwenden, hängt von Ihrer individuellen Situation ab. Diese Seite soll Ihnen dabei helfen, fundierte Entscheidungen beim Einrichten Ihrer GitOps-Architektur zu treffen.
Zentralisiertes, privates Paket-Repository verwenden
Durch die Verwendung eines zentralen Repositorys für öffentliche oder interne Pakete (z. B. Helm oder kpt
) können Teams Pakete leichter finden. Sie können Dienste wie Artifact Registry- oder Git-Repositories verwenden.
Das Plattformteam kann Richtlinien implementieren, bei denen Anwendungsteams Pakete nur aus dem zentralen Repository verwenden können. Alternativ kann das zentrale Repository als eine Reihe geprüfter Pakete verwendet werden.
Sie können die Schreibberechtigungen für das Repository auf nur wenige Entwickler beschränken. Der Rest der Organisation kann Lesezugriff haben. Es wird empfohlen, einen Prozess zum Hochstufen von Paketen im zentralen Repository zu implementieren und Updates zu senden.
In der folgenden Tabelle sind die Vor- und Nachteile der Verwendung eines zentralen, privaten Paket-Repositorys aufgeführt:
Vorteile |
Nachteile |
|
|
Wet-Repositories erstellen
Erstellen Sie Repositories mit der YAML-Ausgabe, die dem gewünschten Status Ihres Clusters oder Namespace entspricht. Die Änderungen am eigentlichen oder vollständig hydrierten Repository sollten mithilfe eines Diffs einfach zu prüfen sein. Es empfiehlt sich, Änderungen nur am eigentlichen Repository im Rahmen eines Überprüfungsprozesses vorzunehmen (in GitHub wäre dies beispielsweise eine Pull-Anfrage).
In der folgenden Tabelle sind die Vor- und Nachteile der Erstellung von Wet-Repositories aufgeführt:
Vorteile |
Nachteile |
|
|
Shift-Left-Modell zum Validieren von Konfigurationen
Wenn Sie auf die Überprüfung von Problemen mit Config Sync warten, kann dies zu unnötigen Git-Commits und zu einer langen Feedbackschleife führen. Mit kpt
-Validierungsfunktionen wie kubeval können Sie viele Probleme ermitteln, bevor eine Konfiguration auf einen Cluster angewendet wird.
In der folgenden Tabelle sind die Vor- und Nachteile der Prüfung auf Probleme aufgeführt, bevor eine Konfiguration angewendet wird:
Vorteile |
Nachteile |
|
|
Ordner anstelle von Zweigen verwenden
Verwenden Sie Ordner für Varianten der Konfiguration anstelle von Zweigen. Bei Ordnern können Sie mit dem Befehl tree
Varianten aufrufen. Bei Zweigen können Sie beispielsweise nicht feststellen, ob das Delta zwischen einem Produktions- und einem Phasenzweig eine bevorstehende Änderung der Konfiguration oder ein permanenter Unterschied zwischen der Phase und der Produktion ist.
In der folgenden Tabelle sind die Vor- und Nachteile der Verwendung von Ordnern anstelle von Zweigen aufgeführt:
Vorteile |
Nachteile |
|
|
Verwendung von ClusterSelectors
minimieren
Mit ClusterSelectors
können Sie bestimmte Teile einer Konfiguration auf eine Teilmenge von Clustern anwenden. Anstatt RootSync oder RepoSync zu konfigurieren, können Sie entweder die angewendete Ressource ändern oder den Clustern Labels hinzufügen. Wenn jedoch die Anzahl der ClusterSelectors
mit der Zeit zunimmt, kann es kompliziert werden, den endgültigen Status des Clusters zu verstehen.
Mit Config Sync können Sie mehrere RootSyncs
und RepoSyncs
gleichzeitig synchronisieren. Dies bedeutet, dass Sie die relevante Konfiguration einem separaten Repository hinzufügen und dann mit den gewünschten Clustern synchronisieren können.
In der folgenden Tabelle sind die Vor- und Nachteile der Verwendung von ClusterSelectors
aufgeführt:
Vorteile |
Nachteile |
|
|
Verwaltung von Jobs mit Config Sync vermeiden
Config Sync kann zwar Jobs für Sie anwenden, Jobs sind jedoch aus folgenden Gründen nicht gut für die GitOps-Bereitstellung geeignet:
Unveränderliche Felder: Viele Jobfelder sind unveränderlich. Wenn Sie ein unveränderliches Feld ändern möchten, muss das Objekt gelöscht und neu erstellt werden. Config Sync löscht Ihr Objekt jedoch nur, wenn Sie es aus der Quelle entfernen.
Unbeabsichtigte Ausführung von Jobs: Wenn Sie einen Job mit Config Sync synchronisieren und dieser Job dann aus dem Cluster gelöscht wird, berücksichtigt Config Sync diesen Abweichung von Ihrem ausgewählten Status und erstellt den Job. Wenn Sie eine Job-Gültigkeitsdauer (TTL) angeben, wird der Job automatisch gelöscht und Config Sync erstellt ihn automatisch neu. Der Job wird dann neu gestartet, bis Sie den Job aus der "Source of Truth". Oft ist dies nicht beabsichtigt, da Config Sync den Job noch einmal ausführt.
Abgleichsprobleme: Config Sync wartet nach der Anwendung normalerweise auf den Abgleich von Objekten. Jobs werden jedoch als abgeglichen betrachtet, wenn sie ausgeführt werden. Das bedeutet, dass Config Sync nicht wartet, bis der Job abgeschlossen ist, bevor weitere Objekte angewendet werden. Wenn der Job jedoch später fehlschlägt, wird dies als Fehler für den Abgleich betrachtet. In einigen Fällen kann dies verhindern, dass andere Ressourcen synchronisiert werden, und Fehler verursachen, bis Sie das Problem beheben. In anderen Fällen kann die Synchronisierung erfolgreich sein und nur der Abgleich schlägt fehl.
Aus diesen Gründen empfehlen wir, Jobs nicht mit Config Sync zu synchronisieren.
In den meisten Fällen sollten Jobs und andere kontextbezogene Aufgaben von einem Dienst verwaltet werden, der für die Verwaltung des Lebenszyklus zuständig ist. Anschließend haben Sie die Möglichkeit, diesen Dienst mit Config Sync anstelle der Jobs selbst zu verwalten.
In der folgenden Tabelle sind die Vor- und Nachteile aufgeführt, wenn Sie Config Sync nicht zum Verwalten von Jobs verwenden:
Vorteile |
Nachteile |
|
|
Unstrukturierte Repositories verwenden
Config Sync unterstützt zwei Strukturen zum Organisieren eines Repositorys: unstrukturiert und hierarchisch. Unstrukturiert ist der empfohlene Ansatz, da Sie damit ein Repository so organisieren können, wie es für Sie am besten ist.
Hierarchische Repositories erzwingen im Vergleich eine bestimmte Struktur. Beispielsweise müssen sich CRDs in einem bestimmten Verzeichnis befinden. Dies kann zu Problemen führen, wenn Sie Konfigurationen freigeben müssen. Wenn beispielsweise ein Team ein Paket mit einer CRD veröffentlicht, muss ein anderes Team, das dieses Paket verwenden muss, die CRD in ein Verzeichnis cluster
verschieben, wodurch der Prozess erhöht wird.
In der folgenden Tabelle sind die Vor- und Nachteile der Verwendung unstrukturierter Repositories aufgeführt:
Vorteile |
Nachteile |
|
|
Informationen zum Konvertieren eines hierarchischen Repositorys finden Sie unter Hierarchisches Repository in ein unstrukturiertes Repository umwandeln.
Separate Code- und Konfigurations-Repositories
Beim Hochskalieren eines Mono-Repositorys ist für jeden Ordner ein eigener Build erforderlich. Berechtigungen und Bedenken für Personen, die am Code arbeiten und mit der Clusterkonfiguration arbeiten, unterscheiden sich in der Regel. Wenn Code- und Konfigurations-Repositories getrennt sind, kann jedes Repository seine eigenen Berechtigungen und Strukturen haben.
In der folgenden Tabelle sind die Vor- und Nachteile der Trennung von Code- und Konfigurations-Repositories aufgeführt:
Vorteile |
Nachteile |
|
|
Änderungen mit separaten Repositories isolieren
Beim Hochskalieren eines Mono-Repositorys sind für verschiedene Ordner unterschiedliche Berechtigungen erforderlich. Aus diesem Grund ermöglicht die Trennung von Repositories Sicherheitsgrenzen zwischen Sicherheit, Plattform und Anwendungskonfiguration. Es empfiehlt sich außerdem, Produktions- und Nicht-Produktions-Repositories zu trennen.
In der folgenden Tabelle sind die Vor- und Nachteile der Isolierung von Änderungen in separaten Repositories aufgeführt:
Vorteile |
Nachteile |
|
|
Paketversionen anpinnen
Unabhängig davon, ob Sie Helm oder Git verwenden, sollten Sie die Version des Konfigurationspakets an etwas anheften, das nicht versehentlich ohne explizites Roll-out verschoben wird.
In der folgenden Tabelle sind die Vor- und Nachteile des Anpinnen von Paketversionen aufgeführt:
Vorteile |
Nachteile |
|
|
Workload Identity verwenden
Sie können Workload Identity in GKE-Clustern aktivieren, damit Kubernetes-Arbeitslasten sicher und verwaltbar auf Google-Dienste zugreifen können.
In der folgenden Tabelle sind die Vor- und Nachteile der Verwendung von Workload Identity aufgeführt:
Vorteile |
Nachteile |
|
|
Gesamtarchitektur
Auf übergeordneter Ebene benötigen Sie wahrscheinlich mindestens vier Repository-Typen:
- Ein Paket-Repository, in dem eine gemeinsam genutzte Konfiguration gespeichert ist. Dies kann auch ein in Artifact Registry gespeichertes Helm-Diagramm sein.
- Ein Plattform-Repository, in dem das Plattformteam die flottenweite Konfiguration für Cluster und Namespaces speichert.
- Ein Anwendungskonfigurations-Repository
- Ein Anwendungscode-Repository.
Das folgende Diagramm zeigt das Layout dieser Repositories:
Das folgende Diagramm zeigt den Konfigurationsfluss vom Anwendungscode in ein Anwendungskonfigurations-Repository. Entwicklungsteams übertragen Code für Anwendungen und Anwendungskonfigurationen in ein Repository. Der Code für Anwendungen und Konfigurationen wird am selben Ort gespeichert und Anwendungsteams haben die Kontrolle über diese Repositories. Anwendungsteams können dann Code in einen Build übertragen.