Anwendung mit Kustomize anpassen

KubernetesBeginner
Jetzt üben

Einführung

Helm verpackt Kubernetes-Vorlagen als Releases. Kustomize verfolgt einen anderen Ansatz: Es geht von gewöhnlichen Kubernetes-YAML-Dateien aus und legt Änderungen darüber, ohne Vorlagenausdrücke (Template Expressions) zu verwenden. Dies ist nützlich, wenn Sie eine gemeinsame Basis benötigen und nur kleine, umgebungsspezifische Unterschiede wie Namen, Namespaces, Replikatanzahlen oder Patches anwenden möchten.

In diesem Lab erstellen Sie ein Basis-Deployment und einen Service, rendern diese Basis mit Kustomize und erstellen anschließend ein Produktions-Overlay, das den Namen, den Namespace, die Replikatanzahl und die Anwendungsnachricht ändert. Abschließend stellen Sie das Overlay mit kubectl apply -k bereit und testen den resultierenden Service.

Kustomize-Arbeitsbereich vorbereiten

In diesem Schritt bereiten Sie einen Namespace vor und bestätigen, dass die Kustomize-Unterstützung über kubectl verfügbar ist.

Beginnen Sie im Verzeichnis /home/labex/project. Dieses Lab speichert die Basis-Manifeste und Overlay-Dateien in diesem Arbeitsbereich.

mkdir -p /home/labex/project
cd /home/labex/project

Überprüfen Sie, ob der Kubernetes-API-Server erreichbar ist. Falls die VM gerade erst gestartet wurde und der Node noch nicht bereit ist, warten Sie einige Sekunden und führen Sie den Befehl erneut aus.

kubectl get nodes --request-timeout=5s

Die erwartete Ausgabe enthält:

NAME         STATUS   ROLES           AGE   VERSION
labex-v135   Ready    control-plane   ...   v1.35...

Warten Sie, bis der Cluster-Networking-Pod bereit (Ready) ist. Da Sie am Ende des Labs einen Service testen werden, muss das Cluster-Netzwerk einwandfrei funktionieren.

kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s

Erwartete Ausgabe:

pod/calico-node-... condition met

Erstellen Sie einen Namespace namens ckad-prep-kustomize und legen Sie diesen als aktuellen Namespace fest:

kubectl create namespace ckad-prep-kustomize
kubectl config set-context --current --namespace=ckad-prep-kustomize

Bestätigen Sie den Namespace und prüfen Sie, ob kubectl kustomize verfügbar ist. kubectl kustomize rendert Kustomize-Verzeichnisse, ohne sie anzuwenden.

kubectl config view --minify --output 'jsonpath={..namespace}'; echo
kubectl kustomize --help | sed -n '1,3p'

Die erwartete Ausgabe enthält:

ckad-prep-kustomize
Build a set of KRM resources...

Wiederverwendbare Basis erstellen

In diesem Schritt erstellen Sie eine Kustomize-Basis aus gewöhnlichem Kubernetes-YAML.

Eine Basis ist der gemeinsame Ausgangspunkt. Sie sollte vollständige, gültige Kubernetes-Objekte enthalten, bevor umgebungsspezifische Anpassungen hinzugefügt werden. Hier enthält die Basis ein Deployment und einen Service. Die Anwendung schreibt den Wert der Umgebungsvariablen MESSAGE in eine kleine Webseite.

Erstellen Sie das Basisverzeichnis:

mkdir -p kustomize-demo/base

Erstellen Sie das Basis-Deployment:

cat > kustomize-demo/base/deployment.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kustomize-web
  labels:
    app: kustomize-web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kustomize-web
  template:
    metadata:
      labels:
        app: kustomize-web
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - name: web
        image: busybox:1.36
        env:
        - name: MESSAGE
          value: base-v1
        command:
        - /bin/sh
        - -c
        - |
          mkdir -p /www
          echo "$MESSAGE" > /www/index.html
          httpd -f -p 8080 -h /www
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 1
          periodSeconds: 2
EOF

Erstellen Sie den Basis-Service. Sein Selektor entspricht dem Pod-Label aus dem Deployment.

cat > kustomize-demo/base/service.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
  name: kustomize-web
spec:
  selector:
    app: kustomize-web
  ports:
  - port: 80
    targetPort: 8080
