Horizontales Pod-Autoscaling

Auf dieser Seite erhalten Sie einen Überblick über die Funktion „Horizontales Pod-Autoscaling“ und darüber, wie sie in der Google Kubernetes Engine (GKE) eingesetzt wird. Außerdem erfahren Sie, wie Sie auf Ihren Clustern horizontales Pod-Autoscaling konfigurieren und verwenden.

Der horizontale Pod-Autoscaler ändert die Größe Ihrer Kubernetes-Arbeitslast, indem die Anzahl der Pods als Reaktion auf den CPU- oder Arbeitsspeicherverbrauch der Arbeitslast oder als Reaktion auf benutzerdefinierte Messwerte, die aus Kubernetes gemeldet werden, oder auf externe Messwerte aus Quellen außerhalb Ihres Clusters automatisch erhöht oder verringert wird.

Das horizontale Pod-Autoscaling ändert nicht die Anzahl der Knoten in einem GKE-Cluster. Wenn Sie die Anzahl der Knoten im Cluster automatisch basierend auf Änderungen der Anzahl der Pods skalieren möchten, können Sie den Cluster Autoscaler verwenden.

Wenn Sie Ihre Arbeitslast zum ersten Mal auf einem Kubernetes-Cluster bereitstellen, sind Sie vielleicht nicht sicher, welche Ressourcenanforderungen erforderlich sind. Diese Anforderungen können sich im Laufe der Zeit auch ändern, je nach Nutzungsmuster, externen Abhängigkeiten oder anderen Faktoren. Horizontales Pod-Autoscaling sorgt dafür, dass Ihre Arbeitslast in verschiedenen Situationen konsistent funktioniert. Außerdem können Sie die Kosten kontrollieren, indem Sie nur für zusätzliche Kapazität bezahlen, wenn Sie sie benötigen.

Es ist nicht immer einfach, die Indikatoren vorherzusagen, die Aufschluss darüber geben, ob Ihre Arbeitslast unzureichend ist oder nicht ausgeschöpft wird. Das horizontale Pod-Autoscaling kann die Anzahl der Pods in Ihrer Arbeitslast basierend auf einem oder mehreren Messwerten der folgenden Typen automatisch skalieren:

  • Tatsächliche Ressourcennutzung: Wenn die CPU- oder Speichernutzung eines bestimmten Pods einen Schwellenwert überschreitet. Das kann als Rohwert oder als Prozentsatz des Betrags ausgedrückt werden, den der Pod für diese Ressource anfordert.

  • Benutzerdefinierte Messwerte: Basierend auf einem Messwert, der von einem Kubernetes-Objekt in einem Cluster gemeldet wird, z. B. die Rate von Clientanfragen pro Sekunde oder E/A-Schreibvorgänge pro Sekunde.

    Das kann nützlich sein, wenn Ihre Anwendung eher zu Netzwerkengpässen als zu CPU- oder Arbeitsspeicherengpässen neigt.

  • Externe Messwerte: Basierend auf einem Messwert aus einer Anwendung oder einem Dienst außerhalb Ihres Clusters.

    Zum Beispiel benötigt Ihre Arbeitslast unter Umständen mehr CPU, wenn eine große Anzahl von Anfragen von einer Pipeline wie Pub/Sub aufgenommen wird. Sie können einen externen Messwert für die Größe der Warteschlange erstellen und das horizontale Pod-Autoscaling so konfigurieren, dass die Anzahl der Pods automatisch erhöht wird, wenn die Warteschlangengröße einen bestimmten Grenzwert erreicht, und verringert wird, wenn die Warteschlangengröße sinkt.

Sie können ein horizontales Pod-Autoscaling mit einem vertikalen Pod-Autoscaling kombinieren, wobei einige Einschränkungen gelten.

Funktionsweise des horizontalen Pod-Autoscaling

Jeder konfigurierte horizontale Pod-Autoscaler arbeitet mit einem Regelkreis. Für jede Arbeitslast gibt es ein separates horizontales Pod-Autoscaling. Jeder horizontale Pod-Autoscaler prüft regelmäßig die Messwerte einer bestimmten Arbeitslast anhand der von Ihnen konfigurierten Zielschwellenwerte und ändert die Form der Arbeitslast automatisch.

Ressourcen pro Pod

