Kubernetes Cluster-Autoscaler

Kubernetes Cluster-Autoscaler konfigurieren: Ein praktischer Leitfaden

Wie funktioniert ein Cluster-Autoscaler und wie konfiguriert man ihn? Hier findest du die Antwort! Dieser Blog ist ein praktischer Leitfaden mit Fokus auf die High-Level-Konzepte des Cluster-Autoscalers und die Einrichtung und Simulation seiner Aktionen. Dabei bieten wir dir ein greifbares Verständnis zur Funktionsweise des Cluster-Autoscalers. 

Kubernetes Cluster-Autoscaler ist ein Tool, welches die Größe des Clusters automatisch anpasst und ihn je nach Bedarf auf der Grundlage bestimmter Bedingungen und Auslastungsmetriken skaliert. Es stellt sicher, dass Pods ausgeführt werden, ohne Ressourcen auf nicht benötigten Knoten zu verschwenden.

Alles, was du wissen musst: Wichtige Punkte zum Cluster-Autoscaler

1. Knotengruppen: Der Cluster-Autoscaler arbeitet mit dem Konzept der Knotengruppen, also Gruppen von Knoten, die dieselbe Konfiguration haben. In Cloud-Umgebungen entsprechen diese typischerweise VM-Instanzgruppen oder ähnlichen Konstrukten.

2. Hochskalieren: Die Hauptmotivation für das Hochskalieren ist, wenn es Pods gibt, die im Cluster aufgrund unzureichender Ressourcen nicht ausgeführt werden können. Der Cluster-Autoscaler versucht, Knoten hochzufahren, damit diese Pods ausgeführt werden können.

3. Runterskalieren: Der Cluster-Autoscaler verkleinert den Cluster, wenn er Knoten erkennt, die über einen längeren Zeitraum nicht ausgelastet waren (und sicher beendet werden können). Bevor ein Knoten entfernt wird, stellt der Cluster-Autoscaler sicher, dass alle auf diesem Knoten laufenden Pods auf andere Knoten verschoben werden können.

4. Balancer: Der Autoscaler versucht sicherzustellen, dass die Knotengruppen eine ähnliche Größe haben. Dieses Verhalten kann mit Balancing-Optionen geändert werden.

5. Mehrere Cloud-Anbieter: Der Cluster-Autoscaler unterstützt mehrere Cloud-Anbieter wie GCP, AWS, Azure und andere. Jeder Anbieter kann seine eigenen spezifischen Konfigurationen und Best Practices haben.

6. Sicherer Beendigungsvermerk: Der Cluster-Autoscaler verwendet dies, um zu bestimmen, welche Pods sicher beendet werden können. Standardmäßig werden alle Pods als sicher zum Beenden betrachtet, aber dieses Verhalten kann geändert werden.

7. Überprovisionierung: Bei dynamischen Arbeitslasten, bei denen der genaue Zeitpunkt der Auftragsankunft nicht bekannt ist, kann der Cluster-Autoscaler mit Overprovisioning kombiniert werden, um sicherzustellen, dass immer ein Puffer an zusätzlichen Knoten vorhanden ist, damit der Cluster plötzliche Lastspitzen ohne Verzögerung bewältigen kann.

8. Ressourcenbegrenzungen und -einschränkungen: Der Autoscaler berücksichtigt bei seinen Skalierungsentscheidungen den Ressourcenbedarf, die aktuelle Ressourcennutzung und Beschränkungen wie Pod-Affinität und Anti-Affinität.

9. Abkühlungsperioden: Nach der Skalierung wartet der Cluster-Autoscaler eine Weile, um sicherzustellen, dass die neuen Knoten ordnungsgemäß genutzt werden, bevor er eine weitere Skalierungsaktion durchführt. Das dient dazu, Thrashing und schnelle Hin- und Her-Skalierungsaktionen zu verhindern.

10. Schätzer: Das Tool verwendet einen auf Binpacking basierenden Schätzer, um zu erkennen, ob neue Knoten benötigt werden, und zwar auf der Grundlage der Ressourcenanforderungen und der Grenzen der anhängigen Pods.

11. Integration mit Node Pools: Bei Cloud-Anbietern wie GCP und Azure kann die minimale und maximale Größe des Knotenpools festgelegt werden, die der Cluster-Autoscaler beachtet. So kann man Grenzen für die Skalierung des Autoscalers festlegen.

Cluster-Autoscaler Konfiguration - Beispiel mit technischer Ausrichtung

Um den Cluster-Autoscaler zu aktivieren und zu verwenden, stellt man ihn normalerweise als Pod im Kubernetes-Cluster bereit. Die Konfiguration hängt von dem Cloud-Anbieter und der spezifischen Cluster-Einrichtung ab.

