- Authors

- Name
- Phillip Pham
- @ddppham
Kubernetes Autoscaling: HPA, VPA und Cluster Autoscaler richtig kombinieren
TL;DR
- Kubernetes bietet drei Autoscaling-Mechanismen: HPA (mehr/weniger Pods), VPA (groessere/kleinere Pods), Cluster Autoscaler (mehr/weniger Nodes).
- HPA und VPA duerfen nicht gleichzeitig auf die gleiche Metrik (CPU/Memory) skalieren -- das fuehrt zu Konflikten.
- Starten Sie immer mit korrekten Resource Requests. Ohne sinnvolle Requests kann kein Autoscaler vernuenftig arbeiten.
- Karpenter ist eine performantere Alternative zum klassischen Cluster Autoscaler, besonders auf AWS.
- Typische Einsparungen durch Autoscaling: 25-40% gegenueber statisch provisionierten Clustern.
Die drei Autoscaler im Ueberblick
Kubernetes hat kein einzelnes "Autoscaling" -- es gibt drei unabhaengige Mechanismen, die auf unterschiedlichen Ebenen arbeiten. Das Zusammenspiel ist entscheidend.
| Autoscaler | Was skaliert er? | Wann sinnvoll? | Typischer Trigger |
|---|---|---|---|
| HPA | Anzahl der Pod-Replicas | Stateless Workloads mit variablem Traffic | CPU > 70%, Custom Metrics |
| VPA | CPU/Memory Requests einzelner Pods | Workloads mit schwer vorhersagbarem Ressourcenbedarf | Historische Nutzung |
| Cluster Autoscaler | Anzahl der Nodes im Cluster | Pods im Pending-State wegen fehlender Kapazitaet | Unschedulable Pods |
Horizontal Pod Autoscaler (HPA): Mehr Pods bei mehr Last
Der HPA ist der meistgenutzte Autoscaler. Er beobachtet Metriken (standardmaessig CPU-Auslastung) und passt die Anzahl der Replicas an.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-api-hpa
namespace: production
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-api
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 10
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 30
policies:
- type: Percent
value: 50
periodSeconds: 60
Wichtige Details zur Konfiguration:
minReplicas: 2-- nie auf 1 setzen in Production. Wenn der eine Pod waehrend eines Rollouts weg ist, haben Sie null Kapazitaet.behavior.scaleDown-- das Stabilization Window verhindert, dass der HPA bei kurzen Last-Spitzen sofort wieder herunterskaliert. 5 Minuten sind ein guter Startwert.behavior.scaleUp-- hier sollte das Window kurz sein (30s), damit der Cluster schnell auf Lastspitzen reagiert.
Pruefen Sie den aktuellen Status:
# HPA-Status anzeigen
kubectl get hpa web-api-hpa -n production
# Detaillierte Informationen
kubectl describe hpa web-api-hpa -n production
# Metriken pruefen (Metrics Server muss installiert sein)
kubectl top pods -n production -l app=web-api
HPA mit Custom Metrics
CPU und Memory reichen nicht immer. Fuer eine Queue-basierte Architektur wollen Sie vielleicht nach Queue-Laenge skalieren:
metrics:
- type: Object
object:
metric:
name: rabbitmq_queue_messages
describedObject:
apiVersion: v1
kind: Service
name: rabbitmq
target:
type: Value
value: "100"
Dafuer brauchen Sie einen Custom Metrics Adapter (z.B. Prometheus Adapter oder KEDA).
Vertical Pod Autoscaler (VPA): Richtige Groesse fuer Pods
Der VPA analysiert den tatsaechlichen Ressourcenverbrauch und passt die Requests und Limits an. Das ist besonders nuetzlich in zwei Szenarien:
- Sie wissen bei einem neuen Service nicht, wie viele Ressourcen er braucht.
- Der Ressourcenbedarf aendert sich ueber die Zeit (z.B. durch wachsende Datenmengen).
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: backend-vpa
namespace: production
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: backend
updatePolicy:
updateMode: "Auto"
resourcePolicy:
containerPolicies:
- containerName: backend
minAllowed:
cpu: "100m"
memory: "128Mi"
maxAllowed:
cpu: "2"
memory: "4Gi"
controlledResources: ["cpu", "memory"]
Drei VPA-Modi:
| Modus | Verhalten | Einsatz |
|---|---|---|
Off | Nur Empfehlungen, keine Aenderungen | Analyse-Phase, sichere Auswertung |
Initial | Setzt Requests nur beim Pod-Start | Bestehende Pods nicht stoeren |
Auto | Passt Requests an und startet Pods bei Bedarf neu | Volle Automatisierung |
Empfehlung: Starten Sie im Off-Modus, pruefen Sie die Empfehlungen, und wechseln Sie dann auf Auto:
# VPA-Empfehlungen anzeigen
kubectl describe vpa backend-vpa -n production
Die HPA/VPA-Falle
HPA und VPA duerfen nicht gleichzeitig auf CPU oder Memory skalieren. Der HPA sagt "mehr Pods!", der VPA sagt "groessere Pods!" -- das fuehrt zu einem Skalierungskonflikt.
Die saubere Loesung:
- HPA skaliert auf Basis von CPU/Memory oder Custom Metrics (Replica Count)
- VPA setzt nur die initialen Resource Requests (
updateMode: InitialoderOff) - Oder: HPA skaliert nach Custom Metrics, VPA nach CPU/Memory
Cluster Autoscaler: Nodes hinzufuegen und entfernen
Der Cluster Autoscaler beobachtet, ob Pods wegen fehlender Node-Kapazitaet im Pending-State haengen. Wenn ja, fuegt er Nodes hinzu. Wenn Nodes unterlastet sind, entfernt er sie.
Fuer einen Managed-Kubernetes-Service (EKS, AKS, GKE) ist die Konfiguration relativ einfach. Beispiel fuer ein Terraform-Setup mit AWS EKS:
# Cluster Autoscaler Node Group (Terraform / AWS EKS)
resource "aws_eks_node_group" "workers" {
cluster_name = aws_eks_cluster.main.name
node_group_name = "general-workers"
node_role_arn = aws_iam_role.node.arn
subnet_ids = var.private_subnet_ids
instance_types = ["m6i.xlarge", "m6a.xlarge", "m5.xlarge"]
scaling_config {
desired_size = 3
min_size = 2
max_size = 15
}
labels = {
workload-type = "general"
}
}
Der Cluster Autoscaler braucht passende IAM-Rechte und wird typischerweise als Deployment im Cluster installiert:
# Cluster Autoscaler Status pruefen
kubectl get pods -n kube-system -l app=cluster-autoscaler
kubectl logs -n kube-system -l app=cluster-autoscaler --tail=50
Karpenter: Die modernere Alternative
Karpenter (urspruenglich von AWS, jetzt ein CNCF-Projekt) ist in vielen Szenarien dem klassischen Cluster Autoscaler ueberlegen:
| Eigenschaft | Cluster Autoscaler | Karpenter |
|---|---|---|
| Skalierungsgeschwindigkeit | 2-5 Minuten | 30-90 Sekunden |
| Instance-Typ-Auswahl | Feste Node Groups | Dynamisch, kostenoptimiert |
| Bin Packing | Begrenzt | Sehr effektiv |
| Cloud Support | AWS, GCP, Azure | AWS (SIG-Karpenter fuer andere Clouds in Arbeit) |
| Defragmentierung | Nein | Ja (Consolidation) |
Wenn Sie auf AWS arbeiten, ist Karpenter in den meisten Faellen die bessere Wahl.
Alle drei Autoscaler kombinieren
Die optimale Autoscaling-Konfiguration fuer einen typischen Kubernetes-Cluster:
- HPA fuer alle stateless Workloads (APIs, Web-Frontends, Worker)
- VPA im Off/Initial-Modus fuer alle Workloads, um Empfehlungen zu sammeln und initiale Requests zu setzen
- Cluster Autoscaler oder Karpenter fuer die Node-Ebene
# Gesamtuebersicht aller Autoscaler
kubectl get hpa -A
kubectl get vpa -A
kubectl get nodes -o custom-columns=NAME:.metadata.name,STATUS:.status.conditions[-1].type,CAPACITY_CPU:.status.capacity.cpu,CAPACITY_MEM:.status.capacity.memory
Typische Fehler bei Autoscaling
1. Keine Resource Requests definiert: Ohne Requests hat der HPA keine Basis fuer die Berechnung der Auslastung. Setzen Sie immer Requests.
2. HPA minReplicas auf 1: Bei einem Rollout gibt es kurzzeitig null verfuegbare Pods. Minimum 2 in Production.
3. Cluster Autoscaler zu konservativ: Der Default scale-down-delay-after-add von 10 Minuten ist oft zu lang. 5 Minuten reichen in den meisten Faellen.
4. Limits deutlich hoeher als Requests: Wenn Requests 200m CPU und Limits 2 CPU sind, kann ein einzelner Pod einen ganzen Node blockieren und andere Pods verdraengen.
5. Autoscaling ohne Monitoring: Ohne Metriken und Alerts wissen Sie nicht, ob der Autoscaler funktioniert oder kaempft. Integrieren Sie HPA-Metriken in Ihr Prometheus/Grafana-Setup.
Kostenersparnis messen
Autoscaling macht sich nur bezahlt, wenn Sie den Effekt messen:
# Aktuelle Node-Auslastung pruefen
kubectl top nodes
# Pods ohne Resource Requests finden (sollten keine sein)
kubectl get pods -A -o json | jq -r '.items[] | select(.spec.containers[].resources.requests == null) | .metadata.namespace + "/" + .metadata.name'
Vergleichen Sie Ihre monatlichen Cluster-Kosten vor und nach dem Autoscaling-Rollout. Typische Ergebnisse:
- Statisch provisionierte Cluster: 40-60% durchschnittliche CPU-Auslastung
- Mit Autoscaling: 65-80% durchschnittliche CPU-Auslastung
- Einsparung: 25-40% der Infrastrukturkosten
Weiterführende Artikel
- Kubernetes Resource Management im Detail
- Kubernetes Monitoring: Kosten senken mit Open Source
- Kubernetes ROI berechnen
- Kubernetes Performance verdoppeln
Wenn Sie Ihre Autoscaling-Konfiguration optimieren oder eine Kostenanalyse Ihres Clusters durchfuehren moechten, stehen wir Ihnen gerne zur Verfuegung -- Kontakt aufnehmen.
Kubernetes-Beratung gesucht?
Wir helfen deutschen Unternehmen bei der Kubernetes-Implementierung, Migration und Optimierung. DSGVO-konform und praxiserprobt.
📖 Verwandte Artikel
Weitere interessante Beiträge zu ähnlichen Themen
Capacity Planning: Kubernetes-Autoscaling richtig nutzen
HPA, VPA, Cluster Autoscaler und KEDA kombinieren für Capacity Planning in Kubernetes. Mit Praxisbeispielen und Entscheidungshilfe.
Kubernetes Skalierung: HPA, VPA und KEDA kombinieren
Kubernetes Skalierungs-Patterns im Überblick: HPA, VPA, Cluster Autoscaler und KEDA richtig kombinieren für Multi-Dimensional Autoscaling.
Kubernetes Autoscaling: Kosten sparen mit HPA, VPA und Karpenter
Mit Kubernetes Autoscaling 25-40% Cloud-Kosten sparen. HPA, VPA und Cluster Autoscaler richtig konfigurieren, Überprovisionierung erkennen und beseitigen.
Cluster Autoscaler: Kubernetes-Nodes optimal skalieren
Cluster Autoscaler optimieren mit Expander-Strategien, Scale-Down-Tuning und Priority-Konfiguration für kosteneffiziente Node-Skalierung.
Custom Metrics: Kubernetes-Autoscaling mit Prometheus
HPA mit Custom Metrics aus Prometheus konfigurieren. Prometheus Adapter installieren, Metriken registrieren und Pods nach Requests pro Sekunde skalieren.