Für Ressourcen, die pro Pod zugewiesen werden, z. B. die CPU, fragt der Controller die Resource Metrics API für jeden Container ab, der im Pod ausgeführt wird.

  • Wenn Sie einen Rohwert für die CPU oder den Arbeitsspeicher angeben, wird der Wert verwendet.
  • Wenn Sie einen Prozentwert für CPU oder Arbeitsspeicher angeben, berechnet das horizontale Pod-Autoscaling den durchschnittlichen Auslastungswert als Prozentsatz der CPU- oder Arbeitsspeicheranforderungen dieses Pods.
  • Benutzerdefinierte und externe Messwerte werden als Rohwerte oder Durchschnittswerte ausgedrückt.

Der Controller verwendet den Durchschnitts- oder Rohwert für einen gemeldeten Messwert, um ein Verhältnis zu erstellen, und verwendet dieses Verhältnis, um die Arbeitslast automatisch zu skalieren. Eine Beschreibung des Algorithmus für das horizontale Pod-Autoscaling finden Sie in der Dokumentation des Kubernetes-Projekts.

Auf mehrere Messwerte reagieren

Wenn Sie eine Arbeitslast für die automatische Skalierung basierend auf mehreren Messwerten konfigurieren, wertet das horizontale Pod-Autoscaling jeden Messwert separat aus und verwendet den Skalierungsalgorithmus, um die neue Arbeitslastskalierung basierend auf jedem einzelnen zu bestimmen. Für die automatische Skalierungsaktion wird die größte Skalierung ausgewählt.

Wenn einer oder mehrere der Messwerte aus irgendeinem Grund nicht verfügbar sind, skaliert das horizontale Pod-Autoscaling auf der Grundlage der größten berechneten Größe nach oben, jedoch nicht mehr nach unten.

Seitenflattern verhindern

Seitenflattern bezieht sich auf eine Situation, in der das horizontale Pod-Autoscaling versucht, nachfolgende Autoscaling-Aktionen auszuführen, bevor die Arbeitslast auf vorherige Autoscaling-Aktionen reagiert. Das horizontale Pod-Autoscaling wählt die größte Empfehlung aus einem angegebenen Stabilisierungszeitraum aus, um Seitenflattern zu verhindern. Dieses Verhalten wird durch das Feld scaleDown.stabilizationWindowSeconds in der HPA-Spezifikation behavior gesteuert, das in GKE standardmäßig auf 300 Sekunden (fünf Minuten) festgelegt ist.

Damit kleinere Schwankungen keine unnötigen Skalierungsereignisse verursachen, verwendet der horizontale Pod-Autoscaler einen Toleranzwert von 10%. Für ein bestimmtes Ziel wird keine Skalierungsmaßnahme ergriffen, wenn das Verhältnis des aktuellen Messwertes zum Zielmesswert innerhalb von 10% von 1,0 liegt.

Skalierung auf und von null

In GKE-Version 1.37 oder höher können Sie den horizontalen Pod-Autoscaler so konfigurieren, dass eine Arbeitslast bei fehlender Nachfrage auf 0 Replikate skaliert und bei wiederkehrender Nachfrage automatisch wieder hochskaliert wird. Die Skalierung auf und von null umfasst die folgenden Verhaltensweisen:

  • Toleranzumgehung: Wenn eine Arbeitslast 0 Replikate hat, umgeht GKE die standardmäßige Toleranzprüfung für Messwerte (Verhältnis von 0,9 bis 1,1). Jeder Messwert über null, z. B. eine einzelne Nachricht in einer Warteschlange, löst sofort eine Aufskalierung auf mindestens 1 Replikate aus, ohne dass ein Toleranzschwellenwert überschritten werden muss.
  • Stabilisierungszeiträume: Das Hochskalieren wird standardmäßig nach 0 Sekunden (scaleUp.stabilizationWindowSeconds: 0) sofort aktiviert, während das Herunterskalieren standardmäßig nach 300 Sekunden (scaleDown.stabilizationWindowSeconds: 300) erfolgt, um sicherzustellen, dass fünf Minuten lang keine Nachfrage besteht, bevor auf 0 Replikate skaliert wird.
  • Statusbedingungen: Wenn der HPA auf 0 Replikate skaliert wird, meldet der Controller den Status ScaledToZero: True, bleibt aber aktiv (ScalingActive: True). Wenn eine Arbeitslast manuell auf 0 Replikate skaliert wird, z. B. mit dem Befehl kubectl scale, wird das Autoscaling pausiert (ScalingActive: False), bis die Arbeitslast wieder auf 1 oder mehr Replikate skaliert wird.

Eine detaillierte Anleitung finden Sie unter GKE-Arbeitslasten mit HPA auf null und von null skalieren.

