Kurze Einführung in den Horizontal Pod Autoscaler (HPA) für zukünftiges Lernen
In diesem Schritt erhalten Sie eine Einführung in den Horizontal Pod Autoscaler (HPA), eine leistungsstarke Kubernetes-Funktion, die Anwendungen automatisch basierend auf der Ressourcenauslastung skaliert. Der HPA ermöglicht es Ihnen, Skalierungsregeln basierend auf Metriken wie CPU-Auslastung, Speichernutzung oder sogar benutzerdefinierten Metriken zu definieren.
Grundlagen des HPA:
Der HPA passt automatisch die Anzahl der laufenden Pod-Replikate in einer Deployment, ReplicaSet oder StatefulSet an, basierend auf der beobachteten CPU- oder Speichernutzung oder auf benutzerdefinierten Metriken, die von Ihren Anwendungen bereitgestellt werden. Dies stellt sicher, dass Ihre Anwendung automatisch skaliert werden kann, um wechselnde Verkehrslasten zu bewältigen, was die Leistung und Verfügbarkeit verbessert.
Aktivieren Sie das Metrics Server-Addon in Minikube:
minikube addons enable metrics-server
Beispielausgabe:
* The 'metrics-server' addon is enabled
Der Metrics Server liefert Kubernetes mit Nutzungsdaten zu Ihren Ressourcen und ist für die Funktionsfähigkeit des HPA unerlässlich.
Erstellen Sie eine Deployment mit Ressourcenanforderungen:
nano ~/project/k8s-manifests/hpa-example.yaml
Fügen Sie den folgenden Inhalt hinzu:
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: k8s.gcr.io/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
Wenden Sie die Deployment an:
kubectl apply -f ~/project/k8s-manifests/hpa-example.yaml
Erklärung der YAML-Konfiguration:
- Diese YAML-Datei definiert eine Deployment für eine PHP-Anwendung und den entsprechenden Service.
- Die Deployment-Konfiguration ähnelt stark der von NGINX, mit Ausnahme von:
name: php-apache
: Der Name der Deployment und des Pod-Containers.
image: k8s.gcr.io/hpa-example
: Das Docker-Image für den Container.
resources
: Dieser Abschnitt gibt die Ressourcenanforderungen für den Container an.
limits.cpu: 500m
: Die maximale CPU, die der Container verwenden darf.
requests.cpu: 200m
: Die garantierte CPU-Menge, die dem Container zugewiesen wird.
- Der Service ist eine Standard-Service-Konfiguration, die die Deployment intern verfügbar macht.
Erstellen Sie eine HPA-Konfiguration:
nano ~/project/k8s-manifests/php-apache-hpa.yaml
Fügen Sie das folgende HPA-Manifest hinzu:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
Wenden Sie die HPA-Konfiguration an:
kubectl apply -f ~/project/k8s-manifests/php-apache-hpa.yaml
Erklärung der YAML-Konfiguration:
apiVersion: autoscaling/v2
: Gibt die API-Version für HorizontalPodAutoscaler an.
kind: HorizontalPodAutoscaler
: Zeigt an, dass es sich um ein HPA-Objekt handelt.
metadata
: Enthält Metadaten über den HPA.
name: php-apache
: Der Name des HPA.
spec
: Enthält die HPA-Spezifikation.
scaleTargetRef
: Definiert die Ziel-Deployment, die skaliert werden soll.
apiVersion: apps/v1
: Die API-Version der Zielressource.
kind: Deployment
: Der Typ der Zielressource, bei dem es sich um eine Deployment handelt.
name: php-apache
: Der Name der Ziel-Deployment, die skaliert werden soll.
minReplicas: 1
: Die minimale Anzahl von Replikaten, die laufen bleiben sollen.
maxReplicas: 10
: Die maximale Anzahl von Replikaten, auf die skaliert werden kann.
metrics
: Definiert, wie die Skalierungsmetriken ermittelt werden.
type: Resource
: Skaliert basierend auf einer Ressourcenmetrik.
resource.name: cpu
: Skaliert basierend auf der CPU-Nutzung.
resource.target.type: Utilization
: Skaliert basierend auf einem Prozentsatz der vom Pod angeforderten CPU.
resource.target.averageUtilization: 50
: Skaliert, wenn die durchschnittliche CPU-Nutzung über alle Pods 50 % der Anforderungen überschreitet.
Überprüfen Sie die HPA-Konfiguration:
kubectl get hpa
Beispielausgabe:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30s
Simulieren Sie eine Last und beobachten Sie die automatische Skalierung in Echtzeit
Um eine hohe Last zu simulieren und den Autoscaler auszulösen, führen Sie in einem Terminal einen Lastgenerator aus und überwachen Sie die Skalierungsaktivität in einem separaten Terminal.
Öffnen Sie zunächst ein Terminal für den Lastgenerator:
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
SCHLIESSEN SIE DAS TERMINAL MIT DEM LASTGENERATOR NICHT. ÖFFNEN SIE EIN ANDERES TERMINAL, um die Skalierungsaktivität zu überwachen.
Im zweiten Terminal können Sie mehrere Befehle verwenden, um die automatische Skalierung in Echtzeit zu beobachten:
- Überwachen Sie den HPA-Status (aktualisiert sich alle paar Sekunden):
kubectl get hpa -w
- Beobachten Sie, wie Pods erstellt werden, wenn der HPA hochskaliert:
kubectl get pods -w
- Verfolgen Sie Ereignisse, die sich auf die Skalierungsaktivität beziehen:
kubectl get events --sort-by='.lastTimestamp' -w
Sie können jeden dieser Befehle ausführen, um verschiedene Aspekte des Skalierungsprozesses zu beobachten. Beispielsweise zeigt das Beobachten von Pods mit der -w
-Option, wie Pods in Echtzeit erstellt werden, wenn das System skaliert:
Beispielausgabe für kubectl get pods -w
:
NAME READY STATUS RESTARTS AGE
php-apache-xxxxxxxxx-xxxxx 1/1 Running 0 2m
load-generator 1/1 Running 0 30s
php-apache-xxxxxxxxx-yyyyy 0/1 Pending 0 0s
php-apache-xxxxxxxxx-yyyyy 0/1 ContainerCreating 0 0s
php-apache-xxxxxxxxx-yyyyy 1/1 Running 0 3s
php-apache-xxxxxxxxx-zzzzz 0/1 Pending 0 0s
php-apache-xxxxxxxxx-zzzzz 0/1 ContainerCreating 0 0s
php-apache-xxxxxxxxx-zzzzz 1/1 Running 0 2s
Sie werden sehen, dass der HPA auf die erhöhte Last reagiert, indem er die Anzahl der Pods erhöht. Die Aktualisierung der Metriken kann eine Minute oder länger dauern, um die Änderungen widerzuspiegeln:
Beispielausgabe für kubectl get hpa -w
:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30s
php-apache Deployment/php-apache 68%/50% 1 10 1 90s
php-apache Deployment/php-apache 68%/50% 1 10 2 90s
php-apache Deployment/php-apache 79%/50% 1 10 2 2m
php-apache Deployment/php-apache 79%/50% 1 10 4 2m15s
Wenn Sie mit der Beobachtung fertig sind, drücken Sie Ctrl+C
, um den Überwachungsbefehl zu beenden, und kehren Sie dann zum ersten Terminal zurück und drücken Sie Ctrl+C
, um den Lastgenerator zu stoppen.
Wichtige Punkte zum HPA:
- Skaliert Pods automatisch basierend auf der Ressourcenauslastung, was die Resilienz der Anwendung verbessert.
- Kann basierend auf CPU, Speicher oder benutzerdefinierten Metriken skaliert werden.
- Definiert die minimale und maximale Anzahl von Replikaten, um eine ausgewogene und effiziente Skalierung sicherzustellen.
- Der HPA ist eine entscheidende Komponente für die Aufrechterhaltung der Anwendungsleistung und -verfügbarkeit bei wechselnden Lasten.
- Die Verwendung der
-w
-Option (watch) mit kubectl-Befehlen ermöglicht die Echtzeitüberwachung von Clusteränderungen.