Einführung
Das Testen einer neuen Funktion oder eines Upgrades in der Produktion ist ein stressiger Prozess. Sie möchten häufig Änderungen einführen, ohne die Benutzererfahrung zu beeinträchtigen. Um Ausfallzeiten in dieser Phase zu minimieren, richten Sie Canary-Bereitstellungen ein, um den Übergang zu optimieren.
Sie können Canary-Bereitstellungen auf jeder Infrastruktur verwenden. Dementsprechend ist es eine der Bereitstellungsstrategien in Kubernetes.
Erfahren Sie, was Canary-Bereitstellungen sind, wie sie funktionieren und wie Sie eine Canary-Bereitstellung auf Kubernetes durchführen.

Voraussetzungen
- Zugriff auf eine Befehlszeile/ein Terminal
- Docker auf dem System installiert
- Kubernetes oder Minikube
- Ein vollständig konfiguriertes kubectl-Befehlszeilentool auf Ihrem lokalen Computer
Was ist eine Canary-Bereitstellung?
Eine Canary-Bereitstellung ist eine aktualisierte Version einer vorhandenen Bereitstellung mit allen erforderlichen Anwendungscodes und Abhängigkeiten. Es wird verwendet, um neue Funktionen und Upgrades zu testen, um zu sehen, wie sie mit der Produktionsumgebung umgehen.
Wenn Sie die Canary-Bereitstellung zu einem Kubernetes-Cluster hinzufügen, wird sie von einem Dienst über Selektoren verwaltet und Etiketten . Der Dienst leitet den Datenverkehr an die Pods mit dem angegebenen Label weiter. Auf diese Weise können Sie Bereitstellungen einfach hinzufügen oder entfernen.
Die Menge an Verkehr, die der Kanarienvogel erhält, entspricht der Anzahl der Pods, die er hochfährt. In den meisten Fällen leiten Sie zunächst einen kleineren Prozentsatz des Datenverkehrs an den Canary weiter und erhöhen die Anzahl im Laufe der Zeit.
Wenn beide Bereitstellungen eingerichtet sind, überwachen Sie das Canary-Verhalten, um festzustellen, ob Probleme auftreten. Sobald Sie mit der Bearbeitung von Anfragen zufrieden sind, können Sie alle Bereitstellungen auf die neueste Version aktualisieren.
Canary-Bereitstellung auf Kubernetes einrichten
Die folgenden Schritte zeigen Ihnen, wie Sie eine Canary-Bereitstellung einrichten. Für diesen Artikel haben wir einen einfachen Kubernetes-Cluster von Nginx-Pods mit einer einfachen statischen HTML-Seite aus zwei Sätzen erstellt. Die Versionen der Bereitstellung unterscheiden sich je nach Inhalt, den sie auf der Webseite anzeigen.
Der Prozess zum Einrichten Ihrer Canary-Bereitstellung unterscheidet sich je nach Anwendung, die Sie ausführen.
Schritt 1:Docker-Image abrufen
Der erste Schritt besteht darin, das Image für die Container in Ihrem Kubernetes-Cluster abzurufen oder zu erstellen. Da wir in diesem Beispiel Nginx-Container erstellen, verwenden wir das auf Docker Hub verfügbare Nginx-Image.
1. Laden Sie das Bild herunter mit:
docker pull nginx
2. Bestätigen Sie, dass Sie es haben, indem Sie alle lokalen Images auflisten:
docker image ls

Schritt 2:Kubernetes-Bereitstellung erstellen
1. Erstellen Sie die Bereitstellungsdefinition mithilfe einer YAML-Datei. Verwenden Sie einen Texteditor Ihrer Wahl und geben Sie einen Namen für die Datei ein. Wir nennen die Datei nginx-deployment.yaml und erstellen Sie es mit Nano :
nano nginx-deployment.yaml
2. Fügen Sie der Datei folgenden Inhalt hinzu:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
version: "1.0"
spec:
containers:
- name: nginx
image: nginx:alpine
resources:
limits:
memory: "128Mi"
cpu: "50m"
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: index.html
volumes:
- name: index.html
hostPath:
path: /Users/sofija/Documents/nginx/v1
Wir haben 3 Replikate erstellt von Nginx-Pods für den Kubernetes-Cluster. Alle Pods haben die Bezeichnung version: "1.0
". Zusätzlich haben sie ein Host-Volume, das die index.html enthält am Behälter montiert. Die Beispiel-HTML-Datei bestehend aus:
<html>
<h1>Hello World!</h1>
<p>This is version 1</p>
</html>
3. Speichern und beenden Sie die Datei.
4. Erstellen Sie die Bereitstellung, indem Sie Folgendes ausführen:
k apply -f nginx-deployment.yaml
5. Überprüfen Sie, ob Sie die Pods erfolgreich bereitgestellt haben mit:
k get pods -o wide
Die Ausgabe sollte drei laufende Nginx-Pods anzeigen .
Schritt 3:Dienst erstellen
Der nächste Schritt besteht darin, eine Dienstdefinition zu erstellen für den Kubernetes-Cluster. Der Dienst leitet Anfragen an die angegebenen Pods weiter.
1. Erstellen Sie eine neue yaml Datei mit:
nano nginx-deployment.service.yaml
2. Fügen Sie dann den folgenden Inhalt hinzu:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: LoadBalancer
selector:
app: nginx
version: "1.0"
ports:
- port: 8888
targetPort: 80
Die yaml-Datei gibt den Diensttyp an – LoadBalancer . Es weist den Dienst an, Workloads zwischen Pods mit den Bezeichnungen app: nginx
auszugleichen und version: "1.0"
. Der Pod muss beide Labels haben, um Teil des Dienstes zu sein.
3. Speichern und beenden Sie die Servicedatei.
4. Erstellen Sie nun den Dienst:
kubectl apply -f nginx-deployment.service.yaml
Schritt 4:Erste Version des Clusters prüfen
Um zu überprüfen, ob der Dienst ausgeführt wird, öffnen Sie einen Webbrowser und navigieren Sie zu der in der Dienstdatei definierten IP- und Portnummer.
Um die externe IP-Adresse anzuzeigen des Dienstes verwenden Sie den Befehl:
kubectl get service
Wenn Sie Kubernetes lokal ausführen , verwenden Sie localhost als IP.
Da der von uns erstellte Beispielcluster lokal auf Port 8888 ausgeführt wird, lautet die URL:
http://localhost:8888
Der Browser sollte ein Hello World anzeigen Nachricht von Version 1 .

