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

Kubernetes ist eine robuste und erprobte Umgebung für die Ausführung von Cloud-Anwendungen und Diensten. Dennoch kann es zeitaufwändig sein, alle für eine produktionsreife Bereitstellung erforderlichen Ressourcen manuell bereitzustellen. In diesem Artikel wird Helm als Paketmanager für Kubernetes vorgestellt. Mit ihm können Sie komplexe Kubernetes-Anwendungen, die aus Code, Datenbanken, Benutzeroberflächen und mehr bestehen, schnell bereitstellen.

Was wir behandeln werden

  • Hintergrund - Wie Helm funktioniert

  • Helm installieren

  • Hinzufügen eines Helm-Repositorys

  • Helm-Diagramm-Repositories

  • Helm-Diagramm auf einem Cluster bereitstellen

  • Anpassen des Diagrammeinsatzes

Voraussetzungen

No. 1 Konto

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

Nr. 2 Grundlegendes Verständnis von Kubernetes

Wir gehen davon aus, dass Sie ein grundlegendes Verständnis von Kubernetes, seinen Begriffen und Arbeitsweisen haben. Sie zu erläutern, würde den Rahmen dieses Artikels sprengen.

Nr. 3 Ein Cluster erstellt auf FRA1-1 Cloud

Um die Helm-Installation und -Einrichtung in einer realen Umgebung auszuprobieren, erstellen Sie mit OpenStack Magnum Erstellen eines Kubernetes-Clusters mit CODE-DE OpenStack Magnum einen Cluster auf der FRA1-1 Cloud.

Nr. 4 Aktive Verbindung zur Cloud

Foder Kubernetes, d.h. ein kubectl Kommandozeilentool ist installiert und kubeconfig verweist auf einen Cluster. Anweisungen finden Sie in diesem Artikel So verwenden Sie die Befehlszeilenschnittstelle für Kubernetes-Cluster auf CODE-DE OpenStack Magnum.

Nr. 5 Zugang zu Ubuntu zum Ausführen von Code

Die Codebeispiele in diesem Artikel setzen voraus, dass Sie Ubuntu 20.04 LTS oder ein ähnliches Linux-System verwenden. Sie können sie ausführen auf

  • Windows mit Linux-Subsystem,

  • echten Desktop Ubuntu-Betriebssystem oder Sie können auch

  • eine virtuelle Maschine in der CODE-DE FRA1-1 Cloud erstellen und die Beispiele von dort aus ausführen. Diese Artikel bieten technisches Know-how, wenn Sie es benötigen:

Wie man eine Linux-VM erstellt und vom Windows-Desktop aus darauf zugreift auf CODE-DE

Wie man eine Linux-VM erstellt und von einer Linux-Kommandozeile auf CODE-DE zugreift

Background - How Helm works

Eine übliche Sequenz für die Bereitstellung einer Anwendung auf Kubernetes umfasst Folgendes:

  • ein oder mehrere containerisierte Anwendungsimages in einer Image-Registry verfügbar zu haben

  • Bereitstellung einer oder mehrerer Kubernetes-Ressourcen in Form von YAML-Manifestdateien auf einem Kubernetes-Cluster

Die Kubernetes-Ressourcen verweisen direkt oder indirekt auf die Container-Images. Sie können auch zusätzliche Informationen enthalten, die für die Ausführung dieser Images erforderlich sind. In einem sehr minimalen Setup würde z. B. ein NGINX-Container-Image mit einer Kubernetes-Ressource Deployment erstellt und über eine Service-Ressource in einem Netzwerk bereitgestellt werden. Eine produktive Kubernetes-Bereitstellung einer größeren Anwendung erfordert in der Regel eine Reihe von mehreren Kubernetes-Ressourcen, die auf dem Cluster bereitgestellt werden.

Für jedes Standard-Deployment einer Anwendung auf Kubernetes (z. B. eine Datenbank, ein CMS-System, eine Überwachungsanwendung) sind die Boilerplate-YAML-Manifeste meist gleich und unterscheiden sich nur durch die zugewiesenen spezifischen Werte (z. B. Ports, Endpunkte, Image-Registry, Version usw.).

Helm automatisiert daher den Prozess der Bereitstellung einer Kubernetes-Installation. Die für das Deployment verantwortliche Person muss nicht jede Ressource von Grund auf neu schreiben oder die Verbindungen zwischen den Ressourcen berücksichtigen. Stattdessen lädt er ein Helm-Diagramm herunter, das vordefinierte Ressourcenvorlagen enthält. Die Werte für die Vorlagen werden aus einer zentralen Konfigurationsdatei namens values.yaml gelesen.

