GitOps mit Argo CD auf CODE-DE Kubernetes

Argo CD ist ein Continuous-Deployment-Tool für Kubernetes, das nach den Prinzipien von GitOps und Infrastructure as Code (IaC) entwickelt wurde. Es stellt automatisch sicher, dass Anwendungen, die auf einem Kubernetes-Cluster bereitgestellt werden, immer mit einem dedizierten Git-Repository synchronisiert werden, in dem die gewünschten Versionen bereitstehen.

In diesem Artikel werden wir die Installation von Argo CD auf einem Kubernetes-Cluster und die Bereitstellung einer Anwendung mit diesem Tool demonstrieren.

Was wir behandeln werden

  • Installation von Argo-CD

  • Zugriff auf Argo CD von Ihrem Browser aus

  • Git-Repository erstellen und Ihre Anwendungsbereitstellungskonfigurationen pushen

  • Argo CD Anwendungsressourcen erstellen und einsetzen

  • Die bereitgestellten Ressourcen ansehen

Voraussetzungen

Nr. 1 Konto

Sie benötigen ein CODE-DE Konto mit Zugriff auf die Horizon-Schnittstelle: https://cloud.fra1-1.cloudferro.com/auth/login/?next=/.

Nr. 2 Kubernetes Cluster

Erstellen eines Kubernetes-Clusters mit CODE-DE OpenStack Magnum

Nr. 3 Zugang zum Cluster mit kubectl

Zugriff auf Kubernetes-Cluster nach der Bereitstellung mit Kubectl auf CODE-DE OpenStack Magnum

Nr. 4 Vertrautheit im Umgang mit Helm

Hier erfahren Sie, wie Sie Helm-Charts installieren und nutzen können:

Einsatz von Helm Charts auf Magnum Kubernetes-Clustern auf der CODE-DE FRA1-1 Cloud

Nr. 5 Zugang zu Ihrem eigenen Git-Repository

Sie können ein Repository für diesen Artikel auf einer GitLab-Instanz hosten, wie in Artikel Install GitLab on CODE-DE Kubernetes. Sie können es auch mit GitHub, GitLab oder anderen auf git basierenden Versionskontrollplattformen erstellen.

Nr. 6 git CLI einsatzbereit

Der git Befehl muss lokal installiert sein. Eine Anleitung finden sie auf GitHub, GitLab und andere auf git basierende Versionskontrollplattformen.

Nr. 7 Zugang zu einer beispielhaften Flask-Anwendung

Sie sollten Zugang haben zu einer Flask Anwendung, die in diesem Artikel von GitHub heruntergeladen werden soll. Sie dient als Beispiel für eine Minimalanwendung. Indem wir sie ändern, können wir zeigen, dass Argo CD diese Änderungen kontinuierlich erfasst.

Schritt 1 Argo-CD installieren

Installieren wir zunächst die Argo-CD unter den folgenden Annahmen:

  • dieser Artikel wurde mit Kubernetes Version 1.25 getestet

  • Nur GUI verwenden (in dieser Anleitung wird kein CLI verwendet)

  • Argo CD ohne TLS-Zertifikate einsetzen.

Hier finden Sie eine ausführliche Installationsanleitung.

Für Produktionsszenarien wird empfohlen, TLS zu verwenden.

Erstellen wir zunächst einen dedizierten Namespace innerhalb unseres bestehenden Kubernetes-Clusters. Der Namespace sollte explizit argocd genannt werden:

kubectl create namespace argocd

Installieren Sie dann Argo-CD:

kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Schritt 2 Greifen Sie über Ihren Browser auf Argo CD zu

Die Argo-CD-Webanwendung ist standardmäßig nicht über den Browser zugänglich. Um dies zu aktivieren, ändern Sie den entsprechenden Dienst vom Typ ClusterIP auf LoadBalancer mit dem Befehl:

kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'

Rufen Sie nach 1-2 Minuten die IP-Adresse des Dienstes ab:

kubectl get service argocd-server -n argocd

In unserem Fall zeigt das Ergebnis, dass Argo CD auf der IP-Adresse 185.254.233.247 läuft:

../_images/image-2024-5-14_14-54-10.png

Geben Sie die IP-Adresse in Ihrem Browser ein (in Ihrem Fall wird es sich um eine andere IP-Adresse handeln; ersetzen Sie daher die hier angegebene Adresse 185.254.233.247 durch Ihre eigene Adresse). Sie werden voraussichtlich eine Warnung über ein ungültiges Zertifikat erhalten. Um die Warnung zu unterdrücken, klicken Sie auf „Advanced“ (Erweitert) und dann auf „Proceed to Unsafe“ (Unsicher) und Sie werden zum Anmeldebildschirm von Argo CD weitergeleitet:

../_images/image-2024-5-14_15-4-21.png

Die Anmeldung lautet admin. Um das Passwort zu erhalten, extrahieren Sie es mit dem folgenden Befehl aus dem bereitgestellten Kubernetes-„Secret“:

