Upgrade des Istio-basierten Service-Mesh-Add-Ons für Azure Kubernetes Service
Dieser Artikel befasst sich mit Upgradefunktionen für das Istio-basierte Servicenetz-Add-On für Azure Kubernetes Service (AKS).
Ankündigungen zu den Veröffentlichungen neuer Nebenrevisionen oder Patches für das Istio-basierte Service Mesh-Add-on werden in den AKS-Versionshinweisen veröffentlicht. Weitere Informationen zum Releasezeitplan und zur Unterstützung von Revisionen von Service-Mesh-Add-Ons finden Sie im Artikel zur Unterstützungsrichtlinie.
Nebenrevisions-Upgrade
Das Istio-Add-On ermöglicht das Upgrade der Nebenrevision mithilfe des Canary-Upgradeprozesses. Wenn ein Upgrade initiiert wird, wird die Steuerungsebene der neuen Revision (Canary) zusammen mit der ursprünglichen (stabilen) Steuerungsebene der Revision bereitgestellt. Anschließend können Sie manuell einen Rollover für die Datenebenenworkloads durchführen, während Sie Überwachungstools verwenden, um die Integrität von Workloads während dieses Prozesses nachzuverfolgen. Wenn Sie keine Probleme mit der Integrität Ihrer Workloads ermitteln können, können Sie das Upgrade abschließen, sodass nur die neue Revision im Cluster verbleibt. Andernfalls können Sie einen Rollback zur vorherigen Revision von Istio ausführen.
Wenn der Cluster derzeit eine unterstützte Nebenrevision von Istio verwendet, sind nur Upgrades für jeweils eine Nebenrevision zulässig. Wenn der Cluster eine nicht unterstützte Revision von Istio verwendet, müssen Sie für diese Kubernetes-Version auf die niedrigste unterstützte Nebenrevision von Istio upgraden. Danach können Upgrades für jeweils eine Nebenrevision erneut durchgeführt werden.
Das folgende Beispiel veranschaulicht, wie ein Upgrade von Revision asm-1-22
auf asm-1-23
mit allen Workloads im Namespace default
abläuft. Die Schritte sind für alle kleineren Upgrades identisch und können für eine beliebige Anzahl von Namespaces verwendet werden.
Verwenden Sie den Befehl az aks mesh get-upgrades, um zu überprüfen, welche Revisionen für den Cluster als Upgradeziele verfügbar sind:
az aks mesh get-upgrades --resource-group $RESOURCE_GROUP --name $CLUSTER
Wenn Sie erwarten, dass eine neuere Revision nicht von diesem Befehl zurückgegeben wird, müssen Sie möglicherweise zuerst Ihren AKS-Cluster upgraden, damit er mit der neuesten Revision kompatibel ist.
Wenn Sie eine Mesh-Konfiguration für die vorhandene Mesh-Revision in Ihrem Cluster einrichten, müssen Sie eine separate ConfigMap-Instanz für die neue Revision im Namespace
aks-istio-system
erstellen, bevor Sie im nächsten Schritt das Canary-Upgrade initiieren. Diese Konfiguration gilt ab dem Zeitpunkt, zu dem die Steuerungsebene der neuen Revision im Cluster bereitgestellt wird. Weitere Informationen finden Sie hier.Initiieren Sie ein Canaryupgrade von der Revision
asm-1-22
aufasm-1-23
unter Verwendung des Befehls az aks mesh upgrade start:az aks mesh upgrade start --resource-group $RESOURCE_GROUP --name $CLUSTER --revision asm-1-23
Ein Canaryupgrade bedeutet, dass die Steuerungsebene 1.23 neben der Steuerungsebene 1.22 bereitgestellt wird. Sie sind weiterhin vorhanden, bis Sie das Upgrade abgeschlossen oder einen Rollback ausgeführt haben.
Optional können Überarbeitungstags verwendet werden, um die Datenebene in die neue Revision zu übertragen, ohne jeden Namespace manuell neu zu bezeichnen. Das manuelle Neubezeichnen von Namespaces beim Verschieben in eine neue Revision kann mühsam und fehleranfällig sein. Revisionstags lösen dieses Problem, indem sie als stabile Bezeichner dienen, die auf Überarbeitungen verweisen.
Anstatt jeden Namespace neu zu bezeichnen, kann ein Clusteroperator das Tag ändern, um auf eine neue Revision zu verweisen. Alle Namespaces, die mit diesem Tag bezeichnet sind, werden gleichzeitig upgedated. Sie müssen die Workloads jedoch weiterhin neu starten, um sicherzustellen, dass die richtige Version von
istio-proxy
-Sidecarelementen eingefügt wird.So verwenden Sie Überarbeitungstags während eines Upgrades:
Erstellen Sie ein Revisionstag für die ursprüngliche Überarbeitung. In diesem Beispiel nennen wir es
prod-stable
:istioctl tag set prod-stable --revision asm-1-22 --istioNamespace aks-istio-system
Erstellen Sie ein Revisionstag für die während des Upgrades installierte Revision. In diesem Beispiel nennen wir es
prod-canary
:istioctl tag set prod-canary --revision asm-1-23 --istioNamespace aks-istio-system
Bezeichnungsanwendungsnamespaces, um Überarbeitungstags zuzuordnen:
# label default namespace to map to asm-1-22 kubectl label ns default istio.io/rev=prod-stable --overwrite
Sie können auch Namespaces mit
istio.io/rev=prod-canary
für die neuere Überarbeitung bezeichnen. Die Workloads in diesen Namespaces werden jedoch erst auf ein neues Sidecar aktualisiert, wenn sie neu gestartet werden.Wenn eine neue Anwendung nach der Bezeichnung in einem Namespace erstellt wird, wird ein Sidecar entsprechend dem Revisionstag in diesem Namespace eingefügt.
Überprüfen Sie, ob Steuerungsebenenpods vorhanden sind, die
asm-1-22
undasm-1-23
entsprechen:Überprüfen von
istiod
-Pods:kubectl get pods -n aks-istio-system
Beispielausgabe:
NAME READY STATUS RESTARTS AGE istiod-asm-1-22-55fccf84c8-dbzlt 1/1 Running 0 58m istiod-asm-1-22-55fccf84c8-fg8zh 1/1 Running 0 58m istiod-asm-1-23-f85f46bf5-7rwg4 1/1 Running 0 51m istiod-asm-1-23-f85f46bf5-8p9qx 1/1 Running 0 51m
Wenn der Eingang aktiviert ist, überprüfen Sie die Eingangspods:
kubectl get pods -n aks-istio-ingress
Beispielausgabe:
NAME READY STATUS RESTARTS AGE aks-istio-ingressgateway-external-asm-1-22-58f889f99d-qkvq2 1/1 Running 0 59m aks-istio-ingressgateway-external-asm-1-22-58f889f99d-vhtd5 1/1 Running 0 58m aks-istio-ingressgateway-external-asm-1-23-7466f77bb9-ft9c8 1/1 Running 0 51m aks-istio-ingressgateway-external-asm-1-23-7466f77bb9-wcb6s 1/1 Running 0 51m aks-istio-ingressgateway-internal-asm-1-22-579c5d8d4b-4cc2l 1/1 Running 0 58m aks-istio-ingressgateway-internal-asm-1-22-579c5d8d4b-jjc7m 1/1 Running 0 59m aks-istio-ingressgateway-internal-asm-1-23-757d9b5545-g89s4 1/1 Running 0 51m aks-istio-ingressgateway-internal-asm-1-23-757d9b5545-krq9w 1/1 Running 0 51m
Beachten Sie, dass Eingangsgatewaypods beider Revisionen parallel bereitgestellt werden. Der Dienst und seine IP bleiben jedoch unveränderlich.
Bezeichnen Sie den Namespace neu, sodass alle neuen Pods dem Istio-Sidecarelement zugeordnet werden, das der neuen Revision und der zugehörigen Steuerungsebene zugeordnet ist:
Wenn Sie Überarbeitungstags verwenden, überschreiben Sie das
prod-stable
-Tag selbst, um die Zuordnung zu ändern:istioctl tag set prod-stable --revision asm-1-23 --istioNamespace aks-istio-system --overwrite
Überprüfen Sie die Zuordnungen von Tag-zu-Überarbeitungen:
istioctl tag list
Beide Tags sollten auf die neu installierte Revision verweisen:
TAG REVISION NAMESPACES prod-canary asm-1-23 default prod-stable asm-1-23 ...
In diesem Fall müssen Sie die einzelnen Namespaces nicht einzeln neu bezeichnen.
Wenn Keine Überarbeitungstags verwendet werden, müssen Namespaces der Datenebene neu bezeichnet werden, um auf die neue Revision zu verweisen:
kubectl label namespace default istio.io/rev=asm-1-23 --overwrite
Die Neubezeichnung wirkt sich erst auf Ihre Workloads aus, wenn diese neu gestartet werden.
Führen Sie für jede Ihrer Anwendungsworkloads einen einzelnen Rollover durch, indem Sie sie neu starten. Beispiel:
kubectl rollout restart deployment <deployment name> -n <deployment namespace>
Überprüfen Sie Ihre Überwachungstools und Dashboards, um zu ermitteln, ob Ihre Workloads nach dem Neustart in einem fehlerfreien Zustand ausgeführt werden. Basierend auf dem Ergebnis haben Sie zwei Optionen:
Abschließen des Canaryupgrades: Wenn die Workloads alle erwartungsgemäß in einem fehlerfreien Zustand ausgeführt werden, können Sie das Canaryupgrade abschließen. Durch den Abschluss des Upgrades wird die Steuerungsebene der vorherigen Revision entfernt und durch die Steuerungsebene der neuen Revision im Cluster ersetzt. Führen Sie den folgenden Befehl aus, um das Canaryupgrade abzuschließen:
az aks mesh upgrade complete --resource-group $RESOURCE_GROUP --name $CLUSTER
Durchführen eines Rollbacks für das Canaryupgrade: Wenn Sie Probleme mit der Integrität Ihrer Workloads beobachten, können Sie einen Rollback auf die vorherige Revision von Istio ausführen:
Beschriften Sie den Namespace in die vorherige Revision: Wenn Überarbeitungstags verwendet werden:
istioctl tag set prod-stable --revision asm-1-22 --istioNamespace aks-istio-system --overwrite
Oder, wenn keine Überarbeitungstags verwendet werden:
kubectl label namespace default istio.io/rev=asm-1-22 --overwrite
Führen Sie einen Rollback für die Workloads aus, um das Sidecarelement zu verwenden, das der vorherigen Istio-Revision entspricht, indem Sie diese Workloads noch mal neu starten:
kubectl rollout restart deployment <deployment name> -n <deployment namespace>
Führen Sie einen Rollback für die Steuerungsebene auf die vorherige Revision aus:
az aks mesh upgrade rollback --resource-group $RESOURCE_GROUP --name $CLUSTER
Das
prod-canary
-Revisionstag kann entfernt werden:istioctl tag remove prod-canary --istioNamespace aks-istio-system
Wenn Gitterkonfiguration zuvor für die Überarbeitungen eingerichtet wurde, können Sie die ConfigMap für die Überarbeitung löschen, die während des Vollständigen/Rollbacks aus dem Cluster entfernt wurde.
Nebenrevisions-Upgrades mit dem Eingangsgateway
Wenn Sie derzeit Istio-Eingangsgateways verwenden und ein kleineres Revisionsupgrade durchführen, denken Sie daran, dass Istio-Eingangsgateway-Pods/-Bereitstellungen pro Revision bereitgestellt werden. Wir stellen jedoch revisionsübergreifend einen einzelnen LoadBalancer-Dienst für alle eingehenden Gatewaypods bereit, sodass die externe bzw. interne IP-Adresse der Eingangsgateways während eines Upgrades unverändert bleibt.
Daher verarbeiten die Eingangsgatewaypods beider Revisionen während des Canary-Upgrades den eingehenden Datenverkehr, wenn zwei Revisionen gleichzeitig auf dem Cluster vorhanden sind.
Kleinere Revisionsupgrades mit Anpassungen für die automatische horizontale Skalierung von Pods
Wenn Sie die Einstellungen für die automatische horizontale Skalierung von Pods (Horizontal Pod Autoscaling, HPA) für Istiod oder die Eingangsgateways angepasst haben, beachten Sie das folgende Verhalten für die Anwendung von HPA-Einstellungen für beide Revisionen, um die Konsistenz während eines Canary-Upgrades aufrechtzuerhalten:
- Wenn Sie die HPA-Spezifikation vor dem Initiieren eines Upgrades updaten, werden die Einstellungen der vorhandenen (stabilen) Revision auf die HPAs der Canary-Revision angewendet, wenn die neue Steuerungsebene installiert wird.
- Wenn Sie die HPA-Spezifikation während ein Canary-Upgrades updaten, hat die HPA-Spezifikation der stabilen Revision Vorrang und wird auf die HPA der Canary-Revision angewendet.
- Wenn Sie die HPA der stabilen Revision während eines Upgrades updaten, wird die HPA-Spezifikation der Canary-Revision upgedatet, um die neuen Einstellungen widerzuspiegeln, die auf die stabile Revision angewendet werden.
- Wenn Sie die HPA der Canary-Revision während eines Upgrades updaten, wird die HPA-Spezifikation der Canary-Revision auf die HPA-Spezifikation der stabilen Revision zurückgesetzt.
Patchversionsupgrade
- Informationen zur Verfügbarkeit der Istio Add-On-Patchversion werden in AKS-Versionshinweisen veröffentlicht.
- Patches werden automatisch für istiod-Pods und Eingangspods im Rahmen dieser AKS-Releases bereitgestellt, die das für den Cluster eingerichtete
default
geplante Wartungsfenster berücksichtigen. - Der Benutzer muss Patches für den Istio-Proxy in seinen Workloads initiieren, indem er die Pods für die Reinjektion neu startet:
Überprüfen Sie die Version des Istio-Proxys, die für neue oder neu gestartete Pods vorgesehen ist. Diese Version entspricht der Version der Istiod- und Istio-Eingangspods, nachdem sie gepatcht wurden:
kubectl get cm -n aks-istio-system -o yaml | grep "mcr.microsoft.com\/oss\/istio\/proxyv2"
Beispielausgabe:
"image": "mcr.microsoft.com/oss/istio/proxyv2:1.22.0-distroless", "image": "mcr.microsoft.com/oss/istio/proxyv2:1.22.0-distroless"
Überprüfen Sie die Version des Istio-Proxy-Images für alle Pods in einem Namespace:
kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\ sort |\ grep "mcr.microsoft.com\/oss\/istio\/proxyv2"
Beispielausgabe:
productpage-v1-979d4d9fc-p4764: docker.io/istio/examples-bookinfo-productpage-v1:1.22.0, mcr.microsoft.com/oss/istio/proxyv2:1.22.0-distroless
Starten Sie die Workloads neu, um die Reinjektion auszulösen. Beispiel:
kubectl rollout restart deployments/productpage-v1 -n default
Um zu überprüfen, ob sie über die neueren Versionen verfügen, prüfen Sie die Version des Istio-Proxy-Images für alle Pods im Namespace erneut:
kubectl get pods --all-namespaces -o jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{end}' |\ sort |\ grep "mcr.microsoft.com\/oss\/istio\/proxyv2"
Beispielausgabe:
productpage-v1-979d4d9fc-p4764: docker.io/istio/examples-bookinfo-productpage-v1:1.2.0, mcr.microsoft.com/oss/istio/proxyv2:1.22.0-distroless
Hinweis
Wenn bei Upgrades Probleme auftreten, lesen Sie den Artikel zur Problembehandlung von Gitterrevisionsupgrades
Azure Kubernetes Service