Helm-Charts sind so konzipiert, dass sie eine breite Palette von Anwendungsfällen abdecken, die für den Einsatz einer Anwendung erforderlich sind. Die Anwendung kann dann einfach mit wenigen Befehlen innerhalb von Sekunden auf einem Cluster gestartet werden. Einige spezifische Anpassungen für einen individuellen Einsatz können dann leicht angepasst werden, indem die Standarddatei values.yaml überschrieben wird.

Helm installieren

Sie können Helm auf Ihrem eigenen Entwicklungsrechner installieren. Laden Sie zur Installation die Installationsdatei von der Helm-Veröffentlichungsseite herunter, ändern Sie die Dateiberechtigung und führen Sie die Installation aus:

curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
 ./get_helm.sh

Sie können die Installation überprüfen, indem Sie:

$ helm version

Für andere Betriebssysteme verwenden Sie den Link zum Herunterladen der Helm-Installationsdateien und verfahren analog.

Hinzufügen eines Helm-Repositorys

Helm-Diagramme werden über Repositories verteilt. Ein einzelnes Repository kann zum Beispiel mehrere Helm-Diagramme eines bestimmten Anbieters hosten. Für diesen Artikel fügen wir das Bitnami-Repository hinzu, das die Versionen mehrerer nützlicher Helm-Diagramme enthält, z. B. Redis, Grafana, Elasticsearch oder andere. Sie können es mit folgendem Befehl ausführen:

helm repo add bitnami https://charts.bitnami.com/bitnami

Überprüfen Sie dann die verfügbaren Diagramme in diesem Repository, indem Sie sie ausführen:

helm search repo

Das folgende Bild zeigt nur einen Anfang aller verfügbaren Anwendungen aus dem bitnami-Repository, die mit Helm installiert werden können:

../_images/search_repo.png

Helmkarten-Repositories

Im obigen Beispiel wussten wir, wo wir ein Repository mit Helm-Diagrammen finden können. Es gibt noch weitere Repositorys, die normalerweise auf GitHub oder ArtifactHub gehostet werden. Werfen wir einen Blick auf die apache-Seite in ArtifactHUB:

../_images/apache_bitnami.png

Klicken Sie auf die Option DEFAULT VALUES (gelb hervorgehoben) und sehen Sie den Inhalt der Standarddatei values.yaml.

../_images/parameters.png

In dieser Datei (oder in zusätzlichen tabellarischen Informationen auf der Diagrammseite) können Sie überprüfen, welche Parameter für die Anpassung aktiviert sind und welche ihre Standardwerte sind.

Prüfen Sie, ob kubectl Zugriff auf den Cluster hat

Um fortzufahren, überprüfen Sie, ob Ihre Umgebungsvariable KUBECONFIG exportiert wurde und auf die kubeconfig-Datei eines laufenden Clusters verweist (siehe Voraussetzung Nr. 4). Falls erforderlich, exportieren Sie diese Umgebungsvariable:

export KUBECONFIG = <location-of-your-kubeconfig-file>

Wenn kubectl ordnungsgemäß installiert ist, sollten Sie nun in der Lage sein, die Knoten Ihres Clusters aufzulisten:

kubectl get nodes

Dies dient als Bestätigung, dass Sie Zugriff auf den Cluster haben.

Bereitstellen eines Helm-Diagramms auf einem Cluster

Da wir nun wissen, wo wir Repositories mit Hunderten von Diagrammen zur Auswahl finden, können wir eines davon in unserem Cluster einsetzen.

Wir werden ein Apache-Webserver-Helm-Diagramm installieren. Um es mit einer Standardkonfiguration zu installieren, müssen wir einen einzigen Befehl ausführen:

helm install my-apache bitnami/apache

Beachten Sie, dass my-apache sich auf die konkrete Version bezieht, d. h. auf die konkrete Bereitstellung, die auf unserem Cluster läuft. Wir können diesen Namen nach Belieben anpassen. Nach dem Ausführen des obigen Befehls wird das Diagramm bereitgestellt und es werden einige Informationen über unsere Version bereitgestellt:

NAME: my-apache
LAST DEPLOYED: Tue Jan 31 10:48:07 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: apache
CHART VERSION: 9.2.11
APP VERSION: 2.4.55
....

Infolgedessen werden mehrere Kubernetes-Ressourcen auf dem Cluster bereitgestellt. Eine davon ist der Kubernetes-Dienst, der standardmäßig als LoadBalancer-Typ bereitgestellt wird. Auf diese Weise wird Ihre Apache-Bereitstellung sofort mit einer in der Zelle <EXTERNAL-IP> verfügbaren schwebenden IP am Standardport 80 öffentlich zugänglich gemacht:

