it-wiki:kubernetes:deployments_mit_kustomize
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
it-wiki:kubernetes:deployments_mit_kustomize [2024/03/13 11:35] – [KUSTOMIZE] marko | it-wiki:kubernetes:deployments_mit_kustomize [2024/03/13 12:33] (aktuell) – [Fazit] marko | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Parametrisierte Kubernetes Deployments mit kustomize ====== | ====== Parametrisierte Kubernetes Deployments mit kustomize ====== | ||
- | kustomize ermöglicht die Anpassung von Kubernetes-Deployments zur Erzeugung mehrerer Varianten (z. B. für unterschiedliche | + | In Kubernetes |
+ | Wie funktioniert Kustomize? Bevor wir uns mit dieser Frage beschäftigen, | ||
- | Jegliche Ressourcen in Kubernetes werden als YAML-Dateien definiert und per " | + | In unserem Szenario läuft auf unserer Dev-Umgebung bisher ein Service, welcher über das HTTP-Protokoll auf Port 80 erreichbar ist. Dieser Service soll nun auch auf der Testumgebung erreichbar sein, dort allerdings aus Sicherheitsgründen über HTTPS auf dem Port 443. Um dies umzusetzen, muss für jede Umgebung |
- | Diese " | + | ==== Konfiguration für die Dev-Umgebung: |
- | + | < | |
- | ===== DAS ORIGINAL | + | kind: Service |
- | Schauen wir uns die Alternativen Schritt für Schritt an. Ein simples Deployment eines Alpine-Linux sieht bspw. so aus: | + | apiVersion: v1 |
- | < | + | |
- | apiVersion: | + | |
- | kind: Deployment | + | |
metadata: | metadata: | ||
- | name: my-app | + | name: env-anzeige-frontend-https |
spec: | spec: | ||
- | | + | |
selector: | selector: | ||
- | | + | app: env-anzeige-frontend |
- | | + | |
- | | + | - name: http |
- | | + | port: 80 |
- | labels: | + | |
- | app: my-app | + | |
- | spec: | + | |
- | containers: | + | |
- | | + | |
- | | + | |
- | tty: true | + | |
- | stdin: true | + | |
- | env: | + | |
- | - name: foo | + | |
- | value: bar | + | |
- | resources: | + | |
- | limits: | + | |
- | memory: " | + | |
- | cpu: " | + | |
</ | </ | ||
- | Hier ist nichts parametrisiert - diese YAML-Datei ist konform zur Kubernetes API-Spezifikation und wird somit direkt vom API-Server akzeptiert. Schreibt man eine solche YAML-Datei in einer IDE wie Visual Studio Code oder IntelliJ, kann man sich über Features wie Auto-Completion freuen. | + | ==== Konfiguration für die Testumgebung mit geänderten Porteinstellungen: |
- | + | < | |
- | ===== HELM ===== | + | kind: Service |
- | Helm nutzt das Templating-System von Go und bündelt mehrere zusammengehörige Template-Dateien zu sog. Charts - häufig bleibt es ja nicht bei einem Deployment, sondern es gesellen sich noch weitere YAML-Dateien für Services, Ingresses, Secrets usw. hinzu, bevor daraus ein fachlich vollständiges Deployment-Paket wird. Mit dem Kommando helm create < | + | apiVersion: v1 |
- | + | ||
- | < | + | |
- | # File: helm/ | + | |
- | + | ||
- | apiVersion: | + | |
- | kind: Deployment | + | |
metadata: | metadata: | ||
- | name: {{ include "my-app.fullname" | + | name: env-anzeige-frontend-https |
- | labels: | + | |
- | {{ include "my-app.labels" | + | |
spec: | spec: | ||
- | | + | |
selector: | selector: | ||
- | | + | app: env-anzeige-frontend |
- | | + | ports: |
- | | + | - name: https |
- | | + | |
- | metadata: | + | |
- | labels: | + | |
- | app.kubernetes.io/ | + | |
- | app.kubernetes.io/ | + | |
- | | + | |
- | {{- with .Values.imagePullSecrets }} | + | |
- | imagePullSecrets: | + | |
- | {{- toYaml . | nindent 8 }} | + | |
- | {{- end }} | + | |
- | containers: | + | |
- | - name: {{ .Chart.Name }} | + | |
- | image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" | + | |
- | imagePullPolicy: | + | |
- | tty: {{ .Values.tty }} | + | |
- | stdin: {{ .Values.stdin }} | + | |
- | env: | + | |
- | {{- toYaml .Values.env | nindent 12 }} | + | |
- | resources: | + | |
- | {{- toYaml .Values.resources | nindent 12 }} | + | |
- | {{- with .Values.nodeSelector }} | + | |
- | nodeSelector: | + | |
- | {{- toYaml . | nindent 8 }} | + | |
- | {{- end }} | + | |
- | {{- with .Values.affinity }} | + | |
- | affinity: | + | |
- | {{- toYaml . | nindent 8 }} | + | |
- | {{- end }} | + | |
- | {{- with .Values.tolerations }} | + | |
- | tolerations: | + | |
- | {{- toYaml . | nindent 8 }} | + | |
- | {{- end }} | + | |
</ | </ | ||
- | Lesbarkeit? Hm. | + | Um den Service für die Testumgebung zu konfigurieren, |
- | IDE-Unterstützung wie Auto-Completion? | + | Kustomize kann diese Probleme lösen, indem es die Anpassung bestehender Ressourcen vereinfacht und automatisiert. Dabei arbeitet Kustomize nach einem einfachen Grundkonzept: |
+ | \\ | ||
- | Ach so, zu der Template-Datei gehört natürlich noch eine values.yaml-Datei mit den Werten für die Platzhalter: | + | {{ :it-wiki:kubernetes: |
- | <code bash> | + | \\ |
- | # File: helm/my-app/values.yaml | + | |
+ | Schauen wir uns einmal an, wie wir unser Beispiel mit den Porteinstellungen in Kustomize umsetzen können. Als Erstes muss eine //kustomization.yaml// angelegt werden, welche alle benötigten Ressourcen und die zu verwendenden Patches auflistet. | ||
- | replicaCount: | + | <code yaml> |
- | + | # | |
- | image: | + | |
- | repository: alpine:3.10 | + | |
- | tag: stable | + | |
- | pullPolicy: IfNotPresent | + | |
- | + | ||
- | tty: true | + | |
- | stdin: true | + | |
- | + | ||
- | env: | + | |
- | - name: foo | + | |
- | value: bar | + | |
- | + | ||
resources: | resources: | ||
- | limits: | + | - service.yaml |
- | cpu: 100m | + | |
- | memory: 64Mi | + | |
</ | </ | ||
- | Eigentlich haben wir jetzt - neben dem sperrigen Template - eine values.yaml-Datei, die fast genauso groß ist wie das Original. Hm. | + | <code yaml> |
+ | # | ||
+ | bases: | ||
+ | - ../../base | ||
+ | patches: | ||
+ | - service-ports.yaml | ||
+ | </ | ||
- | Das Problem der Wartbarkeit kann man sich an dem kleinen Beispiel bereits vorstellen, wächst aber mit der Größe des jeweiligen Projektes. Das Deployment unserer vPW-Showcase-Umgebung besteht bspw. aus knapp 90 Template-Dateien mit über 3000 Zeilen Code, wobei externe Abhängigkeiten wie Elasticsearch, | + | {{ :it-wiki: |
- | ===== KUSTOMIZE ===== | + | Durch Patches können einzelne YAML-Attribute einer Konfiguration hinzugefügt oder überschrieben werden. Hierzu wird eine neue YAML-Datei angelegt, welche den Namen der zu patchenden Ressource und alle zu ändernden Attribute beinhaltet. |
- | Was macht kustomize nun anders? | + | |
- | * **Keine Templates: | + | <code yaml> |
- | | + | # |
- | * **Praktische Features:** Typische Use-Cases wie "alle Ressourcen sollen ein bestimmtes Label erhalten und in einen angegebenen Namespace deployed werden" | + | kind: Service |
- | | + | apiVersion: v1 |
- | | + | metadata: |
- | \\ | + | |
- | \\ | + | name: env-anzeige-frontend-https |
- | === OVERLAYS === | + | spec: |
- | Statt Templates verwendet kustomize sog. Overlays. Die Idee: Man definiert eine Basis-Version der YAML-Dateien (" | + | |
+ | | ||
+ | port: 443 | ||
+ | </code> | ||
- | {{ :it-wiki:kubernetes: | + | Durch die Erstellung von Patch-Dateien können einzelne YAML-Attribute einer Konfiguration hinzugefügt oder überschrieben werden. Um anspruchsvollere Veränderungen an den Dateien durchzuführen, |
- | \\ | + | |
- | === ORDNERSTRUKTUR === | + | ^JSON6902 Operator ^Beschreibung^ |
- | Der Code zum folgenden Beispiel ist vollständig auf GitHub verfügbar: https:// | + | | Add | fügt ein Attribut am angegebenen Pfad hinzu | |
+ | | Remove | entfernt ein Attribut | | ||
+ | | Replace | überschreibt das Attribut am angegebenen Pfad mit einem neuen Wert | | ||
+ | | Move | verschiebt ein Attribut an einen anderen Pfad | | ||
+ | | Copy | kopiert ein Attribut und fügt es an einem anderen Pfad wieder ein | | ||
+ | | Test | überprüft, | ||
- | Die Verzeichnisstruktur kann grundsätzlich frei gewählt | + | Im Folgenden wird der Service-Patch mit der JSON-Methode durchgeführt: |
+ | <code yaml> | ||
+ | # | ||
+ | patchesJson6902: | ||
+ | - target: | ||
+ | version: v1 | ||
+ | kind: Service | ||
+ | name: env-anzeige-frontend-https | ||
+ | path: service-patch.yaml | ||
+ | </ | ||
+ | |||
+ | <code yaml> | ||
+ | # | ||
+ | - op: replace | ||
+ | path: / | ||
+ | value: | ||
+ | - name: https | ||
+ | port: 443 | ||
+ | </ | ||
+ | |||
+ | Die herkömmlichen Patches haben einen kleineren Funktionsumfang als der JSON-Patch, dadurch sind sie aber auch lesbarer. Außerdem reichen die Operationen hinzufügen und überschreiben für die meisten Anwendungsfälle völlig aus. Ein JSON-Patch sollte daher nur verwendet | ||
+ | |||
+ | Nachdem wir unsere Patches in Kustomize deklariert haben, können wir nun die einsetzbaren YAML-Konfigurationen erstellen. Kustomize ist fest in der aktuellen Version von kubectl implementiert. Mit dem Befehl **kubectl kustomize** kann die gepatchte YAML Konfigurationen ausgeben lassen. | ||
+ | |||
+ | <code bash>> | ||
+ | <code yaml> | ||
+ | apiVersion: v1 | ||
+ | kind: Service | ||
+ | metadata: | ||
+ | name: env-anzeige-frontend-https | ||
+ | spec: | ||
+ | ports: | ||
+ | - name: https | ||
+ | nodePort: 30951 | ||
+ | port: 443 | ||
+ | selector: | ||
+ | app: env-anzeige-frontend | ||
+ | type: LoadBalancer | ||
+ | </ | ||
+ | |||
+ | Alternativ können die Ressourcen mit dem Befehl **kubectl apply -k** ohne Zwischenschritt direkt in das Cluster geladen werden. | ||
<code bash> | <code bash> | ||
- | ~/my-app | + | > kubectl apply -k ./overlays/test/ |
- | ├── base | + | service/ |
- | │ | + | |
- | │ | + | |
- | └── | + | |
- | | + | |
- | │ | + | |
- | │ | + | |
- | │ | + | |
- | │ | + | |
- | └── dev | + | |
- | │ | + | |
- | │ | + | |
- | └── ... | + | |
</ | </ | ||
- | * ./base: Als Verzeichnis für die originalen Kubernetes YAMl-Dateien. | ||
- | * ./ | ||
- | === ./ | + | \\ |
- | Neben der originalen deployment.yaml-Datei (siehe oben), müssen wir noch eine kustomization.yaml-Datei anlegen. Letztlich enthält sie einfach nur eine Liste aller Ressourcen, die von kustomize berücksichtigt werden sollen. | + | ===== Fazit ===== |
+ | Kustomize vereinfacht den Konfigurationsprozess für verschiedene Umgebungen erheblich. Weitere Vorteile |
it-wiki/kubernetes/deployments_mit_kustomize.1710329731.txt.gz · Zuletzt geändert: von marko