Beschränkungen

  • Sofern Sie nicht HPA-Rightsizing mit VPA (Vorabversion) verwenden, sollten Sie das horizontale Pod-Autoscaling nicht zusammen mit dem standardmäßigen vertikalen Pod-Autoscaling für CPU oder Arbeitsspeicher verwenden. Für andere Messwerte können Sie das horizontale Pod-Autoscaling und das vertikale Pod-Autoscaling gemeinsam verwenden. Alternativ können Sie mehrdimensionales Pod-Autoscaling konfigurieren, um gleichzeitig horizontal auf CPU und vertikal auf Speicher zu skalieren.
  • Wenn Sie ein Deployment haben, konfigurieren Sie das horizontale Pod-Autoscaling nicht auf dem ReplicaSet- oder Replikations-Controller, der das Deployment unterstützt. Wenn Sie ein Rolling Update für den Deployment- oder Replikations-Controller ausführen, wird er durch einen neuen Replikations-Controller ersetzt. Konfigurieren Sie stattdessen das horizontale Pod-Autoscaling im Deployment selbst.
  • Sie können horizontales Pod-Autoscaling nicht für Arbeitslasten verwenden, die nicht skaliert werden können, z. B. DaemonSets.
  • Beim horizontalen Pod-Autoscaling werden Messwerte als Kubernetes-Ressourcen freigegeben. Das schränkt die Namen von Messwerten ein, z. B. dürfen sie keine Großbuchstaben oder Schrägstriche enthalten. Ihr Messwertadapter lässt möglicherweise ein Umbenennen zu. Weitere Informationen finden Sie unter prometheus-adapter as-Operator.
  • Der horizontale Pod-Autoscaler skaliert nicht nach unten, wenn einer der Messwerte, die er überwachen soll, nicht verfügbar ist. Informationen dazu, wie Sie prüfen, ob nicht verfügbare Messwerte vorhanden sind, finden Sie unter Details zu einem horizontalen Pod-Autoscaling ansehen.

Skalierbarkeit

Für das horizontale Pod-Autoscaling gibt es kein festes Limit für die Anzahl der unterstützten HPA-Objekte. Die Leistung kann jedoch beeinträchtigt werden, wenn diese Anzahl steigt. Insbesondere kann der Zeitraum zwischen HPA-Neuberechnungen länger als die standardmäßigen 15 Sekunden sein.

  • In GKE-Nebenversion 1.31 oder 1.32 sollte der Neuberechnungszeitraum bei Konfiguration des HPA-Leistungsprofils innerhalb von 15 Sekunden mit bis zu 1.000 HPA-Objekten liegen. Informationen zum Konfigurieren des HPA-Profils für die Leistung
  • In GKE-Nebenversion 1.33 oder höher sollte der Neuberechnungszeitraum innerhalb von 15 Sekunden mit bis zu 5.000 HPA-Objekten liegen, wenn das HPA-Profil für die Leistung konfiguriert ist. Das HPA-Profil „Leistung“ ist standardmäßig für alle Cluster aktiviert, die die Anforderungen erfüllen.
  • Wenn das HPA-Profil für die Leistung nicht konfiguriert ist, sollte der Neuberechnungszeitraum innerhalb von 15 Sekunden mit bis zu 300 HPA-Objekten bleiben.

Die folgenden Faktoren können sich ebenfalls auf die Leistung auswirken:

  • Skalierung auf mehrere Messwerte: Für jeden Messwert wird ein Abrufaufruf für die Berechnung von Empfehlungen hinzugefügt, was sich auf den Zeitraum für die Neuberechnung auswirkt.
  • Die Latenz des benutzerdefinierten Messwert-Stacks: Die Antwortzeiten über etwa 50 Millisekunden würden mehr als gewöhnlich mit den Kubernetes-Standardmesswerten beobachtet, was sich auf den Neuberechnungszeitraum auswirkt.

Mit HorizontalPodAutoscaler-Objekten interagieren

Sie können ein horizontales Pod-Autoscaling für eine Arbeitslast konfigurieren und Informationen zu Autoscaling-Ereignissen und den Ursachen dafür abrufen. Rufen Sie dazu in der Cloud de Confiance Console die Seite Arbeitslasten auf.

Jeder horizontale Pod-Autoscaler ist im Cluster als HorizontalPodAutoscaler-Objekt vorhanden. Sie können Befehle wie kubectl get hpa oder kubectl describe hpa HPA_NAME verwenden, um mit diesen Objekten zu interagieren.

Sie können HorizontalPodAutoscaler-Objekte auch mit dem Befehl kubectl autoscale erstellen.

Nächste Schritte