kubectl get secret argocd-initial-admin-secret -n argocd -ojsonpath='{.data.password}' | base64 --decode ; echo

Nachdem Sie Ihre Anmeldedaten in das Anmeldeformular eingegeben haben, werden Sie zu folgendem Bildschirm weitergeleitet:

../_images/image-2024-5-14_15-34-0.png

Schritt 3 Erstellen eines Git-Repositorys

Sie müssen zunächst ein Git-Repository erstellen. Der Status der Anwendung auf Ihrem Kubernetes-Cluster wird mit dem Status dieses Repositorys synchronisiert. Es wird empfohlen, dass es sich um ein vom Anwendungscode getrenntes Repository handelt, um zu vermeiden, dass die CI-Pipelines bei jeder Änderung der Konfiguration ausgelöst werden.

Sie kopieren in dieses neu erstellte Repository Dateien, die bereits in einem (anderen) GitHub-Repository vorhanden sind, das in der Voraussetzung Nr. 6 Git CLI einsatzbereit erwähnt wird.

Erstellen Sie zunächst das Repository, wir nennen es argocd-sample. Während Sie das Formular ausfüllen, wählen Sie die Initialisierung mit README ab und wählen Sie Public Visibility aus:

../_images/image-2024-5-22_10-38-53.png

In der obigen Ansicht ist die Projekt-URL bereits ausgefüllt und entspricht der URL Ihrer GitLab-Instanz. An der mit einem blauen Rechteck gekennzeichneten Stelle geben Sie Ihren Benutzernamen ein; in der Regel ist dies root, Sie können aber auch einen anderen Namen eingeben. Wenn bereits Benutzer in GitLab definiert sind, werden deren Namen in einem Dropdown-Menü angezeigt.

Schritt 4 Flask-Anwendung herunterladen

Als nächstes sollen zwei yaml-Dateien in einen Ordner namens ArgoCD-sample und dessen Unterordner deployment heruntergeladen werden.

Nach dem Absenden des Formulars „Projekt erstellen“ erhalten Sie eine Liste von Befehlen für die Arbeit mit Ihrem Repository. Prüfen Sie diese und wechseln Sie zum CLI aus Voraussetzung Nr. 6. Klonen Sie das gesamte CloudFerro K8s Samples Repository. Aus diesem benötigen wir nur den Unterordner namens Flask-K8s-deployment. Der Übersichtlichkeit halber benennen wir diesen Ordner um und kopieren ihn in einen neuen Ordner namens ArgoCD-sample. Erstellen Sie das Verzeichnis mit

mkdir ~/ArgoCD-sample

wenn Sie diesen Artikel zum ersten Mal durcharbeiten. Wenden Sie dann die folgende Befehlsfolge an:

git clone https://github.com/CloudFerro/K8s-samples
mv ~/K8s-samples/Flask-K8s-deployment ~/ArgoCD-sample/deployment
rm K8s-samples/ -rf

Die Dateien deployment.yaml und service.yaml stellen eine Flask-Beispielanwendung in Kubernetes bereit und stellen sie als Dienst bereit. Dies sind typische Minimalbeispiele für die Bereitstellung und den Service und können vom CloudFerro Kubernetes Beispiel Repository bezogen werden (siehe Voraussetzung Nr. 7).

Schritt 5 Push-Konfigurationen für die Anwendungsbereitstellung

Dann müssen Sie die Dateien deployment.yaml und service.yaml in das online Repository hochladen. Da Sie Git verwenden, führen Sie den Upload durch Synchronisierung Ihres lokalen Repositorys mit dem entfernten Repository durch. Starten Sie zunächst das lokale Repository und übertragen Sie dann die Dateien mit den folgenden Befehlen auf das entfernte Repository (ersetzen Sie diese durch Ihre eigene Git-Repository-Instanz)Dann müssen Sie die Dateien deployment.yaml und service.yaml in das online Repository hochladen. Da Sie Git verwenden, führen Sie den Upload durch Synchronisierung Ihres lokalen Repositorys mit dem remote Repository durch. Starten Sie zunächst das lokale Repository und übertragen Sie dann die Dateien mit den folgenden Befehlen auf das remote Repository (ersetzen Sie diese durch Ihre eigene Git-Repository-Instanz):

cd ArgoCD-sample
git init
git remote add origin [email protected]:root/ArgoCD-sample.git
git add .
git commit -m "First commit"
git push origin master

Als Ergebnis haben wir damit die beiden Dateien im Remote-Repository im Bereitstellungsordner:

../_images/image-2024-5-17_11-20-27.png

Schritt 6 Erstellen der Argo-CD-Anwendungsressource

Die Argo-CD-Konfiguration für eine bestimmte Anwendung wird über eine anwendungsspezifische Ressource definiert. Eine solche Ressource verbindet einen Kubernetes-Cluster mit einem Repository, in dem Bereitstellungskonfigurationen gespeichert werden.

