Drei Ebenen der automatischen Skalierung in Kubernetes: Wie man sie effektiv nutzt

Drei Ebenen der automatischen Skalierung in Kubernetes: Wie man sie effektiv nutzt
Um Kubernetes vollständig zu beherrschen, müssen Sie verschiedene Möglichkeiten zur Skalierung von Clusterressourcen kennen: nach nach Angaben der SystementwicklerDies ist eine der Hauptaufgaben von Kubernetes. Wir haben einen allgemeinen Überblick über horizontale und vertikale automatische Skalierungs- und Cluster-Größenänderungsmechanismen sowie Empfehlungen für deren effektive Nutzung bereitgestellt.

Artikel Kubernetes Autoscaling 101: Cluster-Autoscaler, horizontaler Autoscaler und vertikaler Pod-Autoscaler übersetzt von dem Team, das die automatische Skalierung implementiert hat Kubernetes aaS von Mail.ru.

Warum es wichtig ist, über Skalierung nachzudenken

Kubernetes - ein Tool für Ressourcenmanagement und Orchestrierung. Natürlich ist es schön, an den coolen Funktionen zum Bereitstellen, Überwachen und Verwalten von Pods herumzubasteln (ein Pod ist eine Gruppe von Containern, die als Reaktion auf eine Anfrage gestartet werden).

Allerdings sollten Sie auch über folgende Fragen nachdenken:

  1. Wie skaliert man Module und Anwendungen?
  2. Wie können Container betriebsbereit und effizient gehalten werden?
  3. Wie kann auf ständige Codeänderungen und Arbeitslasten der Benutzer reagiert werden?

Die Konfiguration von Kubernetes-Clustern zum Ausgleich von Ressourcen und Leistung kann eine Herausforderung sein und erfordert Expertenwissen über das Innenleben von Kubernetes. Die Arbeitslast Ihrer Anwendung oder Dienste kann im Laufe des Tages oder sogar im Laufe einer Stunde schwanken, daher sollte der Ausgleich am besten als fortlaufender Prozess betrachtet werden.

Kubernetes-Autoscaling-Ebenen

Eine effektive Autoskalierung erfordert die Koordination zwischen zwei Ebenen:

  1. Pod-Ebene, einschließlich horizontaler (Horizontal Pod Autoscaler, HPA) und vertikaler Autoskalierung (Vertical Pod Autoscaler, VPA). Dadurch werden die verfügbaren Ressourcen für Ihre Container skaliert.
  2. Clusterebene, die vom Cluster Autoscaler (CA) verwaltet wird und die Anzahl der Knoten innerhalb des Clusters erhöht oder verringert.

Horizontales Autoscaler-Modul (HPA).

Wie der Name schon sagt, skaliert HPA die Anzahl der Pod-Replikate. Die meisten Entwickler nutzen CPU- und Speicherlast als Auslöser für die Änderung der Anzahl der Replikate. Es ist jedoch möglich, das System basierend darauf zu skalieren benutzerdefinierte Metriken, & ndash; Kombination oder externe Kennzahlen.

High-Level-HPA-Betriebsdiagramm:

  1. Die HPA überprüft kontinuierlich die bei der Installation angegebenen Metrikwerte in einem Standardintervall von 30 Sekunden.
  2. Die HPA versucht, die Anzahl der Module zu erhöhen, wenn der angegebene Schwellenwert erreicht wird.
  3. Der HPA aktualisiert die Anzahl der Replikate innerhalb des Bereitstellungs-/Replikationscontrollers.
  4. Der Bereitstellungs-/Replikationscontroller stellt dann alle erforderlichen zusätzlichen Module bereit.

Drei Ebenen der automatischen Skalierung in Kubernetes: Wie man sie effektiv nutzt
HPA startet den Modulbereitstellungsprozess, wenn ein Metrikschwellenwert erreicht wird

