Anwendungen aktualisieren und zurücksetzen

KubernetesKubernetesBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab erfahren Sie, wie Sie auf einem Kubernetes-Cluster bereitgestellte Anwendungen aktualisieren und zurücksetzen können. Sie beginnen damit, einen lokalen Kubernetes-Cluster mit Minikube einzurichten und stellen dann eine Beispiel-NGINX-Anwendung bereit. Anschließend aktualisieren Sie das Anwendungsimage und überprüfen die erfolgreiche Aktualisierung. Um Aktualisierungsfehler zu simulieren, diagnostizieren Sie Probleme und setzen dann auf eine stabile Version zurück. Abschließend passen Sie die Strategie für die schrittweise Aktualisierung in der Deployment-YAML-Datei an.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicsGroup(["Basics"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedDeploymentGroup(["Advanced Deployment"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("Initialization") kubernetes/BasicCommandsGroup -.-> kubernetes/get("Get") kubernetes/BasicCommandsGroup -.-> kubernetes/create("Create") kubernetes/BasicCommandsGroup -.-> kubernetes/set("Set") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/AdvancedDeploymentGroup -.-> kubernetes/rollout("Rollout") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/logs("Logs") subgraph Lab Skills kubernetes/initialization -.-> lab-434649{{"Anwendungen aktualisieren und zurücksetzen"}} kubernetes/get -.-> lab-434649{{"Anwendungen aktualisieren und zurücksetzen"}} kubernetes/create -.-> lab-434649{{"Anwendungen aktualisieren und zurücksetzen"}} kubernetes/set -.-> lab-434649{{"Anwendungen aktualisieren und zurücksetzen"}} kubernetes/apply -.-> lab-434649{{"Anwendungen aktualisieren und zurücksetzen"}} kubernetes/rollout -.-> lab-434649{{"Anwendungen aktualisieren und zurücksetzen"}} kubernetes/describe -.-> lab-434649{{"Anwendungen aktualisieren und zurücksetzen"}} kubernetes/logs -.-> lab-434649{{"Anwendungen aktualisieren und zurücksetzen"}} end

Starten des Kubernetes-Clusters

In diesem Schritt erfahren Sie, wie Sie einen lokalen Kubernetes-Cluster mit Minikube starten und überprüfen können. Dies ist ein entscheidender erster Schritt bei der Einrichtung Ihrer Kubernetes-Entwicklungsumgebung.

Stellen Sie zunächst sicher, dass Sie sich im Projektverzeichnis befinden:

cd ~/project

Starten Sie den Minikube-Cluster:

minikube start

Beispielausgabe:

😄  minikube v1.29.0 on Ubuntu 22.04
✨  Automatically selected the docker driver
📌  Using Docker driver with root permissions
🔥  Creating kubernetes in kubernetes cluster
🔄  Restarting existing kubernetes cluster
🐳  Preparing Kubernetes v1.26.1 on Docker 20.10.23...
🚀  Launching Kubernetes...
🌟  Enabling addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace

Überprüfen Sie den Status des Clusters:

minikube status

Beispielausgabe:

minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

Prüfen Sie die Clusterknoten:

kubectl get nodes

Beispielausgabe:

NAME       STATUS   ROLES           AGE   VERSION
minikube   Ready    control-plane   1m    v1.26.1

Wichtige Punkte zu diesem Schritt:

  1. minikube start erstellt einen lokalen Ein-Knoten-Kubernetes-Cluster.
  2. Der Cluster verwendet Docker als Standardtreiber.
  3. Kubernetes v1.26.1 wird automatisch konfiguriert.
  4. minikube status und kubectl get nodes bestätigen die Betriebsbereitschaft des Clusters.

Bereitstellen einer Beispielanwendung

In diesem Schritt erfahren Sie, wie Sie eine einfache Webanwendung mithilfe eines Kubernetes-Deployments erstellen und bereitstellen können. Wir verwenden ein NGINX-Image als Beispielanwendung, um den Bereitstellungsprozess zu veranschaulichen.

Navigieren Sie zunächst zum Projektverzeichnis:

cd ~/project
mkdir -p k8s-manifests
cd k8s-manifests

Erstellen Sie ein neues Deployment-Manifest für eine Webanwendung:

nano nginx-deployment.yaml

Fügen Sie der Datei den folgenden Inhalt hinzu:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: nginx
          image: nginx:1.23.3-alpine
          ports:
            - containerPort: 80

Speichern Sie die Datei und verlassen Sie den nano-Editor.

Stellen Sie die Anwendung mit kubectl bereit:

kubectl apply -f nginx-deployment.yaml

Beispielausgabe:

deployment.apps/web-app created

Überprüfen Sie das Deployment:

kubectl get deployments

Beispielausgabe:

NAME      READY   UP-TO-DATE   AVAILABLE   AGE
web-app   3/3     3            3           30s

Prüfen Sie die erstellten Pods:

kubectl get pods -l app=web

Beispielausgabe:

NAME                      READY   STATUS    RESTARTS   AGE
web-app-xxx-yyy           1/1     Running   0          45s
web-app-xxx-zzz           1/1     Running   0          45s
web-app-xxx-www           1/1     Running   0          45s

Wichtige Punkte zu dieser Bereitstellung:

  1. Wir haben ein Deployment mit 3 Replikaten eines NGINX-Webservers erstellt.
  2. Wir haben eine bestimmte, stabile Version von NGINX (1.23.3-alpine) verwendet.
  3. Wir haben den Containerport 80 freigegeben.
  4. Wir haben Labels verwendet, um die Pods zu identifizieren und zu verwalten.

Aktualisieren des Anwendungsimages in der Deployment-YAML-Datei

In diesem Schritt erfahren Sie, wie Sie das Container-Image in einem Kubernetes-Deployment aktualisieren können, um ein reales Szenario für die Aktualisierung einer Anwendung zu simulieren.

Stellen Sie zunächst sicher, dass Sie sich im richtigen Verzeichnis befinden:

cd ~/project/k8s-manifests

Öffnen Sie das vorhandene Deployment-Manifest:

nano nginx-deployment.yaml

Aktualisieren Sie das Image von nginx:1.23.3-alpine auf eine neuere Version:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: nginx
          image: nginx:1.24.0-alpine
          ports:
            - containerPort: 80

Wenden Sie das aktualisierte Deployment an:

kubectl apply -f nginx-deployment.yaml

Beispielausgabe:

deployment.apps/web-app configured

Beobachten Sie den Aktualisierungsprozess des Deployments:

kubectl rollout status deployment web-app

Beispielausgabe:

Waiting for deployment "web-app" to roll out...
Waiting for deployment spec update to be applied...
Waiting for available replicas to reach desired number...
deployment "web-app" successfully rolled out

Überprüfen Sie die neue Image-Version:

kubectl get pods -l app=web -o jsonpath='{.items[*].spec.containers[0].image}'

Beispielausgabe:

nginx:1.24.0-alpine nginx:1.24.0-alpine nginx:1.24.0-alpine

Wichtige Punkte zur Image-Aktualisierung:

  1. Verwenden Sie kubectl apply, um Deployments zu aktualisieren.
  2. Kubernetes führt standardmäßig eine schrittweise Aktualisierung (rolling update) durch.
  3. Pods werden schrittweise ersetzt, um die Verfügbarkeit der Anwendung aufrechtzuerhalten.
  4. Der Aktualisierungsprozess gewährleistet eine wartungsfreie (zero-downtime) Bereitstellung.

Überprüfen der erfolgreichen Aktualisierung

In diesem Schritt erfahren Sie, wie Sie die erfolgreiche Aktualisierung Ihres Kubernetes-Deployments überprüfen können, indem Sie die Pod-Versionen, den Status und weitere Details des Deployments untersuchen.

Listen Sie zunächst die Pods mit detaillierten Informationen auf:

kubectl get pods -l app=web -o wide

Beispielausgabe:

NAME                      READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
web-app-xxx-yyy           1/1     Running   0          3m    10.244.0.5   minikube   <none>           <none>
web-app-xxx-zzz           1/1     Running   0          3m    10.244.0.6   minikube   <none>           <none>
web-app-xxx-www           1/1     Running   0          3m    10.244.0.7   minikube   <none>           <none>

Prüfen Sie die spezifischen Image-Versionen der Pods:

kubectl get pods -l app=web -o jsonpath='{range.items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'

Beispielausgabe:

web-app-xxx-yyy    nginx:1.24.0-alpine
web-app-xxx-zzz    nginx:1.24.0-alpine
web-app-xxx-www    nginx:1.24.0-alpine

Beschreiben Sie das Deployment, um detailliertere Informationen zu erhalten:

kubectl describe deployment web-app

Beispielausgabe:

Name:                   web-app
Namespace:              default
CreationTimestamp:      [current timestamp]
Labels:                 app=web
Annotations:            deployment.kubernetes.io/revision: 2
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=web
  Containers:
   nginx:
    Image:        nginx:1.24.0-alpine
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable

Überprüfen Sie die Rollout-Geschichte:

kubectl rollout history deployment web-app

Beispielausgabe:

REVISION  CHANGE-CAUSE
1         <none>
2         <none>

Wichtige Punkte zur Überprüfung:

  1. Alle Pods verwenden die neue Image-Version.
  2. Das Deployment hat 3 verfügbare Replikate.
  3. Die Rollout-Strategie gewährleistet wartungsfreie (zero-downtime) Aktualisierungen.
  4. Die Deployment-Revision wurde erhöht.

Simulieren und Diagnostizieren von Aktualisierungsfehlern

In diesem Schritt erfahren Sie, wie Sie potenzielle Fehler bei der Aktualisierung eines Deployments diagnostizieren können, indem Sie eine problematische Image-Aktualisierung simulieren und Kubernetes-Diagnosetools verwenden.

Navigieren Sie zunächst zum Projektverzeichnis:

cd ~/project/k8s-manifests

Erstellen Sie ein Deployment-Manifest mit einem ungültigen Image:

nano problematic-deployment.yaml

Fügen Sie den folgenden Inhalt hinzu:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: troubleshoot-app
  labels:
    app: troubleshoot
spec:
  replicas: 3
  selector:
    matchLabels:
      app: troubleshoot
  template:
    metadata:
      labels:
        app: troubleshoot
    spec:
      containers:
        - name: nginx
          image: nginx:non-existent-tag
          ports:
            - containerPort: 80

Wenden Sie das problematische Deployment an:

kubectl apply -f problematic-deployment.yaml

Beispielausgabe:

deployment.apps/troubleshoot-app created

Überprüfen Sie den Status des Deployments:

kubectl rollout status deployment troubleshoot-app

Beispielausgabe:

Waiting for deployment "troubleshoot-app" to roll out...

Drücken Sie Ctrl+C, um den Rollout-Status zu beenden.

Überprüfen Sie die Pod-Ereignisse und den Status:

kubectl get pods -l app=troubleshoot

Beispielausgabe:

NAME                              READY   STATUS             RESTARTS   AGE
troubleshoot-app-6b8986c555-gcjj9   0/1     ImagePullBackOff   0          2m56s
troubleshoot-app-6b8986c555-p29dp   0/1     ImagePullBackOff   0          2m56s
troubleshoot-app-6b8986c555-vpv5q   0/1     ImagePullBackOff   0          2m56s

Untersuchen Sie die Pod-Details und die Logs:

## Replace 'xxx-yyy' with your actual pod name
POD_NAME=$(kubectl get pods -l app=troubleshoot -o jsonpath='{.items[0].metadata.name}')
kubectl describe pod $POD_NAME
kubectl logs $POD_NAME

Sie werden den Pod-Status und die Logs sehen, die auf ein fehlgeschlagenes Image-Pull hinweisen.

Failed to pull image "nginx:non-existent-tag"

Beheben Sie das Problem, indem Sie das Image korrigieren:

nano problematic-deployment.yaml

Aktualisieren Sie das Image auf einen gültigen Tag:

image: nginx:1.24.0-alpine

Wenden Sie das korrigierte Deployment erneut an:

kubectl apply -f problematic-deployment.yaml

Überprüfen Sie erneut den Pod-Status:

kubectl get pods -l app=troubleshoot

Beispielausgabe:

NAME                                READY   STATUS    RESTARTS   AGE
troubleshoot-app-5dc9b58d57-bvqbr   1/1     Running   0          5s
troubleshoot-app-5dc9b58d57-tdksb   1/1     Running   0          8s
troubleshoot-app-5dc9b58d57-xdq5n   1/1     Running   0          6s

Wichtige Punkte zur Diagnose von Fehlern:

  1. Verwenden Sie kubectl describe, um Deployment- und Pod-Ereignisse anzuzeigen.
  2. Überprüfen Sie den Pod-Status auf ImagePullBackOff oder andere Fehlerzustände.
  3. Untersuchen Sie die Pod-Logs für detaillierte Fehlerinformationen.
  4. Vergewissern Sie sich, dass das Image verfügbar ist und der Tag korrekt ist.

Rückgängigmachen auf eine stabile Version

In diesem Schritt erfahren Sie, wie Sie ein Kubernetes-Deployment mithilfe des Befehls kubectl rollout undo auf eine frühere stabile Version zurücksetzen können.

Navigieren Sie zunächst zum Projektverzeichnis:

cd ~/project/k8s-manifests

Überprüfen Sie die Rollout-Geschichte der Webanwendung:

kubectl rollout history deployment web-app

Beispielausgabe:

REVISION  CHANGE-CAUSE
1         <none>
2         <none>

Verifizieren Sie die aktuellen Deployment-Details:

kubectl describe deployment web-app | grep Image

Beispielausgabe:

    Image:        nginx:1.24.0-alpine

Führen Sie die Rücksetzung auf die vorherige Revision durch:

kubectl rollout undo deployment web-app

Beispielausgabe:

deployment.apps/web-app rolled back

Verifizieren Sie die Rücksetzung:

kubectl rollout status deployment web-app

Beispielausgabe:

Waiting for deployment "web-app" to roll out...
deployment "web-app" successfully rolled out

Überprüfen Sie die aktualisierte Image-Version:

kubectl get pods -l app=web -o jsonpath='{range.items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'

Beispielausgabe:

web-app-xxx-yyy    nginx:1.23.3-alpine
web-app-xxx-zzz    nginx:1.23.3-alpine
web-app-xxx-www    nginx:1.23.3-alpine

Bestätigen Sie die Rollout-Geschichte:

kubectl rollout history deployment web-app

Beispielausgabe:

REVISION  CHANGE-CAUSE
2         <none>
3         <none>

Wichtige Punkte zur Rücksetzung:

  1. kubectl rollout undo setzt das Deployment auf die vorherige Revision zurück.
  2. Kubernetes behält eine Geschichte der Deployment-Änderungen bei.
  3. Die Rücksetzung erfolgt ohne Ausfallzeit (zero downtime).
  4. Die Rücksetzung erstellt eine neue Revision in der Geschichte.

Anpassen der Rolling-Update-Strategie in der Deployment-YAML-Datei

In diesem Schritt erfahren Sie, wie Sie die Rolling-Update-Strategie in einem Kubernetes-Deployment anpassen können, um zu steuern, wie Anwendungen aktualisiert und skaliert werden.

Navigieren Sie zunächst zum Projektverzeichnis:

cd ~/project/k8s-manifests

Erstellen Sie ein neues Deployment-Manifest mit einer benutzerdefinierten Rolling-Update-Strategie:

nano custom-rollout-deployment.yaml

Fügen Sie den folgenden Inhalt hinzu:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app-custom-rollout
  labels:
    app: web
spec:
  replicas: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 2
      maxSurge: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
        - name: nginx
          image: nginx:1.24.0-alpine
          ports:
            - containerPort: 80

Wenden Sie das Deployment an:

kubectl apply -f custom-rollout-deployment.yaml

Beispielausgabe:

deployment.apps/web-app-custom-rollout created

Überprüfen Sie den Status des Deployments:

kubectl rollout status deployment web-app-custom-rollout

Beispielausgabe:

Waiting for deployment "web-app-custom-rollout" to roll out...
deployment "web-app-custom-rollout" successfully rolled out

Beschreiben Sie das Deployment, um die Strategie zu bestätigen:

kubectl describe deployment web-app-custom-rollout

Die Beispielausgabe wird Folgendes enthalten:

StrategyType:           RollingUpdate
RollingUpdateStrategy:  2 max unavailable, 3 max surge

Aktualisieren Sie das Image, um ein Rolling Update auszulösen:

kubectl set image deployment/web-app-custom-rollout nginx=nginx:1.25.0-alpine

Überwachen Sie den Aktualisierungsprozess:

kubectl rollout status deployment web-app-custom-rollout

Wichtige Punkte zur Rolling-Update-Strategie:

  1. maxUnavailable: Maximale Anzahl von Pods, die während der Aktualisierung nicht verfügbar sein dürfen.
  2. maxSurge: Maximale Anzahl von Pods, die über die gewünschte Anzahl hinaus erstellt werden können.
  3. Hilft bei der Steuerung der Aktualisierungsgeschwindigkeit und der Anwendungsverfügbarkeit.
  4. Ermöglicht die Feinabstimmung des Deployment-Verhaltens.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie einen lokalen Kubernetes-Cluster mit Minikube starten und überprüfen können. Dies ist ein entscheidender erster Schritt bei der Einrichtung Ihrer Kubernetes-Entwicklungsumgebung. Sie haben auch gelernt, wie Sie eine einfache Webanwendung mithilfe eines Kubernetes-Deployments erstellen und bereitstellen können, wobei ein NGINX-Image als Beispielanwendung verwendet wurde. Der Bereitstellungsprozess umfasste das Erstellen einer Deployment-Manifestdatei und das Anwenden dieser auf den Cluster.

Nach der Bereitstellung der ersten Version der Anwendung haben Sie gelernt, wie Sie das Anwendungsimage in der Deployment-YAML-Datei aktualisieren, die erfolgreiche Aktualisierung überprüfen, Aktualisierungsfehler simulieren und diagnostizieren, auf eine stabile Version zurücksetzen und die Rolling-Update-Strategie in der Deployment-YAML-Datei anpassen können.