Erstellen Sie direkt im Ordner ArgoCD-sample die Datei application.yaml, die die Anwendung repräsentieren wird; ersetzen Sie gitlab.mysampledomain.info durch Ihre eigene Domain.

application.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: myapp-application
  namespace: argocd
spec:
  project: default
  syncPolicy:
    syncOptions:
    - CreateNamespace=true
    automated:
      selfHeal: true
      prune: true
  source:
    repoURL: https://gitlab.mysampledomain.info/root/argocd-sample.git
    targetRevision: HEAD
    path: deployment
  destination:
    server: https://kubernetes.default.svc
    namespace: myapp

Einige Erläuterungen zu dieser Datei:

spec.project.default

Gibt an, dass unsere Anwendung mit dem Standardprojekt verbunden ist (in Kubernetes als appproject CRD dargestellt). Es können zusätzliche Projekte erstellt und für die Verwaltung mehrerer Anwendungen verwendet werden.

spec.syncPolicy.syncOptions.CreateNamespace=true

Stellt sicher, dass ein Namespace (angegeben in spec.destination.namespace) automatisch auf unserem Cluster erstellt wird, wenn er nicht bereits existiert.

spec.syncPolicy.automated.selfHeal: true

Stellt sicher, dass alle manuellen Änderungen im Cluster (z.B. mit kubectl) eine Synchronisation mit dem Git Repo auslösen, diese manuellen Änderungen überschreiben und somit die Konsistenz zwischen dem Cluster und dem Repository-Status sicherstellen.

spec.syncPolicy.automated.prune: true

Stellt sicher, dass das Löschen einer Ressourcendefinition im Repo auch diese Ressource aus dem Kubernetes-Cluster löscht.

spec.source.repoURL

Die URL unseres Git-Repositorys, in dem sich die Deployment-Artefakte befinden.

spec.source.targetRevision.HEAD

Stellt sicher, dass der Kubernetes-Cluster mit dem neuesten Update des Git-Repositorys synchronisiert wird.

spec.source.source.path

Der Ordners im Git-Repository, in dem die yaml-Manifeste gespeichert sind.

spec.destination.server

Die Adresse des Kubernetes-Clusters, in dem wir unsere Anwendung bereitstellen. Da dies derselbe Cluster ist, auf dem Argo CD läuft, kann auf ihn über die interne DNS-Adressierung des Clusters zugegriffen werden.

spec.destination.namespace

Der Namespace im Cluster, in dem die Anwendung bereitgestellt werden soll.

Schritt 7 Einsatz der Argo-CD-Anwendung

Nachdem wir die Datei application.yaml erstellt haben, besteht der nächste Schritt darin, sie zu committen und an das entfernte Repo zu pushen. Dies können wir mit den folgenden Befehlen tun:

git add -A
git commit -m "Added application.yaml file"
git push origin master

Der letzte Schritt besteht darin, die Konfiguration application.yaml mit dem folgenden Befehl auf den Cluster anzuwenden:

kubectl apply -f application.yaml

Schritt 8 Anzeigen der bereitgestellten Ressourcen

Nachdem Sie die obigen Schritte durchgeführt haben, wechseln Sie zum Argo CD UI. Wir können sehen, dass unsere Anwendung in der Liste der Anwendungen erscheint und dass der Status, der auf den Cluster angewendet werden soll, ordnungsgemäß aus dem Git Repository erfasst wurde. Es wird ein paar Minuten dauern, bis die Bereitstellung der Ressourcen auf dem Cluster abgeschlossen ist:

../_images/image-2024-5-22_10-23-58.png

Dies ist die Ansicht unserer Anwendung, nachdem die Bereitstellung ordnungsgemäß durchgeführt wurde:

../_images/image-2024-5-22_10-27-25.png

Wenn wir die Anwendung anklicken, können wir auch die Details für alle Ressourcen sehen, die zu dieser Bereitstellung beitragen, und zwar sowohl die High-Level- als auch die Low-Level-Ressourcen.

../_images/image-2024-5-22_11-17-12.png

In der Standardeinstellung wird Argo CD das Git-Repository alle 3 Minuten abfragen, um den gewünschten Zustand des Clusters zu erfassen. Wenn Änderungen im Repository festgestellt werden, werden die Anwendungen auf dem Cluster automatisch mit der neuen Konfiguration neu gestartet.

Was als nächstes zu tun ist

  • Testen Sie die Anwendung von Änderungen an der Bereitstellung im Repository (z.B. übertragen Sie eine Bereitstellung mit einem anderen Image in der Container-Spezifikation), überprüfen Sie, ob ArgoCD die Änderung erfasst und den Cluster-Status ändert

  • das Deployment von Argo CD anpassen, um HTTPS zu aktivieren

  • Argo CD mit Ihrem Identitätsmanagement-Tool integrieren; für Details siehe Einsatz von Keycloak auf Kubernetes mit einer Beispielanwendung auf CODE-DE

Von Interesse ist auch der folgende Artikel: CI/CD-Pipelines mit GitLab auf CODE-DE Kubernetes - Erstellung eines Docker-Images