Microsoft Azure Kubernetes Service, Teil 3 AKS-Cluster manuell skalieren

Anbieter zum Thema

Über den Azure Kubernetes Service, kurz AKS, haben wir in diesem Workshop bereits eine Anwendung per Container Cluster bereitgestellt. Die Skalierung von Kubernetes-Clustern im Allgemeinen und AKS-Clustern im Speziellen schauen wir uns in diesem Teil an.

Knoten und Pods in einem Container Cluster lassen sich mit dem Azure Kubernetes Service recht einfach per Hand skalieren.
Knoten und Pods in einem Container Cluster lassen sich mit dem Azure Kubernetes Service recht einfach per Hand skalieren.
(Bild: Drilling / Microsoft)

Der Knoten-Pool ist bereit, unsere Anwendung besteht derzeit aus zwei Pods für Frontend und Backend.
Der Knoten-Pool ist bereit, unsere Anwendung besteht derzeit aus zwei Pods für Frontend und Backend.
(Bild: Drilling / Microsoft)

Beginnen wir analog zum zweiten Teil dieser Serie erneut damit, dass wir uns zwecks Kontrolle der Konnektivität der seinerzeit erstellten AKS-Cluster die Anzahl und Verteilung der Knoten-Pools und Knoten im Cluster anzeigen lassen. Hierzu setzen wir das kubectl-Kommando „get nodes“ ab:

kubectl get nodes

Nun ermitteln wir mit dem Kommando …

kubectl get pods

…, aus wie vielen Pods unsere Anwendung besteht sowie die IDs der jeweiligen Pods nebst jeweiligem Pod-Status.

Unser Deployment besteht aus einem Frontend und einem Backend.
Unser Deployment besteht aus einem Frontend und einem Backend.
(Bild: Drilling / Microsoft)

Ferner könnten wir jederzeit den Status unseres Deployments ermitteln, dies gelingt mit dem Kommando:

kubectl get deployment

Nun wollen wir uns mit den Skalierungsoptionen in AKS befassen und exemplarisch einige Arten der manuellen Skalierung ausprobieren. Dazu sollten wir aber noch etwas Hintergrundwissen anhäufen.

Skalierung in Kubernetes und AKS

Da Anwendungen über die Kapazität eines einzelnen Pods hinauswachsen können, verfügt Kubernetes über eine automatische Cluster-Skalierung. Diese basiert auf dem Hinzufügen von Compute-Ressourcen.

Standardmäßig prüft die automatische Cluster-Skalierung den Metrik-API-Server alle zehn Sekunden auf eine potenziell erforderliche Anpassung der Anzahl von Knoten. Sollte eine Skalierung erforderlich sein, wird die Anzahl der Knoten im AKS-Cluster automatisch herauf- oder herabgesetzt. Darüber hinaus gibt es in Kubernetes einen horizontalen Pod-Autoscaler (HPA), der auf Basis von Metriken skaliert und mit dem Cluster-Autoscaler Hand in Hand arbeitet.

Kubernetes nutzt die horizontale automatische Podskalierung zum Überwachen des Ressourcenbedarfs und zum automatischen Skalieren der Anzahl der Replikate. Standardmäßig überprüft die horizontale automatische Podskalierung die Metriken-API alle 30 Sekunden auf erforderliche Änderungen der Replikat-Anzahl.

Die Skalierungsoptionen in AKS.
Die Skalierungsoptionen in AKS.
(Bild: Microsoft)

Allgemein erhöht oder reduziert die horizontale automatische Pod-Skalierung die Anzahl von Pods nach Bedarf der Anwendung. Die automatische Cluster-Skalierung wiederum ändert die Anzahl der Knoten, um den Kapazitätsbedarf für zusätzliche Pods zu decken. Ändert sich also die Anzahl der benötigten Anwendungsinstanzen, muss die Anzahl der zugrunde liegenden Kubernetes-Knoten möglicherweise ebenfalls geändert werden.

