Ü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.

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

 

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).

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. Ferner könnten wir jederzeit den Status unseres Deployments ermitteln, dies gelingt mit dem Kommando:

kubectl get deployment

 

Unser Deployment besteht aus einem Frontend und einem Backend.

 

Unser Deployment besteht aus einem Frontend und einem Backend. (Bild: Drilling / Microsoft).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.

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

Das Resultat überprüfen wir dann mit

kubectl get pods

Das manuelle Skalieren von Pods.
Das manuelle Skalieren von Pods. (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 manuelle Skalieren von Knoten.
Das manuelle Skalieren von Knoten. (Bild: Drilling / Microsoft).

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

kubectl get nodes
 

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>

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).

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

Die Verteilung der Pods.
Die Verteilung der Pods. (Bild: Drilling / Microsoft).
Wer genug experimentiert hat, kann das vollständige Deployment mit …
 
kubectl delete deployment nginx-deployment
 
… vom Cluster entfernen.
 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.