Beachten Sie bei der Verwendung von HPA Folgendes:

  • Das standardmäßige HPA-Prüfintervall beträgt 30 Sekunden. Es wird durch die Flagge gesetzt horizontal-pod-autoscaler-sync-periode im Controller-Manager.
  • Der standardmäßige relative Fehler beträgt 10 %.
  • Nach der letzten Erhöhung der Modulzahl rechnet die HPA mit einer Stabilisierung der Kennzahlen innerhalb von drei Minuten. Dieses Intervall wird durch das Flag festgelegt horizontal-pod-autoscaler-upscale-delay.
  • Nach der letzten Reduzierung der Modulzahl wartet die HPA fünf Minuten, um sich zu stabilisieren. Dieses Intervall wird durch das Flag festgelegt horizontal-pod-autoscaler-downscale-delay.
  • HPA funktioniert am besten mit Bereitstellungsobjekten und nicht mit Replikationscontrollern. Die horizontale Autoskalierung ist nicht mit der fortlaufenden Aktualisierung kompatibel, die Replikationscontroller direkt manipuliert. Beim Deployment hängt die Anzahl der Replikate direkt von den Deployment-Objekten ab.

Vertikale automatische Skalierung von Pods

Vertikale Autoskalierung (VPA) weist vorhandenen Pods mehr (oder weniger) CPU-Zeit oder Speicher zu. Geeignet für zustandsbehaftete oder zustandslose Pods, aber hauptsächlich für zustandsbehaftete Dienste gedacht. Sie können VPA jedoch auch für zustandslose Module verwenden, wenn Sie die Menge der ursprünglich zugewiesenen Ressourcen automatisch anpassen müssen.

VPA reagiert auch auf OOM-Ereignisse (Out of Memory). Das Ändern der CPU-Zeit und des Speichers erfordert einen Neustart der Pods. Beim Neustart respektiert die VPA das Zuteilungsbudget (Verteilungsbudget für Pods, PDB), um die erforderliche Mindestanzahl an Modulen zu gewährleisten.

Sie können für jedes Modul die minimalen und maximalen Ressourcen festlegen. Somit können Sie die maximale Menge des zugewiesenen Speichers auf 8 GB begrenzen. Dies ist sinnvoll, wenn die aktuellen Knoten definitiv nicht mehr als 8 GB Speicher pro Container zuweisen können. Detaillierte Spezifikationen und Betriebsmechanismen sind in beschrieben offizielles VPA-Wiki.

Darüber hinaus verfügt VPA über eine interessante Empfehlungsfunktion (VPA Recommender). Es überwacht die Ressourcennutzung und OOM-Ereignisse aller Module, um basierend auf einem intelligenten Algorithmus, der auf historischen Metriken basiert, neue Speicher- und CPU-Zeitwerte vorzuschlagen. Es gibt auch eine API, die ein Pod-Handle akzeptiert und vorgeschlagene Ressourcenwerte zurückgibt.

Es ist erwähnenswert, dass VPA Recommender das „Ressourcenlimit“ nicht verfolgt. Dies kann dazu führen, dass das Modul Ressourcen innerhalb von Knoten monopolisiert. Es ist besser, das Limit auf Namespace-Ebene festzulegen, um einen großen Speicher- oder CPU-Verbrauch zu vermeiden.

VPA-Betriebsschema auf hoher Ebene:

  1. VPA überprüft kontinuierlich die bei der Installation angegebenen Metrikwerte in einem Standardintervall von 10 Sekunden.
  2. Wenn der angegebene Schwellenwert erreicht ist, versucht der VPA, die zugewiesene Ressourcenmenge zu ändern.
  3. Der VPA aktualisiert die Anzahl der Ressourcen innerhalb des Bereitstellungs-/Replikationscontrollers.
  4. Beim Neustart von Modulen werden alle neuen Ressourcen auf die erstellten Instanzen angewendet.

Drei Ebenen der automatischen Skalierung in Kubernetes: Wie man sie effektiv nutzt
VPA fügt die erforderliche Menge an Ressourcen hinzu

