Zum Hauptinhalt springen

Horizontal Pod Autoscaling

Horizontal Pod Autoscaling (HPA) passt die Anzahl der Pods einer Anwendung automatisch an die Auslastung an. Steigt die Last, werden zusätzliche Pods gestartet; sinkt sie, werden Pods wieder entfernt.

Abgrenzung zum Cluster Autoscaling

Beide Mechanismen wirken auf unterschiedlichen Ebenen und ergänzen sich:

MechanismusSkaliertKonfiguration
Horizontal Pod Autoscaling (HPA)Anzahl der PodsÜber ein HorizontalPodAutoscaler-Objekt im Cluster
Cluster Autoscaling (CA)Anzahl der NodesJe Node Pool im Control Panel

HPA startet zusätzliche Pods – reicht die Kapazität der vorhandenen Nodes dafür nicht aus, bleiben diese im Status Pending. Erst der Cluster Autoscaler stellt dann zusätzliche Nodes bereit. Für lastabhängige Skalierung sollten daher beide aktiv sein.

Siehe Autoscaling aktivieren.

Voraussetzungen

  • Ein laufender metrics-server im Cluster
  • Definierte resources.requests in Ihrem Deployment – ohne diese kann HPA die prozentuale Auslastung nicht berechnen

Prüfen Sie den metrics-server:

kubectl top pods

Erhalten Sie eine Fehlermeldung, installieren Sie ihn zunächst, siehe Erweiterte Metriken.

Deployment vorbereiten

Das Deployment muss requests definieren:

apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:stable
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi

HorizontalPodAutoscaler anlegen

Per Manifest

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70

Anwenden:

kubectl apply -f hpa.yaml

Die Konfiguration bedeutet: Liegt die durchschnittliche CPU-Auslastung der Pods über 70 % der angeforderten requests, werden zusätzliche Pods gestartet – bis maximal 10. Sinkt sie deutlich darunter, wird bis auf minimal 2 Pods reduziert.

Per Befehl

kubectl autoscale deployment web --cpu-percent=70 --min=2 --max=10

Status prüfen

kubectl get hpa

Beispielausgabe:

NAME      REFERENCE        TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
web-hpa Deployment/web 45%/70% 2 10 3 5m

Details und Skalierungsereignisse:

kubectl describe hpa web-hpa

Zeigt die Spalte TARGETS den Wert <unknown>, liefert der metrics-server keine Daten – oder im Deployment fehlen die requests.

Skalierung nach Arbeitsspeicher

  metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80

Bei mehreren Metriken skaliert HPA anhand derjenigen, die die höchste Replica-Anzahl erfordert.

Schwankungen dämpfen

Skaliert die Anwendung zu häufig auf und ab, begrenzen Sie das Verhalten über behavior:

spec:
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 50
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 30

Das Hochskalieren erfolgt damit sofort, das Herunterskalieren erst nach fünf Minuten stabiler Auslastung.

Hinweise

  • HPA und ein fest gesetztes replicas im Deployment widersprechen sich. Sobald ein HPA aktiv ist, verwaltet dieser die Replica-Anzahl.
  • Setzen Sie minReplicas für produktive Dienste auf mindestens 2, damit die Anwendung auch bei Node-Ausfällen erreichbar bleibt.
  • Definieren Sie Readiness Probes, damit neu gestartete Pods erst nach vollständigem Start Datenverkehr erhalten.

Verwandte Themen