Zum Inhalt

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:

  1. Replica Count: Die Anzahl der Pods soll konfigurierbar sein (Standard: 2).
  2. Service Type: Der Typ des Kubernetes Services soll konfigurierbar sein (z.B. ClusterIP oder NodePort. 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 replicas durch den Wert aus deiner values.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 type des Services (z.B. ClusterIP oder NodePort) 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

  1. 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.yaml ersetzt wurden.

  2. Installation: Installiere das Chart in deinen Cluster.

    helm install mein-webserver ./my-nginx-chart
    
  3. 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
    
  4. Ü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.