Mit Kustomize skalieren

1. Ziele

Kustomize ist ein Tool, mit dem sich Anwendungskonfigurationen ohne Vorlagen anpassen lassen. Dadurch wird die Verwendung von Standardanwendungen vereinfacht. Es ist als eigenständiges Dienstprogramm verfügbar und über kubectl apply -k in kubectl integriert. Es kann aber auch als eigenständige CLI verwendet werden. Weitere Informationen finden Sie unter kustomize.io.

In dieser Anleitung werden einige der wichtigsten Konzepte von Kustomize behandelt. Sie verwenden Kustomize, um Variationen in den Anwendungen und Umgebungen zu verwalten.

Sie werden Folgendes tun:

  • kustomize-Befehlszeilenclient verwenden
  • Häufig verwendete Elemente überschreiben
  • Größere YAML-Strukturen patchen
  • Mehrere Overlay-Ebenen verwenden

2. Arbeitsbereich vorbereiten

  1. Öffnen Sie den Cloud Shell-Editor über die folgende URL:

https://ide.cloud.google.com

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

mkdir kustomize-lab

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

cd kustomize-lab && cloudshell workspace .

3. kustomize-Befehlszeilenclient verwenden

Die Stärke von Kustomize liegt in der Möglichkeit, Basis-YAML-Dateien für Kubernetes mit benutzerdefinierten Werten zu überlagern und zu ändern. Dazu benötigt Kustomize eine Basisdatei mit Anweisungen dazu, wo sich die Dateien befinden und was überschrieben werden soll. Kustomize ist im Kubernetes-Ökosystem enthalten und kann auf verschiedene Arten ausgeführt werden.

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

  1. Erstellen Sie zuerst einen Ordner für Ihre Basiskonfigurationsdateien.

mkdir -p chat-app/base

  1. Erstellen Sie im Basisordner eine einfache Kubernetes-Datei deployment.yaml.

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 spezifische Überschreibungswerte.

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

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

bases:

- deployment.yaml

EOF

  1. Führen Sie den Kustomize-Befehl im Basisordner aus. Dadurch werden die YAML-Dateien für die Bereitstellung ohne Änderungen ausgegeben. Das ist so vorgesehen, da Sie noch keine Varianten angegeben 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. Dadurch wird die Ausgabe des Build-Befehls direkt in den kubectl apply-Befehl übertragen.

(Do Not Execute - Included for reference only)

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 den in kubectl integrierten Tools ausgeführt werden. Wie im folgenden Beispiel.

(Do Not Execute - Included for reference only)

kubectl apply -k chat-app/base

4. Häufig verwendete Elemente überschreiben

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

Images, Namespaces und Labels werden häufig für jede Anwendung und Umgebung angepasst. Da sie häufig geändert werden, können Sie sie in Kustomize direkt in der kustomize.yaml deklarieren. So müssen Sie nicht viele Patches für diese gängigen Szenarien erstellen.

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, indem einfach der Name und der Namespace geändert werden.

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

  1. Aktualisieren Sie die kustomization.yaml-Datei, um allgemeine Labels und Namespaces einzuschließen.

Kopieren Sie die folgenden Befehle und führen Sie sie im Terminal 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

Wenn Sie den Build an dieser Stelle ausführen, sehen Sie, dass die resultierende YAML-Datei jetzt den Namespace, die Labels und die Namen mit Präfix sowohl in der Dienst- als auch in der Bereitstellungsdefinition enthält.

kustomize build chat-app/base

Beachten Sie, dass die Ausgabe Labels und Namespaces enthält, die nicht in der YAML-Datei für die Bereitstellung enthalten sind. Beachten Sie auch, dass 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

Mit Kustomize können auch Patches angewendet werden, die die Basisressourcen überlagern. Diese Technik wird häufig verwendet, um die Variabilität zwischen Anwendungen und Umgebungen zu erhöhen.

In diesem Schritt erstellen Sie Umgebungsvarianten 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 Staging-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 Produktionspatch mit dem folgenden 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 oben genannten Patches den Namen des Container-Images nicht 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 die Entwicklungs- und Produktionsumgebung.

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

Schreiben Sie die Datei „kustomization.yaml“ neu und entfernen Sie den Namespace und das Namenspräfix, da es sich nur um die Basiskonfiguration ohne Variation handelt. Diese Felder werden in Kürze 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 die Entwicklungs- und Produktionsumgebung, 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 den zusätzlichen Abschnitt patches: in der Datei. Das bedeutet, dass Kustomize diese Dateien über die Basisressourcen legen soll.

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

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

bases:

- ../base

namespace: prod

nameprefix: prod-

commonLabels:

env: prod

patches:

- deployment.yaml

EOF

  1. Kustomize ausführen, 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 die Entwicklung aus, um das zusammengeführte Ergebnis zu sehen.

kustomize build chat-app/dev

Die Ausgabe enthält zusammengeführte Ergebnisse wie Labels aus der Basis- und der Entwicklerkonfiguration sowie den Container-Image-Namen aus dem Basis- und die Umgebungsvariable aus den Entwicklerordnern.

6. Mehrere Overlay-Ebenen verwenden

Viele Organisationen haben ein Team, das die App-Teams unterstützt und die Plattform verwaltet. Häufig möchten diese Teams bestimmte Details einfügen, die in allen Apps 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 unabhängig von der Umgebung, in der sie bereitgestellt werden, eingeschlossen werden.

  1. Ordner „shared-kustomize“ erstellen

mkdir shared-kustomize

  1. Erstellen Sie eine einfache deployment.yaml im freigegebenen Ordner.

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. Auf den Ordner „shared-kustomize“ in Ihrer Anwendung verweisen

Da der Ordner shared-kustomize die Basis für alle Ihre Anwendungen sein soll, müssen Sie chat-app/base/kustomization.yaml so aktualisieren, dass shared-kustomize als Basis verwendet wird. Anschließend wird die eigene Datei „deployment.yaml“ darübergelegt. Die Umgebung werden dann noch einmal gepatcht.

Kopieren Sie die folgenden Befehle und führen Sie sie im Terminal 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 die Entwicklung ansehen

kustomize build chat-app/dev

Die Ausgabe enthält zusammengeführte Ergebnisse aus dem App-Basisordner, der App-Umgebung und den shared-kustomize-Ordnern. Im Containerbereich sehen Sie Werte von allen drei Standorten.

(Ausgabe – nicht kopieren)

<pre>

`containers:`

      `- env:`

        `- name: ENVIRONMENT`

          `value: dev`

        `name: chat-app`

      `- image: image`

        `name: app`

      `- image: logging-agent-image`

        `name: logging-agent`

</pre>