Mit Kustomize skalieren

1. Zielsetzungen

Kustomize ist ein Tool, das eine vorlagenfreie Möglichkeit zum Anpassen der Anwendungskonfiguration bietet, was die Nutzung standardmäßiger Anwendungen vereinfacht. Es ist als eigenständiges Dienstprogramm verfügbar und über kubectl apply -k in kubectl integriert. Es kann als eigenständige Befehlszeile verwendet werden. Weitere Informationen finden Sie unter kustomize.io.

In dieser Anleitung lernen Sie einige der Kernkonzepte von Kustomize durch und verwenden Kustomize zum Verwalten von Variationen in den Anwendungen und Umgebungen.

Sie werden Folgendes tun:

  • Kustomize-Befehlszeilenclient verwenden
  • Gängige Elemente überschreiben
  • Größere YAML-Strukturen patchen
  • Mehrere Overlay-Ebenen nutzen

2. Arbeitsbereich wird vorbereitet

  1. Öffnen Sie den Cloud Shell-Editor. Rufen Sie dazu die folgende URL auf

https://ide.cloud.google.com

  1. Erstellen Sie im Terminalfenster ein Arbeitsverzeichnis für diese Anleitung

mkdir kustomize-lab

  1. Wechseln Sie zum Verzeichnis und legen Sie den IDE-Arbeitsbereich fest.

cd kustomize-lab && cloudshell workspace .

3. Kustomize-Befehlszeilenclient verwenden

Die Leistungsfähigkeit von Kustomize liegt in der Möglichkeit, Kubernetes-Basis-YAMLs mit benutzerdefinierten Werten zu überlagern und zu ändern. Dazu ist eine Basisdatei mit Anweisungen zum Speicherort der Dateien und zu den zu überschreibenden Dateien erforderlich. Kustomize ist in der Kubernetes-Umgebung enthalten und kann mit verschiedenen Methoden ausgeführt werden.

In diesem Abschnitt erstellen Sie eine benutzerdefinierte Basiskonfiguration und verarbeiten die Dateien mit dem eigenständigen Kustomize-Befehlszeilenclient.

  1. Zuerst erstellen Sie einen Ordner für Ihre Basiskonfigurationsdateien

mkdir -p chat-app/base

  1. Einfache Kubernetes-deployment.yaml im Basisordner erstellen

cat <<EOF > chat-app/base/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`metadata:`

  `name: chat-app`

`spec:`

  `containers:`

  `- name: chat-app`

    `image: chat-app-image`

EOF

  1. Basis-kustomization.yaml erstellen

Kustomize sucht nach einer Datei namens „kustomization.yaml“ als Einstiegspunkt. Diese Datei enthält Verweise auf die verschiedenen Basis- und Überschreibungsdateien sowie auf spezifische Überschreibungswerte.

Erstellen Sie eine kustomization.yaml-Datei, die auf deployment.yaml als Basisressourcen verweist.

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

EOF

  1. Führen Sie den Befehl „kustomize“ für den Basisordner aus. Dadurch werden die YAML-Bereitstellungsdateien ohne Änderungen ausgegeben, was erwartet wird, da Sie noch keine Varianten hinzugefügt haben.

kustomize build chat-app/base

Dieser eigenständige Client kann mit dem kubectl-Client kombiniert werden, um die Ausgabe direkt anzuwenden, wie im folgenden Beispiel gezeigt. Dadurch wird die Ausgabe des Build-Befehls direkt in den Befehl "kubectl apply" gestreamt.

(Nicht ausführen – nur zu Referenzzwecken enthalten)

kustomize build chat-app/base | kubectl apply -f -

Diese Technik ist nützlich, wenn eine bestimmte Version des Kustomize-Clients benötigt wird.

Alternativ kann kustomize mit dem in kubectl integrierten Tool ausgeführt werden. Wie im folgenden Beispiel.

(Nicht ausführen – nur zu Referenzzwecken enthalten)

