Wir werden die Canary-Bereitstellung manuell über GitOps durchführen und die wichtigsten Kubernetes-Ressourcen erstellen/ändern. Dieser Artikel dient in erster Linie der Einführung mit der Funktionsweise der Bereitstellung in Kubernetes Canary, da es effektivere Automatisierungsmethoden gibt, die wir in den folgenden Artikeln betrachten werden.
Bei der Canary-Strategie werden Updates zunächst nur auf eine Teilmenge der Benutzer angewendet. Durch Überwachung, Protokolldaten, manuelle Tests oder andere Feedbackkanäle wird die Version getestet, bevor sie für alle Benutzer freigegeben wird.
Kubernetes-Bereitstellung (laufendes Update)
Die Standardstrategie für die Kubernetes-Bereitstellung ist das Rolling-Update, bei dem eine bestimmte Anzahl von Pods mit neuen Versionen der Images gestartet wird. Wenn sie ohne Probleme erstellt wurden, werden Pods mit alten Versionen von Bildern beendet und neue Pods parallel erstellt.
GitOps
Wir verwenden GitOps in diesem Beispiel, weil wir:
Verwendung von Git als Single Source of Truth
Wir verwenden Git Operations für Build und Bereitstellung (außer Git Tag/Merge sind keine anderen Befehle erforderlich).
Beispiel
Nehmen wir eine bewährte Vorgehensweise: ein Repository für Anwendungscode und eines für die Infrastruktur.
Anwendungs-Repository
Dies ist eine sehr einfache Python+Flask-API, die eine Antwort als JSON zurückgibt. Wir werden das Paket über GitlabCI erstellen und das Ergebnis an die Gitlab-Registrierung übertragen. In der Registry haben wir zwei verschiedene Release-Versionen:
wuestkamp/k8s-deployment-example-app:v1
wuestkamp/k8s-deployment-example-app:v2
Der einzige Unterschied zwischen ihnen besteht in der Änderung in der zurückgegebenen JSON-Datei. Wir nutzen diese Anwendung, um möglichst einfach zu visualisieren, mit welcher Version wir kommunizieren.
Infrastruktur-Repository
In dieser Rübe werden wir über GitlabCI auf Kubernetes bereitstellen, .gitlab-ci.yml выглядит следующим образом:
Beachten Sie, dass für app-deploy noch keine Replikate definiert sind.
Durchführen der Erstbereitstellung
Um die Erstbereitstellung zu starten, können Sie die GitlabCI-Pipeline manuell im Master-Zweig starten. Danach kubectl sollte folgendes ausgeben:
Wir sehen app Bereitstellung mit 10 Replikaten und App-Canary mit 0. Es gibt auch einen LoadBalancer, über den wir zugreifen können curl über externe IP:
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done
Wir sehen, dass unsere Testanwendung nur „v1“ zurückgibt.
Canary-Bereitstellung wird ausgeführt
Schritt 1: Geben Sie für einige Benutzer eine neue Version frei
Wir setzen die Anzahl der Replikate in der Datei „deploy-canary.yaml“ und im Image der neuen Version auf 1:
Wir pushen diese Änderungen in das Repository, von dem aus die Bereitstellung startet (über GitlabCI) und sehen als Ergebnis:
Unser Dienst verweist auf beide Bereitstellungen, da beide über die App-Auswahl verfügen. Aufgrund der Standard-Randomisierung von Kubernetes sollten wir bei etwa 10 % der Anfragen unterschiedliche Antworten sehen:
Der aktuelle Status unserer Anwendung (GitOps, übernommen von Git als Single Source Of Truth) ist das Vorhandensein von zwei Bereitstellungen mit aktiven Replikaten, eines für jede Version.
Etwa 10 % der Benutzer werden mit einer neuen Version vertraut und testen sie ungewollt. Jetzt ist es an der Zeit, die Protokolle und Überwachungsdaten auf Fehler zu überprüfen, um Probleme zu finden.
Schritt 2: Geben Sie die neue Version für alle Benutzer frei
Wir haben entschieden, dass alles gut gelaufen ist und müssen nun die neue Version allen Benutzern zur Verfügung stellen. Dazu aktualisieren wir einfach deploy.yaml Installieren einer neuen Version des Images und die Anzahl der Replikate gleich 10. In deploy-canary.yaml Wir setzen die Anzahl der Replikate wieder auf 0. Nach der Bereitstellung sieht das Ergebnis wie folgt aus:
Zusammenfassend
Für mich hilft die manuelle Ausführung der Bereitstellung auf diese Weise zu verstehen, wie einfach sie mit k8s konfiguriert werden kann. Da Sie mit Kubernetes alles über eine API aktualisieren können, können diese Schritte durch Skripte automatisiert werden.
Außerdem muss ein Tester-Einstiegspunkt (LoadBalancer oder über Ingress) implementiert werden, über den nur auf die neue Version zugegriffen werden kann. Es kann zum manuellen Durchsuchen verwendet werden.
In zukünftigen Artikeln werden wir uns andere automatisierte Lösungen ansehen, die den Großteil unserer Arbeit umsetzen.