Einführung
Laufende Updates sind ein wichtiger Bestandteil des Lebenszyklus einer modernen App, wobei Benutzer ständig neue Funktionen und keine Ausfallzeiten erwarten. Während Kubernetes in der Vergangenheit Replication Controller verwendet hat, um diese Funktionalität zu ermöglichen, empfehlen neuere Versionen die Verwendung von Deployments.
Dieses Tutorial zeigt Ihnen, wie Sie fortlaufende Updates mit Kubernetes-Bereitstellungen durchführen. Mit dieser Methode können Sie Ihre Apps schnell aktualisieren und keine Ausfallzeiten erreichen, während Rollback-Unterstützung gewährleistet ist.
Voraussetzungen
- Ein Kubernetes-Cluster
- Zugriff auf ein Terminalfenster
- Das kubectl-Befehlszeilentool
Laufende Updates aktivieren
Kubernetes-Bereitstellungen fungieren als Wrapper um ReplicaSets, bei denen es sich um Kubernetes-Controller handelt, die für die Pod-Verwaltung zuständig sind. Bereitstellungen stellen ReplicaSets zusätzliche Funktionen bereit – sie führen Zustandsprüfungen, fortlaufende Updates und Rollbacks durch.
1. Erstellen Sie zuerst eine yaml Datei mit Bereitstellungsspezifikationen mit einem Texteditor wie Nano:
nano nginx-test.yaml Die folgende Beispieldatei enthält die grundlegenden Deklarationen, die für eine Kubernetes-Bereitstellung erforderlich sind:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80 2. Speichern und beenden Sie die Datei.
3. Erstellen Sie dann die Bereitstellung mit kubectl create Befehl und die yaml Datei, die Sie gerade erstellt haben:
kubectl create -f nginx-test.yaml
4. Überprüfen Sie die Bereitstellung:
kubectl get deployment Die Ausgabe sollte bestätigen, dass die Bereitstellung bereit ist:
4. Überprüfen Sie als Nächstes die ReplicaSets, indem Sie den folgenden Befehl ausführen:
kubectl get rs In der Beispieldatei sind vier Repliken angegeben, die alle als bereit angezeigt werden:
5. Überprüfen Sie abschließend, ob die Pods oben sind:
kubectl get pod Die Ausgabe zeigt Pods als bereit und ausgeführt:
Stellen Sie null Ausfallzeiten sicher
Um rollierende Updates ohne Ausfallzeit zu konfigurieren, müssen Sie die Update-Strategie angeben.
1. Fügen Sie der Bereitstellung yaml die folgende Deklaration hinzu Datei unter spec Kategorie:
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1 minReadySecondsteilt Kubernetes mit, wie lange es warten soll, bis es den nächsten Pod erstellt. Diese Eigenschaft stellt sicher, dass sich alle Anwendungs-Pods während des Updates im Bereitschaftszustand befinden.maxSurgegibt die maximale Anzahl (oder den Prozentsatz) von Pods über der angegebenen Anzahl von Replikaten an. Im obigen Beispiel beträgt die maximale Anzahl von Pods 5 seit 4 Replikate werden in yaml angegeben Datei.maxUnavailablegibt die maximale Anzahl (oder den Prozentsatz) nicht verfügbarer Pods während des Updates an. WennmaxSurgeauf 0 gesetzt ist , darf dieses Feld nicht 0 sein .
Hinzufügen der obigen Spezifikation zur yaml-Bereitstellung Datei ausreicht, um mit der Durchführung fortlaufender Kubernetes-Updates zu beginnen. Es garantiert jedoch keine Null-Ausfallzeit. Kubernetes kann nicht erkennen, wann ein neuer Pod fertig ist – es eliminiert den alten Pod, sobald der neue erstellt wird. Dieses Problem führt zu Ausfallzeiten, bis der neue Pod Anforderungen annehmen kann.
Um dieses Problem zu beheben, bietet Kubernetes das Konzept der Readiness Probes . Die Probes überprüfen den Status von Pods und ermöglichen fortlaufende Aktualisierungen nur dann, wenn alle Container in einem Pod bereit sind. Pods gelten als bereit, wenn die Bereitschaftsprüfung erfolgreich ist und nach der in minReadySeconds angegebenen Zeit ist bestanden.
2. Um Readiness Probes einzurichten, fügen Sie die folgenden Zeilen zu spec.template.spec hinzu Kategorie in der Bereitstellungsdatei:
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1 initialDelaySecondsgibt an, wie lange die Sonde warten muss, um zu starten, nachdem der Container gestartet wurde.periodSecondsist die Zeit zwischen zwei Sonden. Der Standardwert ist 10 Sekunden, während der Minimalwert 1 ist zweitens.successThresholdist die Mindestanzahl aufeinanderfolgender erfolgreicher Tests nach einem fehlgeschlagenen, damit der gesamte Prozess als erfolgreich betrachtet wird. Der Standard- und Minimalwert sind beide 1 .
Die gesamte Bereitstellungsdatei, die ordnungsgemäß für Rolling Updates konfiguriert ist, sollte folgendermaßen aussehen:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
minReadySeconds: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.0
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
successThreshold: 1
3. Speichern Sie die Datei und beenden Sie sie.
4. Verwenden Sie dann kubectl apply um die Änderungen zu übernehmen:
kubectl apply -f nginx-text.yaml --record
Der --record Flag wird im Rollback-Prozess einen Zweck erfüllen.
Die Ausgabe zeigt, dass die Bereitstellung erfolgreich konfiguriert wurde.
Rollendes Update durchführen
Es gibt drei Möglichkeiten, Rolling Updates durchzuführen.
So ändern Sie beispielsweise das App-Image:
Option 1:Sie können kubectl set verwenden um die Aktion auf der Kommandozeile auszuführen:
kubectl set image deployment nginx-deployment nginx=nginx:1.14.2 --record
Option 2:Ändern Sie alternativ die Image-Version in spec.templates.spec.containers Abschnitt der yaml Datei. Verwenden Sie dann kubectl replace um das Update durchzuführen:
kubectl replace -f nginx-test.yaml
Option 3:Sie können auch kubectl edit verwenden um die Bereitstellung direkt zu bearbeiten:
kubectl edit deployment nginx-deployment --record Nehmen Sie die erforderlichen Änderungen im sich öffnenden Editor vor:
Die Änderungen werden übernommen, wenn Sie den Editor schließen.
Rollout-Status prüfen
Überprüfen Sie den Rollout-Status der Bereitstellung mit der folgenden Syntax:
kubectl rollout status deployment nginx-deployment Die Ausgabe bestätigt den erfolgreichen Rollout:
Rollendes Update anhalten und fortsetzen
Laufende Updates mit dem entsprechenden kubectl rollout anhalten und fortsetzen Befehle.
Um die Aktualisierung anzuhalten, führen Sie Folgendes aus:
kubectl rollout pause deployment nginx-deployment
Um die Aktualisierung fortzusetzen, führen Sie Folgendes aus:
kubectl rollout resume deployment nginx-deployment
Pods für die Bereitstellung planen
Verwenden Sie Affinitäts- und Anti-Affinitätseigenschaften, um zu steuern, auf welchen Knoten Kubernetes bestimmte Pods in Ihrer Bereitstellung plant.
Pod-Affinität
Es gibt zwei Arten von Affinität derzeit in Kubernetes verfügbar:
requiredDuringSchedulingIgnoredDuringExecutionweist Kubernetes an, Pods nur auf Knoten auszuführen, die bestimmte Kriterien erfüllen, z. B. einen bestimmten Prozessortyp.preferredDuringSchedulingIgnoredDuringExecutionermöglicht es, Pods an anderer Stelle auszuführen, wenn und nur wenn keine Knoten bestimmte Kriterien erfüllen.
Diese Eigenschaften sind in der PodSpec aufgeführt Datei. Ein Pod kann beispielsweise wie folgt angegeben werden:
apiVersion: v1
kind: Pod
metadata:
name: affinity-test
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/test-name
operator: In
values:
- test1
- test2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: example-node-label-key
operator: In
values:
- example-node-label-value
containers:
- name: affinity-test
image: k8s.gcr.io/pause:2.0
Die obige Datei weist Kubernetes an, den Pod nur auf einem Knoten mit einem Label auszuführen, dessen Schlüssel kubernetes.io/test-name ist und dessen Wert entweder test1 ist oder test2 . Darüber hinaus bevorzugt Kubernetes Knoten, deren Schlüssel example-node-label-key ist , mit dem example-node-label-value Wert.
Pod-Anti-Affinität
Pod-Anti-Affinität ist nützlich, wenn Sie nicht möchten, dass alle Pods auf demselben Knoten ausgeführt werden. Sie funktioniert ähnlich wie die Affinität, wobei dieselben zwei Typen verfügbar sind:requiredDuringSchedulingIgnoredDuringExecution und preferredDuringSchedulingIgnoredDuringExecution .
Das folgende Beispiel gibt eine Anti-Affinitätsregel an, die Kubernetes anweist, die „Test“-App-Pods vorzugsweise nicht für Knoten zu planen, die bereits die „Test“-Pods haben:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- test
topologyKey: Kubernetes.io/hostname
Rollback-Änderungen
Wenn beim Aktualisierungsprozess etwas schief geht, können Sie Änderungen rückgängig machen und zu einer früheren Version der App zurückkehren. Verwenden Sie dazu das folgende kubectl rollout Befehl:
kubectl rollout history deployment nginx-deployment
Die Ausgabe listet die verfügbaren Revisionen auf, die durch Hinzufügen von --record erstellt wurden Flag beim Ausführen eines Updates:
Wählen Sie die gewünschte Revision aus und geben Sie den folgenden Befehl ein, um die Änderungen rückgängig zu machen:
kubectl rollout undo deployment nginx-deployment --to-revision=1 Der obige Befehl kehrt zu Revision 1 zurück und erzeugt die folgende Ausgabe: