GitOps Diff Tool

GitOps ist eine beeindruckende Methode zur Verwaltung von Systemzuständen, aber es birgt auch Herausforderungen. Das Single-Source-of-Truth-Konzept im Git-Repository ermöglicht automatische Anpassungen im Cluster, doch das Verstehen der Auswirkungen von Änderungen und das Genehmigen von Pull Requests stellen weiterhin grosse Herausforderungen dar. Insbesondere bei zusätzlichen Abstraktionsschichten wie Helm oder Kustomize. In diesem Blogpost erläutern wir dir einen möglichen, spannenden Ansatz, um dieses Problem zu lösen.

Einen sehr interessanten Ansatz das Problem zu lösen hat Kostis Kapelonis an der diesjährigen KubeCon präsentiert. Seine Idee ist, bei einem Pull Request, die entsprechenden Kubernetes Manifeste von Source und Target Branch zu rendern und anschliessend das Diff als Kommentar zum entsprechenden Pull Requests anzufügen. Somit erhält der Reviewer des Pull Requests nicht nur das Diff der Änderungen, sondern auch gleich das Diff der finalen Manifeste. Dies ist besonders hilfreich bei multilayer Kustomize Deployments oder Helm Deployments mit mehreren Value files.

Inspiriert durch den Talk von Kostis Kapelonis an der diesjährigen KubeCon haben wir das Tool GOFF (GitOps Diff) geschrieben. GOFF bietet folgende Möglichkeiten:

  • Generieren eines Diffs zwischen zwei Ordner
  • Rendern von allen Kustomize Manifesten innerhalb eines Verzeichnis
  • Rendern von ArgoCD Applications zu Kubernetes Manifeste
  • Offline Modus (kein Zugriff auf ArgoCD oder den Cluster nötig)

GOFF ist selbstverständlich Open Source. Der Source Code befindet sich auf GitHub.

Folgendes Beispiel demonstriert die Funktionen von GOFF. Es handelt sich um eine ArgoCD Application, die ein externen Redis Helm Chart von Bitnami referenziert. Das Value File für das Deployment wird von einem externen Git Repository angezogen.

In einem neuen Pull Request wird die Helm Chart Version von 16.11.2 auf 17.10.3 updated. In der unten stehend Grafik sieht man das Diff wie es von Github dargesellt ist. Dies ist soweit natürlich korrekt, da wir im Pull request nicht mehr als die Versionsnummer angepasst haben. Aber das Diff zeigt uns nicht die effektiven Änderungen, welche im gerenderten Manifest auftreten.

An dieser Stelle kommt nun GOFF ins Spiel. Mit folgenden Befehlen kann ein Diff erzeugt werden, welches die finalen Änderungen anzeigt.

#Render ArgoCD Application to Kubernetes Manifests
goff argocd "./source/argocd" --repoServer="reposerver:8081" --output-dir=/tmp/source/

#Render ArgoCD Application to Kubernetes Manifests
goff argocd "./target/argocd" --repoServer="reposerver:8081" --output-dir=/tmp/target/

#Generate Diff
goff diff "/tmp/source" "/tmp/target" --output-dir .

Dies kann auch problemlos in einer GitHub Action integriert werden, welche im Fall eines Pull Requests die finalen Manifeste rendert, diese vergleicht und anschliessend das Diff aufbereitet und als Kommentar dem Pull Request hinzufügt. Dabei zeigt sich zum Beispiel auch, dass zwischen den Versionen der Health Check von Redis minimal angepasst wurde.

Das ganze funktioniert auch mit Helm und Kustomize deployments.

Hier sieht man das Diff vom Pull Request in welchem die Erstellung des Service Accounts im values.yaml deaktiviert wird.

Man kann das Diff der beiden Versionen mit folgendem Befehl generieren:

 

#Render source branch Chart
helm template mychart ./source/helm/mychart --output-dir /tmp/source/out

#Render target branch Chart
helm template mychart ./target/helm/mychart --output-dir /tmp/target/out

#Generate diff
goff diff "/tmp/source" "/tmp/target" --output-dir .

Mit der GitHub Actions Pipeline kann man sich anschliessend vollautomatisch das finale Diff der Manifeste anzeigen lassen. Es zeigt sich, dass nicht nur das ServiceAccount Manifest gelöscht wird, sondern auch der Service Account Name im dazugehörigen Deployment angepasst wird.

Aktuell haben wir Beispiele für eine Integration in GitLab sowie GitHub. Diese sind hier im GitHub Repository verfügbar. Es ist aber problemlos möglich, das Tool auch in andere CI Systeme wie Tekton oder Jenkins zu integrieren.

Kommentare sind geschlossen.