Übersicht über die automatische Clusterskalierung in Azure Kubernetes Service (AKS)

Um die Anwendungsanforderungen in Azure Kubernetes Service (AKS) zu erfüllen, müssen Sie möglicherweise die Anzahl von Knoten anpassen, die Ihre Workloads ausführen. Die Komponente für die automatische Clusterskalierung überwacht auf Pods in Ihrem Cluster, die aufgrund von Ressourceneinschränkungen nicht geplant werden können. Wenn die automatische Clusterskalierung nicht geplante Pods erkennt, skaliert sie die Anzahl der Knoten im Knotenpool hoch, um den Anwendungsbedarf zu erfüllen. Außerdem wird geprüft, ob es gering ausgelastete Knoten gibt, und geeignete Knoten werden herunterskaliert, wenn ihre Workloads sicher neu zugewiesen werden können.

In diesem Artikel erfahren Sie, wie die automatische Clusterskalierung in AKS funktioniert. Außerdem finden Sie hier Anleitungen, Best Practices und Überlegungen für die Konfiguration der automatischen Clusterskalierung für Ihre AKS-Workloads. Wenn Sie die automatische Clusterskalierung für Ihre AKS-Workloads aktivieren, deaktivieren oder aktualisieren möchten, finden Sie unter Verwenden der automatischen Clusterskalierung in AKS weitere Informationen.

Über den Cluster-Autoscaler

Cluster benötigen oft eine Möglichkeit zur automatischen Skalierung, um sich an sich ändernde Anwendungsanforderungen anzupassen, z. B. zwischen Arbeitstagen und Abenden oder an einem Wochenende. AKS-Cluster können auf folgende Weise skaliert werden:

  • Die Autoskalierung für Cluster überprüft regelmäßig auf Pods, die aufgrund von Ressourceneinschränkungen nicht auf Knoten geplant werden können. Der Cluster erhöht in diesem Fall automatisch die Anzahl von Knoten. Bei Verwendung der Autoskalierung für Cluster ist die manuelle Skalierung deaktiviert. Weitere Informationen finden Sie unter Wie funktioniert die Skalierung?
  • Bei der horizontalen automatischen Podskalierung überwacht der Metrikserver in einem Kubernetes-Cluster die Ressourcenanforderungen der Pods. Wenn eine Anwendung mehr Ressourcen benötigt, wird die Anzahl von Pods automatisch erhöht, um den Bedarf zu decken.
  • Die vertikale automatische Podskalierung legt basierend auf der vergangenen Nutzung automatisch Ressourcenanforderungen und Grenzwerte für Container pro Workload fest, um sicherzustellen, dass Pods auf Knoten geplant werden, die über die erforderlichen CPU- und Arbeitsspeicherressourcen verfügen.

Screenshot: Zusammenarbeit von Autoskalierung für Cluster und horizontaler automatischer Podskalierung, um die Anwendungsanforderungen zu erfüllen.

Es ist üblich, die automatische Clusterskalierung für Knoten zu aktivieren, und entweder die vertikale automatische Podskalierung oder die horizontale automatische Podskalierung für Pods. Wenn Sie die automatische Clusterskalierung aktivieren, werden die angegebenen Skalierungsregeln angewendet, wenn die Größe des Knotenpools kleiner als die minimale oder größer als die maximale Knotenanzahl ist. Die automatische Clusterskalierung wartet, bis ein neuer Knoten im Knotenpool benötigt wird oder bis ein Knoten sicher aus dem aktuellen Knotenpool gelöscht werden kann. Weitere Informationen finden Sie unter Wie funktioniert Herunterskalieren?