Bitte beachten Sie bei der Verwendung von VPA folgende Punkte:

  • Die Skalierung erfordert einen obligatorischen Neustart des Pods. Dies ist notwendig, um einen instabilen Betrieb nach der Durchführung von Änderungen zu vermeiden. Aus Gründen der Zuverlässigkeit werden Module neu gestartet und basierend auf den neu zugewiesenen Ressourcen auf die Knoten verteilt.
  • VPA und HPA sind noch nicht miteinander kompatibel und können nicht auf denselben Pods laufen. Wenn Sie beide Skalierungsmechanismen im selben Cluster verwenden, stellen Sie sicher, dass Ihre Einstellungen verhindern, dass sie auf denselben Objekten aktiviert werden.
  • VPA optimiert Containeranforderungen für Ressourcen nur basierend auf der vergangenen und aktuellen Nutzung. Es werden keine Beschränkungen für die Ressourcennutzung festgelegt. Es kann zu Problemen kommen, wenn Anwendungen nicht ordnungsgemäß funktionieren und immer mehr Ressourcen beanspruchen. Dies führt dazu, dass Kubernetes diesen Pod abschaltet.
  • VPA befindet sich noch in einem frühen Entwicklungsstadium. Seien Sie darauf vorbereitet, dass das System in naher Zukunft einige Änderungen erfahren wird. Sie können darüber lesen bekannte Einschränkungen и Entwicklungspläne. Daher ist geplant, den gemeinsamen Betrieb von VPA und HPA sowie den Einsatz von Modulen zusammen mit einer vertikalen Autoskalierungsrichtlinie für diese zu implementieren (z. B. eine spezielle Kennzeichnung „erfordert VPA“).

Automatische Skalierung eines Kubernetes-Clusters

Cluster Autoscaler (CA) ändert die Anzahl der Knoten basierend auf der Anzahl der wartenden Pods. Das System prüft regelmäßig, ob ausstehende Module vorhanden sind – und erhöht die Clustergröße, wenn mehr Ressourcen benötigt werden und der Cluster die festgelegten Grenzwerte nicht überschreitet. Die CA kommuniziert mit dem Cloud-Dienstanbieter, fordert von ihm zusätzliche Knoten an oder gibt ungenutzte Knoten frei. Die erste allgemein verfügbare Version von CA wurde in Kubernetes 1.8 eingeführt.

Allgemeines Schema des SA-Betriebs:

  1. CA prüft in einem Standardintervall von 10 Sekunden, ob sich Module im Status „Ausstehend“ befinden.
  2. Wenn sich ein oder mehrere Pods im Standby-Zustand befinden, weil der Cluster nicht über genügend verfügbare Ressourcen verfügt, um sie zuzuweisen, versucht er, einen oder mehrere zusätzliche Knoten bereitzustellen.
  3. Wenn der Cloud-Dienstanbieter den erforderlichen Knoten zuweist, tritt er dem Cluster bei und ist bereit, die Pods bereitzustellen.
  4. Der Kubernetes-Scheduler verteilt ausstehende Pods an einen neuen Knoten. Bleiben danach noch einige Module im Wartezustand, wird der Vorgang wiederholt und dem Cluster werden neue Knoten hinzugefügt.

Drei Ebenen der automatischen Skalierung in Kubernetes: Wie man sie effektiv nutzt
Automatische Bereitstellung von Clusterknoten in der Cloud

Berücksichtigen Sie Folgendes, wenn Sie CA verwenden:

  • CA stellt sicher, dass alle Pods im Cluster unabhängig von der CPU-Auslastung Platz zum Ausführen haben. Außerdem wird versucht sicherzustellen, dass sich im Cluster keine unnötigen Knoten befinden.
  • CA registriert die Notwendigkeit einer Skalierung nach etwa 30 Sekunden.
  • Sobald ein Knoten nicht mehr benötigt wird, wartet die Zertifizierungsstelle standardmäßig 10 Minuten, bevor sie das System skaliert.
  • Das Autoscaling-System basiert auf dem Konzept der Expander. Hierbei handelt es sich um unterschiedliche Strategien zur Auswahl einer Gruppe von Knoten, zu denen neue Knoten hinzugefügt werden.
  • Nutzen Sie die Option verantwortungsbewusst Cluster-Autoscaler.kubernetes.io/safe-to-evict (true). Wenn Sie viele Pods installieren oder viele davon über alle Knoten verteilt sind, verlieren Sie weitgehend die Möglichkeit, den Cluster zu skalieren.
  • Verwenden PodDisruptionBudgetsum zu verhindern, dass Pods gelöscht werden, was dazu führen könnte, dass Teile Ihrer Anwendung vollständig kaputt gehen.

Wie Kubernetes-Autoscaler miteinander interagieren

