Bereitstellung eines lokalen Helm-Charts

KubernetesBeginner
Jetzt üben

Einführung

In den vorangegangenen Bereitstellungslabs wurden Kubernetes-Manifeste direkt verwendet. Helm fügt diesen Manifesten eine Paketierungsebene hinzu. Ein Helm-Chart fasst zusammengehörige Kubernetes-Vorlagen zusammen, stellt wiederverwendbare Einstellungen in der values.yaml bereit und installiert die gerenderten Objekte als benanntes Release.

In diesem Lab erstellen Sie ein kleines lokales Chart, anstatt eines aus einem Repository herunterzuladen. Sie schreiben die Chart-Metadaten, die Werte, die Deployment-Vorlage sowie die Service-Vorlage, rendern das Chart vor der Installation und aktualisieren anschließend das Release durch Ändern der Werte. Dies schärft den Fokus auf eine wichtige CKAD-Fähigkeit: das Verständnis dafür, wie aus einem lokalen Chart gewöhnliche Kubernetes-Objekte entstehen.

Vorbereiten der Helm-Arbeitsumgebung

In diesem Schritt bereiten Sie einen Namespace vor und überprüfen die für den Workflow mit lokalen Helm-Charts erforderlichen Tools.

Beginnen Sie im Verzeichnis /home/labex/project. Dieses Lab behält das Chart-Verzeichnis, die generierten Manifeste und alle Befehle in diesem Arbeitsbereich bei.

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 Knoten 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 den Status "Ready" erreicht hat. Da das Chart einen Service erstellt, muss das Cluster-Netzwerk für die Anwendungspods bereit sein, damit die Verkehrstests aussagekräftig sind.

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-helm und legen Sie diesen als aktuellen Namespace fest:

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

Überprüfen Sie sowohl den aktuellen Namespace als auch den Helm-Client. Helm 3 arbeitet direkt mit Kubernetes unter Verwendung Ihrer aktuellen kubeconfig; es gibt keine separate serverseitige Tiller-Komponente mehr.

kubectl config view --minify --output 'jsonpath={..namespace}'; echo
helm version --short

Die erwartete Ausgabe enthält:

ckad-prep-helm
v...

Erstellen und Rendern eines lokalen Charts

In diesem Schritt erstellen Sie ein minimales lokales Helm-Chart und rendern es, bevor Sie etwas installieren.

Ein Chart-Verzeichnis besteht aus einigen wichtigen Teilen. Chart.yaml beschreibt das Chart selbst. values.yaml enthält Standardeinstellungen. Dateien unter templates/ sind Kubernetes-Manifeste mit Vorlagenausdrücken wie {{ .Values.replicaCount }}. Helm ersetzt diese Ausdrücke beim Rendern oder Installieren des Charts durch konkrete Werte.

Erstellen Sie das Chart-Verzeichnis:

mkdir -p local-web-chart/templates

Erstellen Sie die Chart.yaml. Der Chart-Name ist nicht dasselbe wie der Release-Name; der Release-Name wird später bei der Installation des Charts gewählt.

cat > local-web-chart/Chart.yaml <<'EOF'
apiVersion: v2
name: local-web
description: A small local chart for CKAD deployment practice
type: application
version: 0.1.0
appVersion: "1.0"
EOF

Erstellen Sie die values.yaml. Diese Standardwerte steuern die Anzahl der Pods, das Container-Image, die Service-Ports und die von der Anwendung bereitgestellte Nachricht.

cat > local-web-chart/values.yaml <<'EOF'
replicaCount: 2
image:
  repository: busybox
  tag: "1.36"
service:
  port: 80
  targetPort: 8080
message: helm-v1
EOF

Erstellen Sie die Deployment-Vorlage. Die Vorlage verwendet den Release-Namen in Objektnamen und Labels, sodass dasselbe Chart unter verschiedenen Release-Namen installiert werden kann.

cat > local-web-chart/templates/deployment.yaml <<'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-web
  labels:
    app.kubernetes.io/name: {{ .Chart.Name }}
    app.kubernetes.io/instance: {{ .Release.Name }}
spec:
  replicas: {{ .Values.replicaCount }}
  selector:
    matchLabels:
      app.kubernetes.io/name: {{ .Chart.Name }}
      app.kubernetes.io/instance: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app.kubernetes.io/name: {{ .Chart.Name }}
        app.kubernetes.io/instance: {{ .Release.Name }}
    spec:
      terminationGracePeriodSeconds: 0
      containers:
      - name: web
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        imagePullPolicy: IfNotPresent
        command:
        - /bin/sh
        - -c
        - |
          mkdir -p /www
          echo {{ .Values.message | quote }} > /www/index.html
          httpd -f -p {{ .Values.service.targetPort }} -h /www
        ports:
        - containerPort: {{ .Values.service.targetPort }}
        readinessProbe:
          httpGet:
            path: /
            port: {{ .Values.service.targetPort }}
          initialDelaySeconds: 1
          periodSeconds: 2