Bewährte Methoden und Überlegungen

  • Wenn Sie Verfügbarkeitszonen mit der Cluster-Autoskaler implementieren, verwenden Sie für jede Zone einen einzelnen Knotenpool. Setzen Sie den Parameter --balance-similar-node-groups auf True, um bei Hochskalierungsvorgängen eine ausgewogene Verteilung von Knoten über die Zonen hinweg für Ihre Workloads beizubehalten. Wenn Sie diesen Ansatz nicht verwenden, können Skalierungsvorgänge das Gleichgewicht von Knoten über Zonen hinweg unterbrechen. Bei multizonalen Knotenpools können Sie auch die AKS-Auswahl von Zonen dynamisch zulassen, indem Sie die automatische Zonenplatzierung (--zones auto) verwenden, wodurch Knoten in Zonen platziert werden, die Kapazität aufweisen, während ein maximaler Instanzprozentsatz von 50% pro Zone angewendet wird. Sie können die automatische Zonenplatzierung verwenden, wenn Sie einen Knotenpool erstellen oder einen vorhandenen Knotenpool aktualisieren.

    Hinweis

    Der Cluster Autoscaler berücksichtigt keine Zonen, und die zugrunde liegenden Skalierungsgruppen für virtuelle Computer übernehmen die Zonenzuordnung. Die vorangegangene bewährte Methode wird noch relevanter, wenn Sie zonenbasierte Pod-Topologieverteilungsbeschränkungen in einem einzelnen multizonalen Knotenpool verwenden, da restriktive Beschränkungen dazu führen können, dass Pods im Status Ausstehend verbleiben, insbesondere in Regionen mit eingeschränkter Kapazität oder beim Ausfall einer Zone.

  • Verwenden Sie für Cluster mit mehr als 400 Knoten Azure CNI oder Azure CNI Overlay.

  • Um Workloads gleichzeitig sowohl auf Spot- als auch auf On-Demand-Knotenpools effektiv zu betreiben, sollten Sie den Einsatz von Priority-Expandern in Betracht ziehen. Ein Prioritätsexpander verwendet die Prioritäten und Namensmuster von Knotenpools in der ConfigMap cluster-autoscaler-priority-expander, um beim Hochskalieren einen Knotenpool auszuwählen. Die folgende Konfiguration veranschaulicht dieses Setup.

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: cluster-autoscaler-priority-expander
      namespace: kube-system
    data:
      priorities: |-
        10:
          - .*spotpool1.*
          - .*spotpool2.*
        50:
          - .*ondemandpool1.*
    
  • Seien Sie vorsichtig, wenn Sie CPU- und Speicheranforderungen auf Pods zuweisen. Der Cluster Autoscaler skaliert anhand ausstehender Pods und nicht anhand der CPU- oder Speicherauslastung der Knoten.

  • Bei Clustern, die gleichzeitig sowohl lang andauernde Workloads wie Web-Apps als auch kurze oder stark schwankende Job-Workloads ausführen, trennen Sie diese mithilfe von Affinitätsregeln oder Expandern in separate Knotenpools.

  • Verwenden Sie PodDisruptionBudget, um unnötiges Drainen von Knoten oder Herunterskalierungsvorgänge zu verhindern. Durch Angabe der Anmerkung cluster-autoscaler.kubernetes.io/safe-to-evict: "false" in der Pod-Spezifikation wird auch verhindert, dass die Pods entfernt werden. Verwenden Sie diese Annotation mit Vorsicht, da der Cluster Autoscaler beim Drainen eines Knotens mit einem laufenden Pod, der diese Annotation enthält, auf Probleme stoßen kann.

  • Ändern Sie in einem automatisch skalierten Knotenpool die aktuelle Knotenanzahl nicht manuell. Um den zulässigen Skalierungsbereich zu ändern, aktualisieren Sie die minimale und maximale Knotenanzahl des Cluster-Autoscalers, nachdem Sie Ihre Arbeitslast- und Kapazitätsanforderungen bewertet haben.

  • Knoten werden nicht hochskaliert, wenn Pods einen PriorityClass-Wert unter -10 aufweisen. Die Priorität -10 ist für eine Überbereitstellung von Pods reserviert. Weitere Informationen finden Sie unter Verwenden der automatischen Clusterskalierung mit Podpriorität und vorzeitiger Entfernung.

  • Kombinieren Sie keine anderen Mechanismen für eine automatische Knotenskalierung wie VMSS-Autoskalierungen mit der automatischen Clusterskalierung.

  • Die automatische Clusterskalierung kann Knoten möglicherweise nicht herunterskalieren, wenn ein Verschieben der Pods nicht möglich ist. Dies kann in folgenden Situationen der Fall sein:

    • Ein Pod wird direkt erstellt und nicht von einem Controllerobjekt wie z. B. einer Bereitstellung oder einem ReplicaSet unterstützt.
    • Ein Budget für die Unterbrechung von Pods (Pod Disruption Budget, PDB) ist zu restriktiv und lässt nicht zu, dass die Anzahl der Pods unter einen bestimmten Schwellenwert fällt.
    • Ein Pod verwendet Knotenselektoren oder Anti-Affinität, die nicht berücksichtigt werden können, wenn der Pod auf einem anderen Knoten geplant wird. Weitere Informationen finden Sie unter Welche Podtypen können das Entfernen eines Knotens durch die automatische Clusterskalierung verhindern?.

Wichtig