AKS-Admins können aber die Anzahl der Replikate (Pods) und Knoten auch jederzeit manuell skalieren, um zu testen, wie die Anwendung auf eine Änderung in verfügbaren Ressourcen und Status reagiert. Beim manuellen Skalieren kann man jederzeit eine feste Anzahl der zu verwendenden Ressourcen wie z. B. die Anzahl der Knoten definieren und somit erzwingen. Für das manuelle Skalieren definiert man die Replika- und/oder Knotenanzahl.

Die Kubernetes-API plant dann das Erstellen zusätzlicher Pods oder Entfernen von Knoten auf Basis dieser Replikat- oder Knotenanzahl. Konkret ruft beim horizontalen Skalieren von Knoten die Kubernetes-API die relevante Azure-Compute-API auf, die an den vom Cluster verwendeten Compute-Typ gebunden ist. So könnte der AKS-Cluster beispielsweise auf VM Scale Sets basieren, welche die Logik für die Auswahl der zu entfernenden Knoten durch die „VM Scale Sets“-API ermittelt.

Abkühlung der Skalierung von Ereignissen

Da die horizontale automatische Pod-Skalierung die Metriken-API alle 30 Sekunden überprüft, werden Skalierungsereignisse möglicherweise nicht erfolgreich abgeschlossen, bevor eine andere Überprüfung erfolgt. Somit könnte die horizontale automatische Pod-Skalierung die Anzahl der Replikate ändern, bevor ein vorangegangenes Skalierungsereignis eine Ressourcenanforderung empfangen und entsprechend anpassen konnte.

Um solche Ereignisse zu minimieren, kann der Admin einen Verzögerungswert festlegen. Dieser Wert definiert, wie lange die horizontale automatische Pod-Skalierung nach einem Skalierungsereignis warten muss, bevor ein anderes Skalierungsereignis ausgelöst werden kann. Dieses Verhalten ermöglicht es, dass die neue Replikat-Anzahl wirksam wird und die Metriken-API die verteilte Workload widerspiegeln kann.

Das manuelle Skalieren von Pods.
Das manuelle Skalieren von Pods.
(Bild: Drilling / Microsoft)

Schauen wir uns nun das manuelle Skalieren mit kubectl an. Wir erhöhen zunächst die Anzahl der Repliken auf 2. Dazu benötigen wir den oben ermittelten Namen des Deployments:

kubectl scale --replicas=2 deployment/<Deployment Name>

Das Resultat überprüfen wir dann mit

Jetzt Newsletter abonnieren

Täglich die wichtigsten Infos zu Softwareentwicklung und DevOps

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung.

Aufklappen für Details zu Ihrer Einwilligung
kubectl get pods

Das manuelle Skalieren von Knoten.
Das manuelle Skalieren von Knoten.
(Bild: Drilling / Microsoft)

Nun wollen wir die Anzahl der Knoten im Cluster erhöhen. Hierzu verwenden wir allerdings die AKS-Kommando-Ebene in Form des Befehls „az aks scale“.

az aks scale --resource-group <Name Ressource-Group> --name <Cluster Name> --node-count 2

Das Ergebnis prüfen wir wieder mit dem get-Befehl:

kubectl get nodes

Ein weiteres Mal erhöhen wir die Anzahl der Replikate im Pod-Autoscaler.
Ein weiteres Mal erhöhen wir die Anzahl der Replikate im Pod-Autoscaler.
(Bild: Drilling / Microsoft)

Schließlich erhöhen wir noch einmal die Anzahl der Replikate auf 5 und prüfen das Ergebnis.

kubectl scale --replicas=5 deployment/<Deployment Name>

Die Verteilung der Pods.
Die Verteilung der Pods.
(Bild: Drilling / Microsoft)

Wir können uns wie folgt auch der Verteilung der Pods über den Cluster ansehen:

kubectl get pod -o=custom-columns=NODE:.spec.nodeName,POD:.metadata.name

Wer genug experimentiert hat, kann das vollständige Deployment mit …

kubectl delete deployment nginx-deployment

… vom Cluster entfernen.

(ID:46971631)