kubectl apply -k chat-app/base

4. Allgemeine Elemente überschreiben

Nachdem Sie den Arbeitsbereich konfiguriert und überprüft haben, ob Kustomize funktioniert, können Sie einige der Basiswerte überschreiben.

Images, Namespaces und Labels werden sehr häufig für jede Anwendung und Umgebung angepasst. Da sie häufig geändert werden, können Sie sie mit Kustomize direkt in kustomize.yaml deklarieren, sodass für diese häufigen Szenarien nicht viele Patches erstellt werden müssen.

Diese Technik wird häufig verwendet, um eine bestimmte Instanz einer Vorlage zu erstellen. Ein Basissatz von Ressourcen kann jetzt für mehrere Implementierungen verwendet werden. Dazu müssen lediglich der Name und der Namespace geändert werden.

In diesem Beispiel fügen Sie einen Namespace und ein Namenspräfix hinzu und fügen einige Labels zu Ihrem kustomization.yaml hinzu.

  1. Aktualisieren Sie die Datei kustomization.yaml, um gängige Labels und Namespaces aufzunehmen.

Kopieren Sie die folgenden Befehle in Ihr Terminal und führen Sie sie aus

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

namespace: my-namespace

nameprefix: my-

commonLabels:

app: my-app

EOF

  1. Build-Befehl ausführen

Die Ausführung des Builds an dieser Stelle zeigt, dass die resultierende YAML-Datei nun den Namespace, die Labels und die Präfixnamen sowohl in den Dienst- als auch in den Deployment-Definitionen enthält.

kustomize build chat-app/base

Die Ausgabe enthält Labels und Namespaces, die nicht in der YAML-Datei für die Bereitstellung enthalten sind. Beachte auch, wie der Name von „chat-app“ in „my-chat-app“ geändert wurde.

(Ausgabe, nicht kopieren)

kind: Deployment

metadata:

labels:

`app: my-app`

name: my-chat-app

namespace: my-namespace

5. Größere YAML-Strukturen patchen

Kustomize bietet außerdem die Möglichkeit, Patches anzuwenden, die die Basisressourcen überlagern. Diese Technik wird häufig verwendet, um für Variabilität zwischen Anwendungen und Umgebungen zu sorgen.

In diesem Schritt erstellen Sie Umgebungsvariationen für eine einzelne Anwendung, die dieselben Basisressourcen verwenden.

  1. Erstellen Sie zuerst Ordner für die verschiedenen Umgebungen

mkdir -p chat-app/dev

mkdir -p chat-app/prod

  1. Schreiben Sie den Stage-Patch mit dem folgenden Befehl

cat <<EOF > chat-app/dev/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`spec:`

  `containers:`

  `- name: chat-app`

    `env:`

    `- name: ENVIRONMENT`

      `value: dev`

EOF

  1. Schreiben Sie nun den prod-Patch mit folgendem Befehl:

cat <<EOF > chat-app/prod/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`spec:`

  `containers:`

  `- name: chat-app`

    `env:`

    `- name: ENVIRONMENT`

      `value: prod`

EOF

Beachten Sie, dass die Patches oben nicht den Namen des Container-Images enthalten. Dieser Wert wird in der Datei base/deployment.yaml angegeben, die Sie im vorherigen Schritt erstellt haben. Diese Patches enthalten jedoch eindeutige Umgebungsvariablen für Entwicklung und Produktion.

  1. Kustomize-YAML-Dateien für das Basisverzeichnis implementieren

Schreiben Sie die Basiskonfiguration „kustomization.yaml“ um und entfernen Sie den Namespace und das Namenspräfix, da dies nur die Basiskonfiguration ohne Variation ist. Diese Felder werden gleich in die Umgebungsdateien verschoben.

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- deployment.yaml

commonLabels:

app: chat-app

EOF

  1. Kustomize-YAML-Dateien für das Entwicklungsverzeichnis implementieren

