Lab 24: Challenge: Helm Chart von Grund auf erstellen¶
In dieser Challenge wirst dein eigenes von Null an erstellen.
Das Ziel ist es, ein Deployment für einen Webserver (NGINX) und einen dazugehörigen Service zu paketieren. Dabei sollen
bestimmte Werte über die values.yaml konfigurierbar sein.
Vorbereitung: Ordnerstruktur¶
Ein Helm Chart ist im Grunde nur eine Verzeichnisstruktur mit Textdateien. Erstelle bitte folgende Ordnerstruktur in deinem Arbeitsverzeichnis:
my-nginx-chart/
└── templates/
Aufgabe 1: Metadaten (Chart.yaml)¶
Jedes Helm Chart benötigt eine Chart.yaml, die Metadaten über das Chart enthält. Erstelle die Datei
my-nginx-chart/Chart.yaml mit folgendem Inhalt:
apiVersion: v2
name: my-nginx
description: Ein einfaches Nginx Helm Chart
type: application
version: 0.1.0
appVersion: "1.16.0"
Aufgabe 2: Konfiguration (values.yaml)¶
In der values.yaml definieren wir Standardwerte, die unsere Templates nutzen sollen. Erstelle eine Datei
my-nginx-chart/values.yaml mit folgenden Inhalt:
# Hier die Anzahl der Replicas definieren
replicaCount: 2
service:
# Hier den Typ definieren (ClusterIP oder NodePort)
type: ClusterIP
port: 80
Damit machen wir die folgenden Einstellungen konfigurierbar:
- Replica Count: Die Anzahl der Pods soll konfigurierbar sein (Standard:
2). - Service Type: Der Typ des Kubernetes Services soll konfigurierbar sein (z.B.
ClusterIPoderNodePort. Standard:ClusterIP).
Aufgabe 3: Deployment Template¶
Nun erstellen wir das Template für das Deployment. Erstelle die Datei my-nginx-chart/templates/deployment.yaml.
Anforderungen:
- Nutze ein Standard Kubernetes Deployment für
nginx. - Ersetze die harte Kodierung der
replicasdurch den Wert aus deinervalues.yaml. Die Syntax dafür ist{{ .Values.replicaCount }}.
Deine Datei könnte ähnlich aussehen wie folgt:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 10
periodSeconds: 20
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
Aufgabe 4: Service Template¶
Erstelle die Datei my-nginx-chart/templates/service.yaml.
Anforderungen:
- Es soll ein Service erstellt werden, der auf das Deployment zeigt.
- Der
typedes Services (z.B.ClusterIPoderNodePort) muss dynamisch aus den Values geladen werden ({{ .Values.service.type }}).
Hier ist ein Beispiel:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: {{ .Values.service.type }}
Aufgabe 5: Testen und Installieren¶
-
Validierung (Dry-Run): Schau dir an, was Helm generieren würde, ohne es zu installieren. Das hilft, Syntaxfehler zu finden.
helm template ./my-nginx-chartÜberprüfe in der Ausgabe, ob deine Platzhalter korrekt durch die Werte aus der
values.yamlersetzt wurden. -
Installation: Installiere das Chart in deinen Cluster.
helm install mein-webserver ./my-nginx-chart -
Testen der Konfigurierbarkeit: Versuche nun, ein Upgrade durchzuführen und dabei Werte zu überschreiben (z.B. 3 Replicas und NodePort), ohne die Dateien zu ändern:
helm upgrade mein-webserver ./my-nginx-chart --set replicaCount=3 --set service.type=NodePort -
Überprüfung: Prüfe mit
kubectl get all, ob nun 3 Pods laufen und der Service vom Typ NodePort ist.
Bonusaufgabe¶
Mache auch noch den Image-Tag von NGINX als Helm-Value konfigurierbar.