Schritt 5:Canary-Bereitstellung erstellen
Mit Version 1 der vorhandenen Anwendung stellen Sie Version 2 bereit , die Canary-Bereitstellung.
1. Beginnen Sie mit der Erstellung der yaml Datei für die Canary-Bereitstellung. Führen Sie den Befehl aus:
nano nginx-canary-deployment.yaml
2. Fügen Sie der Datei folgenden Inhalt hinzu:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-canary-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
version: "2.0"
spec:
containers:
- name: nginx
image: nginx:alpine
resources:
limits:
memory: "128Mi"
cpu: "50m"
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: index.html
volumes:
- name: index.html
hostPath:
path: /Users/sofija/Documents/nginx/v2
Der Inhalt der Canary-Bereitstellungsdatei unterscheidet sich durch drei wichtige Parameter:
- Der Name in den Metadaten lautet
nginx-canary-deployment
. - Sie trägt die Bezeichnung
version: “2.0”
. - Es ist mit einer HTML-Datei index.html verknüpft bestehend aus:
<html>
<h1>Hello World!</h1>
<p>This is version 2</p>
</html>
3. Speichern und beenden Sie die Datei.
4. Erstellen Sie die Canary-Bereitstellung mit dem folgenden Befehl:
k apply -f nginx-canary-deployment.yaml
5. Vergewissern Sie sich, dass Sie die drei zusätzlichen Pods erfolgreich bereitgestellt haben:
k get pods -o wide
Die Ausgabe sollte die Nginx Canary Deployment Pods anzeigen , zusammen mit den ursprünglichen Nginx-Pods .
Schritt 6:Canary-Bereitstellung ausführen
Öffnen Sie einen Webbrowser und navigieren Sie zu derselben IP-Adresse wie in Schritt 4. Sie werden feststellen, dass es keine Änderungen an der Webseite gibt. Dies liegt daran, dass die Dienstdatei so konfiguriert ist, dass sie nur Pods mit der Bezeichnung version: "1.0"
ausbalanciert .
Um die aktualisierten Pods zu testen, müssen Sie die Dienstdatei ändern und leiten Sie einen Teil des Datenverkehrs an version: "2.0"
weiter .
1. Öffnen Sie dazu die yaml Datei mit:
nano nginx-deployment.service.yaml
2. Suchen und entfernen Sie die Zeile version: “1.0”
. Die Datei sollte Folgendes enthalten:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: LoadBalancer
selector:
app: nginx
ports:
- port: 8888
targetPort: 80
3. Speichern Sie die Änderungen und beenden Sie die Datei.
4. Erstellen Sie den aktualisierten Dienst mit dem Befehl:
k apply -f nginx-deployment.service.yml
5. Der Datenverkehr wird jetzt zwischen Pods der Version 1 und Version 2 aufgeteilt. Wenn Sie die Webseite einige Male aktualisieren, sehen Sie unterschiedliche Ergebnisse, je nachdem, wohin der Dienst Ihre Anfrage umleitet.

Schritt 7:Beobachten Sie das Canary-Verhalten
Überwachen Sie das Verhalten der neuen Bereitstellung, während beide Bereitstellungen ausgeführt werden. Abhängig von den Ergebnissen können Sie die Bereitstellung rückgängig machen oder auf die neuere Version aktualisieren.
Canary-Bereitstellung zurücksetzen
Wenn Sie feststellen, dass Canary nicht wie erwartet funktioniert, können Sie die Bereitstellung rückgängig machen und die aktualisierten Pods löschen mit:
kubectl delete deployment.apps/nginx-canary-deployment
Der Dienst fährt mit dem Lastenausgleich des Datenverkehrs zu den anfänglichen Pods (Version 1) fort.
Verbesserte Bereitstellung einführen
Wenn Sie zu dem Schluss kommen, dass die Canary-Bereitstellung wie erwartet funktioniert, können Sie den gesamten eingehenden Datenverkehr an die aktualisierte Version weiterleiten. Dafür gibt es drei Möglichkeiten:
1. Aktualisieren Sie die erste Version, indem Sie das Docker-Image ändern und eine neue Bereitstellung erstellen. Entfernen Sie dann die Kanarienvögel mit:
kubectl delete deployment.apps/nginx-canary-deployment
2. Sie können die aktualisierten Pods behalten und diejenigen mit der Version 1 entfernen Bezeichnung:
kubectl delete deployment.apps/nginx
3. Alternativ können Sie auch die service.yaml ändern Datei und fügen Sie die Version hinzu Bezeichner zum selector
Etikette. Dadurch wird der Load Balancer angewiesen, den Datenverkehr nur an Version 2 weiterzuleiten Hülsen.