$ kubectl get services
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                      AGE
...
my-apache    LoadBalancer   10.254.147.21   64.225.131.111   80:32654/TCP,443:32725/TCP   5m

Beachten Sie, dass es einige Minuten dauern kann, bis die freie IP-Generierung erscheint. Nach dieser Zeit, wenn Sie die freie IP in den Browser eingeben, wird der Dienst im Internet verfügbar sein:

../_images/apache_ip.png

Anpassen der Chart-Bereitstellung

Wir haben gerade gesehen, wie schnell es war, ein Helm-Diagramm mit den Standardeinstellungen einzusetzen. Bevor Sie das Diagramm in der Produktion einsetzen, müssen Sie in der Regel einige Einstellungen anpassen, um Ihren Anforderungen gerecht zu werden.

Um den Einsatz anzupassen, wäre ein schneller, einfacher Ansatz die Bereitstellung von Flags in der Helm-Befehlszeile, um bestimmte Parameter anzupassen. Das Problem dabei ist, dass jede Kommandozeilenoption 10-20 verfügbare Flags hat, so dass dieser Ansatz auf lange Sicht vielleicht nicht der beste ist.

Ein universellerer Ansatz besteht jedoch darin, die Datei values.yaml anzupassen. Dafür gibt es zwei Hauptmethoden:

Kopieren der gesamten values.yaml-Datei

Hier passen Sie nur den Wert eines bestimmten Parameters an.

Neue values.yaml-Datei von Grund auf neu erstellen

Sie würde nur die angepassten Parameter mit ihren überschriebenen Werten enthalten.

In beiden Fällen bleiben alle Standardwerte, mit Ausnahme der überschriebenen Werte, erhalten.

Als Beispiel für die Anpassung des Diagramms wollen wir den Apache-Webserver auf Port 8080 statt auf dem Standardport 80 bereitstellen. Wir werden den zweiten Ansatz verwenden und eine minimale Datei my-values.yaml für die Überschreibungen bereitstellen. Der Inhalt dieser Datei sieht wie folgt aus:

my-values.yaml

service:
  ports:
    http: 8080

Achten Sie bei diesen Anpassungen auf die Einrückung und die YAML-Struktur, die auch die jeweiligen übergeordneten Blöcke im Baum angibt.

Eine weitere Anpassung, die wir vornehmen werden, ist die Erstellung eines dedizierten Namespace apache für unser Helm-Release und die Anweisung an Helm, diesen Namespace zu verwenden. Eine solche Anpassung ist durchaus üblich, um die Artefakte zu trennen, die sich auf eine bestimmte Version/Applikation beziehen.

Wenden Sie die genannten Anpassungen mit dem folgenden Befehl auf die Veröffentlichung my-custom-apache an:

helm install my-custom-apache bitnami/apache --values my-values.yaml --namespace custom-apache --create-namespace

In ähnlicher Weise wie im vorherigen Beispiel wird der Dienst ausgesetzt. Um auf die floating IP des Dienstes zuzugreifen, verweisen Sie diesmal auf den neu erstellten Namespace custom-apache:

kubectl get services -n custom-apache
NAME               TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                        AGE
my-custom-apache   LoadBalancer   10.254.230.171   64.225.135.161  8080:31150/TCP,443:30139/TCP   3m51s

Wir können sehen, dass die Anwendung nun einem neuen Port 8080 zugewiesen ist, der auch im Browser überprüft werden kann:

../_images/trag_8080.png

Was als nächstes zu tun ist

Einsatz anderer nützlicher Dienste mit Helm-Diagrammen: Argo Workflows, JupyterHub, Vault , die neben vielen anderenverfügbar sind.

Denken Sie daran, dass ein mit Helm eingesetztes Diagramm letztendlich nur ein Satz von Kubernetes-Ressourcen ist. Normalerweise gibt es in den verfügbaren Open-Source-Diagrammen eine beträchtliche Menge an konfigurierbaren Einstellungen. Genauso gut können Sie andere Parameter auf einem bereits bereitgestellten Cluster bearbeiten und sogar die Vorlagen an Ihren speziellen Anwendungsfall anpassen.

Der folgende Artikel zeigt, wie man das JetStack-Repositorium verwendet, um CertManager zu installieren, mit dem man HTTPS-Dienste in der Kubernetes-Cloud bereitstellen kann: /kubernetes/Deploying-HTTPS-Services-on-Magnum-Kubernetes-in-{{ brand_name_cloud }}-Cloud