Nehmen Sie keine Änderungen an einzelnen Knoten innerhalb der automatisch skalierten Knotenpools vor. Alle Knoten in einer Knotengruppe müssen über einheitliche Kapazitäten, Bezeichnungen, Taints und Systempods verfügen, die auf diesen Knoten ausgeführt werden.

  • Die automatische Clusterskalierung ist unabhängig von der Podplanung nicht für das Erzwingen einer „maximalen Knotenanzahl“ in einem Clusterknotenpool verantwortlich. Wenn ein nicht-Cluster-Autoskalierer-Akteur die Anzahl der Knoten im Knotenpool auf eine Zahl festlegt, die über das konfigurierte Maximum des Cluster-Autoskalierers hinausgeht, entfernt der Cluster-Autoskalierer die Knoten nicht automatisch. Das Abwärtsverhalten der Cluster-Autoskalierung bleibt auf das Entfernen von nicht genutzten Knoten festgelegt. Der einzige Zweck der Konfiguration der maximalen Knotenanzahl des Cluster autoscaler besteht darin, eine Obergrenze für Skalierungsvorgänge zu erzwingen. Das hat keine Auswirkungen auf Überlegungen zur Verkleinerung.

Profil für die automatische Clusterskalierung

Das Profil für die automatische Clusterskalierung enthält verschiedene Parameter, die das Verhalten der automatischen Clusterskalierung steuern. Sie können das Profil für die automatische Clusterskalierung konfigurieren, wenn Sie einen neuen Cluster erstellen oder einen vorhandenen Cluster aktualisieren.

Optimieren des Profils für die automatische Clusterskalierung

Sie sollten die Profileinstellungen für die automatische Clusterskalierung Ihren spezifischen Workloadszenarios entsprechend optimieren und gleichzeitig Kompromisse zwischen Leistung und Kosten berücksichtigen. Dieser Abschnitt enthält Beispiele, in denen diese Kompromisse erläutert werden.

Beachten Sie, dass die Profileinstellungen für die automatische Clusterskalierung für den gesamten Cluster gelten und auf alle automatisch skalierten Knotenpools angewendet werden. Sämtliche Skalierungen, die in einem Knotenpool ausgeführt werden, können sich auf das Verhalten der automatischen Skalierung anderer Knotenpools auswirken. Dies kann zu unerwarteten Ergebnissen führen. Stellen Sie sicher, dass Sie konsistente und synchronisierte Profilkonfigurationen für alle relevanten Knotenpools anwenden, um die gewünschten Ergebnisse zu erhalten.

Beispiel 1: Optimieren für Leistung

Verwenden Sie für Cluster, die erhebliche und stark schwankende Workloads verarbeiten und bei denen die Leistung im Vordergrund steht, ein kurzes scan-interval, damit der Cluster-Autoscaler den Cluster häufig neu auswertet. Durch das Erhöhen dieses Intervalls wird die Häufigkeit der erneuten Auswertung und der zugehörigen API-Aktivität reduziert, die Zeit jedoch erhöht, bevor die Cluster-Autoskalierung reagiert. Verringern Sie scale-down-utilization-threshold, um die Eignung unterausgelasteter Knoten für das Herunterskalieren zu reduzieren. Erhöhen Sie außerdem ok-total-unready-count und max-total-unready-percentage.

Setzen Sie für Cluster mit DaemonSet-Pods ignore-daemonsets-utilization auf true, damit DaemonSet-Pod-Anforderungen nicht berücksichtigt werden, wenn der Cluster-Autoscaler die Knotenauslastung beim Herunterskalieren berechnet. Diese Einstellung kann dazu führen, dass Knoten eher unter scale-down-utilization-threshold fallen und für eine Herunterskalierung infrage kommen. Siehe Konfigurieren des Cluster-Autoskalierungsprofils für sprunghafte Workloads.

Beispiel 2: Optimieren für Kosten

Wenn Sie ein kostenoptimiertes Profil möchten, empfehlen wir, die folgenden Parameterkonfigurationen festzulegen:

  • Reduzieren Sie scale-down-unneeded-time. Dies ist die Dauer, wie lange ein Knoten nicht benötigt werden sollte, bevor er für ein Herunterskalieren in Frage kommt.
  • Reduzieren Sie scale-down-delay-after-add. Dies ist die Dauer, die nach dem Hinzufügen eines Knotens gewartet werden soll, bevor er für ein Herunterskalieren in Frage kommt.
  • Erhöhen Sie scale-down-utilization-threshold. Dies ist der Auslastungsschwellenwert für das Entfernen von Knoten.
  • Erhöhen Sie max-empty-bulk-delete. Dies ist die maximale Anzahl von Knoten, die in einem einzelnen Aufruf gelöscht werden können.
  • Legen Sie skip-nodes-with-local-storage auf „false“ fest.
  • Erhöhen Sie ok-total-unready-count und max-total-unready-percentage.

Häufige Probleme und Empfehlungen für die Entschärfung

Sie können Skalierungsfehler und Ereignisse für nicht ausgelöste Hochskalierungen über die CLI oder das Portal anzeigen.

Nicht ausgelöste Hochskalierungen