Bei der Bereitstellung von Anwendungen auf Kubernetes mit dem Potenzial variabler Arbeitslasten ist der Cluster-Autoscaler von unschätzbarem Wert, da er den Skalierungsprozess automatisiert und eine effiziente Nutzung der Ressourcen bei gleichzeitiger Aufrechterhaltung der Anwendungsverfügbarkeit gewährleistet.

Wenn du eine eher technisch ausgerichtete Demonstration des Cluster-Autoscalers anstrebst, solltest du ein praktisches Tutorial oder einen Walk-through einbauen, der vielleicht ein reales Anwendungsszenario zeigt. Im Folgenden zeigen wir dir ein Beispiel mit einer eher technischen Ausrichtung:

Voraussetzungen:

Cluster-Autoscaler einrichten:

Die richtige Konfiguration des Cluster-Autoscalers ist entscheidend, um sicherzustellen, dass er sich wie erwartet verhält und sich nahtlos in deine Umgebung einfügt. Eine der wichtigsten Möglichkeiten zur Konfiguration des Cluster-Autoscalers ist die Bearbeitung seiner Bereitstellung.

				
					kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/cluster-autoscaler/cloudprovider/aws/examples/cluster-autoscaler-autodiscover.yaml
				
			

Konfiguration des Cluster-Autoscaler:

1. Zugriff auf das Deployment: Der Cluster-Autoscaler wird normalerweise als Einsatz im Namensraum kube-system ausgeführt. Um die aktuelle Konfiguration zu sehen, führe aus:

				
					kubectl -n kube-system get deployment cluster-autoscaler -o yaml
				
			

Dieser Befehl gibt die vollständige Konfiguration der Cluster-Autoscaler-Bereitstellung aus.

2. Bearbeiten der Bereitstellung: So änderst du die Bereitstellung interaktiv:

				
					kubectl -n kube-system edit deployment cluster-autoscaler
				
			

Dadurch wird die Einsatzkonfiguration in deinem Standard-Terminal-Editor (wie vim, nano usw.) geöffnet. Hier kannst du verschiedene Aspekte der Bereitstellung ändern.

3. Ändern der Befehlszeilen-Flags: Suche im Editor nach dem Abschnitt args unter spec.template.spec.containers[0]. Dieser Abschnitt enthält die Befehlszeilenargumente, mit denen der Cluster-Autoscaler gestartet wurde. Diese Argumente bestimmen sein Verhalten.
Einige häufig bearbeitete Flags sind:

Sobald du die gewünschten Änderungen vorgenommen hast, speichere und beende den Editor. Kubernetes startet einen neuen Pod mit der aktualisierten Konfiguration und beendet den alten, sodass eine Aktualisierung ohne Ausfallzeiten gewährleistet ist.

4. Überprüfung: Um sicherzustellen, dass deine Änderungen erfolgreich angewendet wurden, überprüfe die Cluster Autoscaler-Protokolle:

				
					kubectl -n kube-system logs -l app=cluster-autoscaler
				
			

Achte auf eventuelle Fehlermeldungen oder Bestätigungen im Zusammenhang mit deinen Konfigurationsänderungen. Überwache die neue Konfiguration in Aktion. Je nach Änderungen (z. B. Scale-Down-Einstellungen) musst du möglicherweise die Last simulieren oder warten, um Verhaltensänderungen zu sehen.

Simulation der Last und Beobachtung der Skalierung:

Stelle zunächst eine Beispielanwendung bereit:

				
					apiVersion: apps/v1
kind: Deployment
metadata:
    name: nginx-deployment
    labels:
        app: nginx
spec:
    replicas: 10  # Initially set to a number that fits comfortably in the current nodes
    selector:
        matchLabels:
            app: nginx
template:
    metadata:
        labels:
            app: nginx
    spec:
        containers:
        - name: nginx
        image: nginx:1.14.2
        resources:
            requests:
                cpu: "500m"
				
			

Erhöhe dann die Last, indem du die Replikate oder Ressourcenanforderungen so änderst, dass sie die verfügbare Kapazität deines Clusters überschreiten:

				
					kubectl scale deployment nginx-deployment --replicas=100
				
			

Beobachte anschließend die automatische Skalierung und überwache die Anzahl der Knoten in deinem Cluster:

				
					watch kubectl get nodes
				
			

Du solltest feststellen, dass der Cluster-Autoscaler nach einer kurzen Zeitspanne die Hinzufügung neuer Knoten auslöst, um die erhöhte Last zu bewältigen.

Fazit

Der Cluster-Autoscaler ist nicht nur ein akademisches Konzept, sondern ein praktisches Tool, das die Effizienz deines Kubernetes-Betriebs drastisch beeinflussen kann. Wie wir gesehen haben, bietet das Einrichten und Beobachten in Aktion unschätzbare Einblicke in die dynamische Anpassung von Kubernetes an die Anforderungen der Arbeitslast!

Shamim Nael
Shamim Nael

Diesen Beitrag teilen