Für eine perfekte Harmonie sollte die automatische Skalierung sowohl auf Pod-Ebene (HPA/VPA) als auch auf Cluster-Ebene angewendet werden. Sie interagieren relativ einfach miteinander:

  1. HPAs oder VPAs aktualisieren Pod-Replikate oder Ressourcen, die vorhandenen Pods zugewiesen sind.
  2. Wenn für die geplante Skalierung nicht genügend Knoten vorhanden sind, erkennt die CA das Vorhandensein von Pods im Wartezustand.
  3. Die CA weist neue Knoten zu.
  4. Module werden auf neue Knoten verteilt.

Drei Ebenen der automatischen Skalierung in Kubernetes: Wie man sie effektiv nutzt
Kollaboratives Kubernetes-Scale-out-System

Häufige Fehler bei der automatischen Skalierung von Kubernetes

Es gibt mehrere häufige Probleme, auf die Entwickler stoßen, wenn sie versuchen, Autoscaling zu implementieren.

HPA und VPA hängen von Metriken und einigen historischen Daten ab. Wenn nicht genügend Ressourcen zugewiesen werden, werden die Module minimiert und können keine Metriken generieren. In diesem Fall findet keine automatische Skalierung statt.

Der Skalierungsvorgang selbst ist zeitkritisch. Wir möchten, dass die Module und der Cluster schnell skalieren – bevor Benutzer Probleme oder Ausfälle bemerken. Daher sollte die durchschnittliche Skalierungszeit für Pods und den Cluster berücksichtigt werden.

Ideales Szenario – 4 Minuten:

  1. 30 Sekunden. Zielmetriken aktualisieren: 30–60 Sekunden.
  2. 30 Sekunden. HPA prüft Metrikwerte: 30 Sekunden.
  3. Weniger als 2 Sekunden. Pods werden erstellt und gehen in den Wartezustand: 1 Sekunde.
  4. Weniger als 2 Sekunden. CA sieht wartende Module und sendet Aufrufe an Bereitstellungsknoten: 1 Sekunde.
  5. 3 Minuten. Der Cloud-Anbieter weist Knoten zu. K8s warten, bis sie bereit sind: bis zu 10 Minuten (abhängig von mehreren Faktoren).

Worst-Case-Szenario (realistischer) – 12 Minuten:

  1. 30 Sekunden. Zielmetriken aktualisieren.
  2. 30 Sekunden. HPA prüft die Metrikwerte.
  3. Weniger als 2 Sekunden. Die Pods werden erstellt und gehen in den Standby-Zustand über.
  4. Weniger als 2 Sekunden. Die CA sieht die wartenden Module und führt Aufrufe zur Bereitstellung der Knoten durch.
  5. 10 Minuten. Der Cloud-Anbieter weist Knoten zu. K8s warten, bis sie bereit sind. Die Wartezeit hängt von mehreren Faktoren ab, z. B. der Verzögerung des Anbieters, der Betriebssystemverzögerung und den Support-Tools.

Verwechseln Sie nicht die Skalierungsmechanismen von Cloud-Anbietern mit unserer CA. Letzteres läuft innerhalb eines Kubernetes-Clusters, während die Cloud-Provider-Engine auf Knotenverteilungsbasis arbeitet. Es weiß nicht, was mit Ihren Pods oder Ihrer Anwendung los ist. Diese Systeme arbeiten parallel.

So verwalten Sie die Skalierung in Kubernetes

  1. Kubernetes ist ein Ressourcenmanagement- und Orchestrierungstool. Vorgänge zur Verwaltung von Pods und Clusterressourcen sind ein wichtiger Meilenstein bei der Beherrschung von Kubernetes.
  2. Verstehen Sie die Logik der Pod-Skalierbarkeit unter Berücksichtigung von HPA und VPA.
  3. CA sollte nur verwendet werden, wenn Sie die Anforderungen Ihrer Pods und Container genau kennen.
  4. Um einen Cluster optimal zu konfigurieren, müssen Sie verstehen, wie verschiedene Skalierungssysteme zusammenarbeiten.
  5. Berücksichtigen Sie bei der Schätzung der Skalierungszeit Worst-Case- und Best-Case-Szenarien.

Source: habr.com

Kommentar hinzufügen