EOF

Erstellen Sie die Basis-kustomization.yaml. Diese Datei teilt Kustomize mit, welche Ressourcen zur Basis gehören.

cat > kustomize-demo/base/kustomization.yaml <<'EOF'
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
EOF

Rendern Sie die Basis, ohne sie anzuwenden:

kubectl kustomize kustomize-demo/base | sed -n '1,120p'

Die erwartete Ausgabe enthält einen Service namens kustomize-web, ein Deployment namens kustomize-web, replicas: 1 und value: base-v1.

Produktions-Overlay hinzufügen

In diesem Schritt erstellen Sie ein Overlay, das die Basis für ein produktionsnahes Deployment anpasst.

Ein Overlay verweist auf eine Basis und fügt dann Änderungen hinzu. Dieses Overlay platziert die Objekte im Namespace ckad-prep-kustomize, fügt das Namenspräfix prod- hinzu, skaliert das Deployment auf drei Replikate und patcht den Wert von MESSAGE auf prod-v2.

Erstellen Sie das Overlay-Verzeichnis:

mkdir -p kustomize-demo/overlays/prod

Erstellen Sie einen Deployment-Patch. Der Patch benennt das ursprüngliche Basisobjekt kustomize-web. Kustomize gleicht den Patch ab, bevor das Präfix prod- hinzugefügt wird.

cat > kustomize-demo/overlays/prod/deployment-patch.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kustomize-web
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: web
        env:
        - name: MESSAGE
          value: prod-v2
EOF

Erstellen Sie die Overlay-kustomization.yaml. Der Eintrag resources verweist zurück auf die Basis, während namespace, namePrefix und patches die Anpassungen beschreiben.

cat > kustomize-demo/overlays/prod/kustomization.yaml <<'EOF'
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: ckad-prep-kustomize
namePrefix: prod-
resources:
- ../../base
patches:
- path: deployment-patch.yaml
EOF

Rendern Sie das Produktions-Overlay:

kubectl kustomize kustomize-demo/overlays/prod | sed -n '1,160p'

Die erwartete Ausgabe enthält:

name: prod-kustomize-web
namespace: ckad-prep-kustomize
replicas: 3
value: prod-v2

Angepasste Anwendung bereitstellen und testen

In diesem Schritt wenden Sie das Produktions-Overlay an und testen den Service, den es erstellt.

Der Befehl kubectl apply -k rendert ein Kustomize-Verzeichnis und sendet die gerenderten Objekte an den Kubernetes-API-Server. Sie müssen keine temporäre YAML-Datei erstellen.

Wenden Sie das Produktions-Overlay an:

kubectl apply -k kustomize-demo/overlays/prod

Die erwartete Ausgabe enthält:

service/prod-kustomize-web created
deployment.apps/prod-kustomize-web created

Warten Sie auf das angepasste Deployment:

kubectl rollout status deployment/prod-kustomize-web --timeout=120s

Erwartete Ausgabe:

deployment "prod-kustomize-web" successfully rolled out

Überprüfen Sie die aus dem Overlay erstellten Objekte:

kubectl get deployment,service prod-kustomize-web

Die erwartete Ausgabe enthält:

deployment.apps/prod-kustomize-web   3/3
service/prod-kustomize-web

Erstellen Sie einen Client-Pod und testen Sie den Service. Die Antwort sollte prod-v2 lauten, was beweist, dass der Overlay-Patch die Konfiguration der laufenden Anwendung erfolgreich geändert hat.

kubectl run kustomize-client --image=busybox:1.36 --restart=Never --command -- sleep 3600
kubectl wait --for=condition=Ready pod/kustomize-client --timeout=120s
kubectl exec kustomize-client -- wget -qO- http://prod-kustomize-web

Erwartete Ausgabe:

prod-v2

Zusammenfassung

Sie haben eine Kustomize-Basis aus gewöhnlichem Deployment- und Service-YAML erstellt und anschließend ein Produktions-Overlay entwickelt, das den Namespace, die Objektnamen, die Replikatanzahl und die Anwendungsnachricht geändert hat. Sie haben sowohl die Basis als auch das Overlay gerendert, bevor Sie das Overlay mit kubectl apply -k angewendet und die angepasste Anwendung über ihren Service verifiziert haben.