Häufige Ursachen Empfehlungen für die Entschärfung
Konflikte mit der PersistentVolume-Knotenaffinität, die auftreten können, wenn die automatische Clusterskalierung mit mehreren Verfügbarkeitszonen verwendet wird oder wenn sich die Zone eines Pods oder eines persistenten Volumes von der Zone des Knotens unterscheidet. Verwenden Sie einen Knotenpool pro Verfügbarkeitszone, und aktivieren Sie --balance-similar-node-groups. Sie können in der Podspezifikation auch das Feld „volumeBindingMode“ auf „WaitForFirstConsumer“ festlegen, um zu verhindern, dass das Volume an einen Knoten gebunden wird, bis ein Pod mit dem Volume erstellt wird.
Taints- und Toleranzen/Konflikte mit der Knotenaffinität Bewerten Sie die Taints, die Ihren Knoten zugewiesen sind, und überprüfen Sie die in Ihren Pods definierten Toleranzen. Nehmen Sie bei Bedarf Anpassungen an den Taints und Toleranzen vor, um sicherzustellen, dass die Pods auf den Knoten effizient geplant werden können.
Restriktive Pod-Topologie-Ausbreitungsbeschränkungen Cluster Autoscaler führt Planungssimulationen vor dem Initiieren von Skalierungsvorgängen aus. Wenn festgestellt wird, dass ein Pod aufgrund restriktiver Topologieverteilungseinschränkungen nicht für einen neuen Knoten geplant werden kann, wird keine Hochskalierung versucht. Um dies zu mindern, sollten Sie die Topologie-Spread-Einschränkungen lockern.

Fehler beim Hochskalieren

Häufige Ursachen Empfehlungen für die Entschärfung
Ausschöpfung der IP-Adressen im Subnetz Fügen Sie ein weiteres Subnetz im selben virtuellen Netzwerk hinzu, und fügen Sie dem neuen Subnetz einen weiteren Knotenpool hinzu.
Ausschöpfung des Kernkontingents Das genehmigte Kernkontingent wurde ausgeschöpft. Fordern Sie eine Kontingenterhöhung an. Die automatische Clusterskalierung wechselt innerhalb der spezifischen Knotengruppe in einen exponentiellen Backoff-Status, wenn mehrere Hochskalierungsversuche fehlgeschlagen sind.
Maximale Größe des Knotenpools Erhöhen Sie die maximale Anzahl an Knoten im Knotenpool, oder erstellen Sie einen neuen Knotenpool.
Anforderungen/Aufrufe überschreiten die Quotengrenze Weitere Informationen finden Sie unter Fehler „429 – Zu viele Anforderungen“.

Fehler beim Herunterskalieren

Häufige Ursachen Empfehlungen für die Entschärfung
Pod verhindert Entladen von Knoten/Pod kann nicht entfernt werden • Sehen Sie sich an, welche Podtypen ein Herunterskalieren verhindern können.
• Legen Sie für Pods, die den lokalen Speicher verwenden, z. B. hostPath und emptyDir, das Profilflag skip-nodes-with-local-storage für die automatische Clusterskalierung auf false fest.
• Legen Sie in der Podspezifikation die Anmerkung cluster-autoscaler.kubernetes.io/safe-to-evict auf true fest.
• Überprüfen Sie Ihr PDB, da es möglicherweise restriktiv ist.
Minimale Größe des Knotenpools Verringern Sie die minimale Größe des Knotenpools.
Anforderungen/Aufrufe überschreiten die Quotengrenze Weitere Informationen finden Sie unter Fehler „429 – Zu viele Anforderungen“.
Schreibvorgänge gesperrt Nehmen Sie keine Änderungen an der vollständig verwalteten AKS-Ressourcengruppe vor (weitere Informationen finden Sie unter Unterstützungsrichtlinien für Azure Kubernetes Service). Entfernen oder setzen Sie alle Ressourcensperren zurück, die Sie zuvor auf die Ressourcengruppe angewendet haben.

Andere Probleme

Häufige Ursachen Empfehlungen für die Entschärfung
PriorityConfigMapNotMatchedGroup Stellen Sie sicher, dass jede Knotengruppe, für die die automatische Skalierung erforderlich ist, mindestens einem Knotenpoolnamenmuster in den priorities Daten der cluster-autoscaler-priority-expander ConfigMap entspricht. Allgemeines Erweiterungsverhalten finden Sie unter Was sind Expander?

Knotenpool in Backoff

Der Status „Knotenpool in Backoff“ wurde in Version 0.6.2 eingeführt und bewirkt, dass die automatische Clusterskalierung nach einem Skalierungsfehler eines Knotenpools ausgesetzt wird.

Je nachdem, wie lange fehler bei den Skalierungsvorgängen aufgetreten sind, kann die Autoskalierung bis zu 30 Minuten warten, bevor ein weiterer Versuch durchgeführt wird. Sie können den Backoffstatus des Knotenpools zurücksetzen, indem Sie die automatische Skalierung deaktivieren und dann erneut aktivieren.