Implementieren Sie nun die Varianten für „dev“ und „prod“, indem Sie die folgenden Befehle in Ihrem Terminal ausführen.

cat <<EOF > chat-app/dev/kustomization.yaml

bases:

- ../base

namespace: dev

nameprefix: dev-

commonLabels:

env: dev

patches:

- deployment.yaml

EOF

Beachten Sie, dass der Datei der Abschnitt patches hinzugefügt wurde. Dies gibt an, dass Kustomize diese Dateien über die Basisressourcen legen soll.

  1. YAML-Dateien von Kustomize für das Verzeichnis „prod“ implementieren

cat <<EOF > chat-app/prod/kustomization.yaml

bases:

- ../base

namespace: prod

nameprefix: prod-

commonLabels:

env: prod

patches:

- deployment.yaml

EOF

  1. Führen Sie kustomize aus, um die Dateien zusammenzuführen.

Nachdem Sie die Basis- und Umgebungsdateien erstellt haben, können Sie den Kustomize-Prozess ausführen, um die Basisdateien zu patchen.

Führen Sie den folgenden Befehl für dev aus, um das zusammengeführte Ergebnis anzuzeigen.

kustomize build chat-app/dev

Beachten Sie, dass die Ausgabe zusammengeführte Ergebnisse wie Labels aus Basis- und Entwicklungskonfigurationen sowie den Container-Image-Namen aus der Basis- und die Umgebungsvariable aus den Entwicklungsordnern enthält.

6. Verwenden mehrerer Overlay-Ebenen

Viele Organisationen haben ein Team, das die App-Teams unterstützt und die Plattform verwaltet. Häufig werden diese Teams bestimmte Details angeben wollen, die in allen Anwendungen in allen Umgebungen enthalten sein sollen, z. B. einen Logging-Agent.

In diesem Beispiel erstellen Sie einen shared-kustomize-Ordner und Ressourcen, die von allen Anwendungen und unabhängig von der Umgebung, in der sie bereitgestellt werden, enthalten sind.

  1. Ordner "shared-kustomize" erstellen

mkdir shared-kustomize

  1. Einfache deployment.yaml im freigegebenen Ordner erstellen

cat <<EOF > shared-kustomize/deployment.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

name: app

spec:

template:

`spec:`

  `containers:`

  `- name: logging-agent`

    `image: logging-agent-image`

EOF

  1. kustomization.yaml im freigegebenen Ordner erstellen

cat <<EOF > shared-kustomize/kustomization.yaml

bases:

- deployment.yaml

EOF

  1. In Ihrer Anwendung auf den Ordner „shared-kustomize“ verweisen

Da der Ordner shared-kustomize die Basis für alle Ihre Anwendungen sein soll, müssen Sie chat-app/base/kustomization.yaml aktualisieren, um shared-kustomize als Basis zu verwenden. Patchen Sie dann die eigene Datei "deployment.yaml" oben. Zusätzlich werden die Umgebungsordner dann wieder gepatcht.

Kopieren Sie die folgenden Befehle in Ihr Terminal und führen Sie sie aus

cat <<EOF > chat-app/base/kustomization.yaml

bases:

- ../../shared-kustomize

commonLabels:

app: chat-app

patches:

- deployment.yaml

EOF

  1. Kustomize ausführen und zusammengeführte Ergebnisse für Dev ansehen

kustomize build chat-app/dev

Beachten Sie, dass die Ausgabe zusammengeführte Ergebnisse aus der Anwendungsbasis, der Anwendungsumgebung und den Ordnern shared-kustomize enthält. Insbesondere sehen Sie im Containerbereich Werte von allen drei Speicherorten.

(Ausgabe wird nicht kopiert)

<pre>

`containers:`

      `- env:`

        `- name: ENVIRONMENT`

          `value: dev`

        `name: chat-app`

      `- image: image`

        `name: app`

      `- image: logging-agent-image`

        `name: logging-agent`

</pre>