EOF

Erstellen Sie die Service-Vorlage. Beachten Sie, dass der Service-Selektor dieselben Labels wie die Pod-Vorlage verwendet.

cat > local-web-chart/templates/service.yaml <<'EOF'
apiVersion: v1
kind: Service
metadata:
  name: {{ .Release.Name }}
  labels:
    app.kubernetes.io/name: {{ .Chart.Name }}
    app.kubernetes.io/instance: {{ .Release.Name }}
spec:
  selector:
    app.kubernetes.io/name: {{ .Chart.Name }}
    app.kubernetes.io/instance: {{ .Release.Name }}
  ports:
  - port: {{ .Values.service.port }}
    targetPort: {{ .Values.service.targetPort }}
EOF

Führen Sie helm lint aus, um die Chart-Struktur und Vorlagenfehler zu überprüfen:

helm lint ./local-web-chart

Die erwartete Ausgabe enthält:

1 chart(s) linted, 0 chart(s) failed

Rendern Sie das Chart lokal. helm template gibt das Kubernetes-YAML aus, das Helm an den API-Server senden würde, erstellt jedoch keine Objekte.

helm template local-web ./local-web-chart | sed -n '1,120p'

Die erwartete Ausgabe enthält einen Service namens local-web und ein Deployment namens local-web-web.

Installieren des Charts als Release

In diesem Schritt installieren Sie das lokale Chart im Namespace ckad-prep-helm.

Die Installation eines Charts erstellt ein Helm-Release. Der Release-Name ist in diesem Lab local-web. Helm protokolliert die Release-Metadaten, und Kubernetes erhält gewöhnliche Objekte wie ein Deployment und einen Service.

Installieren Sie das Chart:

helm install local-web ./local-web-chart

Die erwartete Ausgabe enthält:

NAME: local-web
STATUS: deployed

Warten Sie auf das durch das Chart erstellte Deployment:

kubectl rollout status deployment/local-web-web --timeout=120s

Erwartete Ausgabe:

deployment "local-web-web" successfully rolled out

Überprüfen Sie das Release und die von ihm erstellten Kubernetes-Objekte:

helm list
kubectl get deployment,service -l app.kubernetes.io/instance=local-web

Die erwartete Ausgabe enthält:

local-web
deployment.apps/local-web-web
service/local-web

Erstellen Sie einen Client-Pod und senden Sie eine Anfrage an den Service. Dies bestätigt, dass das Chart nicht nur Objekte erstellt hat, sondern die installierte Anwendung auch tatsächlich erreichbar ist.

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

Erwartete Ausgabe:

helm-v1

Aktualisieren des Releases mit neuen Werten

In diesem Schritt aktualisieren Sie das bestehende Release, indem Sie Chart-Werte überschreiben.

Das Chart enthält bereits wiederverwendbare Vorlagen. Sie müssen die Vorlagendateien nicht bearbeiten, um die Nachricht oder die Anzahl der Replikate zu ändern. helm upgrade rendert dasselbe Chart erneut mit neuen Werten, aktualisiert die Kubernetes-Objekte und protokolliert eine neue Release-Revision.

Aktualisieren Sie das Release so, dass es helm-v2 mit drei Replikaten bereitstellt:

helm upgrade local-web ./local-web-chart --set message=helm-v2 --set replicaCount=3

Die erwartete Ausgabe enthält:

Release "local-web" has been upgraded.
STATUS: deployed

Warten Sie auf das aktualisierte Deployment:

kubectl rollout status deployment/local-web-web --timeout=120s

Erwartete Ausgabe:

deployment "local-web-web" successfully rolled out

Überprüfen Sie die Release-Historie und die aktuell mit dem Release gespeicherten Werte:

helm history local-web
helm get values local-web

Die erwartete Ausgabe enthält zwei Revisionen und die überschriebenen Werte:

REVISION
1
2
message: helm-v2
replicaCount: 3

Überprüfen Sie das laufende Deployment und die Antwort der Anwendung:

kubectl get deployment local-web-web
kubectl exec chart-client -- wget -qO- http://local-web

Die erwartete Ausgabe enthält:

3/3
helm-v2

Zusammenfassung

Sie haben ein lokales Helm-Chart aus Chart-Metadaten, Standardwerten und Kubernetes-Vorlagen erstellt. Sie haben das Chart vor der Installation gerendert, es als Release installiert, den Service getestet und das Release durch Überschreiben der Werte aktualisiert. Der Kerngedanke ist, dass Helm wiederholbare Anwendungsbereitstellungen paketiert, dabei aber weiterhin gewöhnliche Kubernetes-Objekte erzeugt, die Sie mit kubectl untersuchen können.