Automatische Skalierung der GKE Last
Mit automatischer Skalierung müssen Sie sich weniger mit der Kapazitätsplanung auseinandersetzen und die Verfügbarkeit Ihres Dienstes kann bei Lastspitzen sichergestellt werden. Zudem zahlen Sie nur für Ressourcen, die zum jeweiligen Zeitpunkt gebraucht werden, und Sie erhalten automatisch weitere Ressourcen, wenn der Bedarf grösser wird.
Details
Mit einer konfigurierten automatisierten Skalierung fügt GKE dem Cluster automatisch neue Nodes hinzu, wenn die Kapazität Ihrer neu erstellten Pods nicht für deren Ausführung reicht. Wenn eine Node im Cluster hingegen nicht ausgelastet ist und seine Pods auf anderen Nodes ausgeführt werden können, wird der Node gegebenenfalls gelöscht.
Wenn Ressourcen während der automatischen Skalierung Ihres Clusters gelöscht oder verschoben werden, können Ihre Dienste beeinträchtigt werden. Wenn Ihr Dienst beispielsweise aus einem Controller mit einem einzelnen Replikat besteht, kann der Pod dieses Replikats auf einem anderen Node neu gestartet werden, wenn sein aktueller Node gelöscht wird. Bevor Sie die automatische Skalierung aktivieren, sollten Sie überprüfen, dass Ihre Dienste für Unterbrechungen geeignet sind.
Verfügbarkeit
Alle nine Managed GKE Cluster haben Automatische Skalierung eingeschaltet. Um dies zu nutzen gibt es aber ein paar Konfigurationen die notwendig sind.
Nutzung
Horizontales skalieren der Workloads
-
Lassen Sie uns die maximale Anzahl an Nodes wissen
Wir Skalieren Ihren Cluster Standardmässig nicht auf eine unbeschränkte Anzahl Nodes um Sie vor unerwarteten Kosten zu schützen. Wir haben eine minimale Anzahl von 3 Nodes definiert und eine Benutzerdefinierte maximale Anzahl von Nodes. Lassen Sie uns wissen, was Ihre bevorzugte maximale Anzahl an Nodes ist und wir konfigurieren diese.
-
Setzen Sie CPU requests auf Ihre Pods
Der Cluster Autoscaler benutzt die CPU requests als Basis um zum wissen wie viel Kapazität eine Node zur Verfügung hat. Ohne CPU requests kann der Cluster Autoscaler nicht arbeiten. Zusätzlich ist es eine bewährte Vorgehensweise, ob man den Autoscaler verwendet oder nicht.
-
Konfigurieren Sie einen Horizontal Pod Autoscaler
Damit die Anzahl der Pods auch mit der anfallender Last skalieren können sie einen Horizontal Pod Autoscaler (HPA) konfigurieren. Sobald alle Ihre Nodes voll sind wird dies den Cluster Autoscaler auslösen um mehr Nodes zum Cluster hinzuzufügen. Die Kubernetes Dokumentation hat eine sehr gutes Beispiel um einen HPA zu konfigurieren.
Skalierung anhand benutzerdefinierter Metriken
Mithilfe einer von Nine verwalteten Installation von keda können Sie ihre Workloads anhand von benutzerdefinierten Metriken skalieren. Keda erlaubt dabei die benötigten Metriken von verschiedenen Backends (keda nennt diese "Scalers") zu beziehen. Sie können die unterstützten Scaler in der Dokumentation finden. Weiterhin besteht auch die Möglichkeit (selbst entwickelte) externe Scaler einzusetzen, welche die Anbindung an bisher nicht unterstützte Metriken erlauben.
Falls sie an einer von Nine verwalteten keda Instanz interessiert sind, oder wissen möchten ob ihr use case von keda unterstützt wird, senden Sie uns bitte eine Nachricht.
Vertikales skalieren der Workloads
Damit Kubernetes Ihre Pods auf die bestehenden Nodes verteilen kann, sollten die Container Definitionen in Pods 'Ressourcen Requests' besitzen (hier können mehr Informationen darüber bezogen werden). Diese teilen Kubernetes mit, welche CPU/Memory Ressourcen der jeweilige Pod auf einem Node nutzen wird bzw. welche Ressourcen auf einem Node für diesen Pod reserviert werden. Die angegebenen Zahlen sind jedoch völlig unabhängig von der wahren Ressourcen Nutzung des Pods. Dies führt dazu, dass die gesetzten 'Ressourcen Requests' meist stark von der reellen Nuztung abweichen.
Da es unter Umständen schwierig sein kann entsprechende Werte für die 'Ressourcen Request' zu ermitteln (und weil sich diese im Lebenszyklus einer Applikation auch ändern können), versucht das Vertical Pod Autoscaler Projekt sinnvolle Empfehlungen bereit zu stellen. Es werden dazu die reellen Nutzungsmetriken der Pods konstant überwacht um daraus dann Empfehlungen für 'Ressourcen Requests' zu ermitteln. Abhängig vom gewählten updateMode der VerticalPodAutoscaler Ressource, werden die gefundenen Empfehlungen auch gesetzt. Dabei werden die entsprechenden Pods, unter Zuhilfenahme der Eviction API, mit geänderten 'Ressourcen Request' neu gestartet. Es sollten Pod Disruption Budgets definiert werden, da es sonst zu Unterbrüchen in der Verfügbarkeit der zu skalierenden Applikation kommen kann. Weiterhin sollten mindestens 2 Replikas konfiguriert werden.
Erstellung eines VerticalPodAutoscalers
Eine VerticalPodAutoscaler Ressource kann für alle Kubernetes Ressourcen, welche selbst Pods verwalten, eingesetzt werden. Dazu zählen bspw. Deployments
, StatefulSets
, ReplicaSets
, etc. Hier ein Beispiel für eine VerticalPodAutoscaler Ressource welche die Pods des Deployments 'my-app' überwacht. Das Deployment muss sich im selben Namespace wie die VerticalPodAutoscaler Ressource selbst befinden.
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: my-app-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: my-app
updatePolicy:
updateMode: "Auto"
Die Ressource kann auf dem üblichen Weg mittels kubectl create -f <Dateiname> -n <Namespace>
angelegt werden.
Die Controller des Vertical Pod Autoscalers werden die Nutzungsmetriken der Pods des Deployments konstant überwachen. Nach einiger Zeit wir die angelegte VerticalPodAutoscaler Ressource mit den gefundenen Ressourcen Request Empfehlungen geupdated. Da der updateMode auf den Wert "Auto" konfiguriert wurde, werden die entsprechenden Pods, mit den gesetzten Empfehlungen, auch neu gestartet werden. Der updateMode kann auf "Off" gesetzt werden um lediglich Empfehlungen zu erhalten ohne das Pods neu gestartet werden.
Für weitere Informationen empfehlen wir dieses Tutorial von Google welches auch beschreibt wie bestimmte Container von den Ressourcen Request Empfehlungen ausgenommen werden können.
Bekannte Limitationen
Die bekannten Limitationen des Vertical Pod Autoscalers können hier eingesehen werden. Insbesondere sollten Sie den Vertical Pod Autoscaler nicht zusammen mit dem Horizontal Pod Autoscaler verwenden, falls dieser anhand von CPU oder Memory Metriken skalieren soll.