Autoscaling
HPA (Horizontal Pod Autoscaler)
Der metrics-server ist installiert, du kannst also direkt nach CPU-Auslastung skalieren. Verwende autoscaling/v2.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: myapp
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70averageUtilization bezieht sich auf den CPU-Request des Containers. Ohne gesetzten Request hat der HPA keine Bezugsgröße und skaliert nicht.
KEDA
Für eventgesteuertes Skalieren, also überall dort, wo CPU-Auslastung nicht das richtige Signal ist (Queue-Länge, Zeitpläne, externe Metriken). KEDA kann zusätzlich auf null herunterskalieren.
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: worker
spec:
scaleTargetRef:
name: worker
minReplicaCount: 0
maxReplicaCount: 10
triggers:
- type: cron
metadata:
timezone: Europe/Berlin
start: 0 8 * * *
end: 0 20 * * *
desiredReplicas: "3"Der Trigger-Typ hängt von deiner Eventquelle ab, das Grundgerüst bleibt gleich.
Scale-to-Zero
Ein HTTP-Service kann auf null Replicas heruntergehen, wenn ihn niemand aufruft, und bei der nächsten Anfrage wieder aufwachen. Für alles, was den Großteil des Tages idle ist, lohnt sich das. Es hat eine eigene Seite, inklusive dem, was es von deiner Rechnung nimmt und was nicht: siehe Scale-to-Zero.
Mit einem HPA oder einem eigenen ScaledObject auf demselben Workload lässt es sich nicht kombinieren.
VPA (Vertical Pod Autoscaler)
Der VPA läuft im Empfehlungsmodus: updateMode: "Off". Er berechnet also Vorschläge für Requests und Limits, ändert aber nichts von selbst. Die Empfehlungen liest du über den Status der Ressource aus und übernimmst sie manuell in dein Deployment.
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: myapp
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
updatePolicy:
updateMode: "Off"Zusätzlich steht InPlaceOrRecreate zur Verfügung. Damit passt der VPA Requests nach Möglichkeit direkt am laufenden Pod an und startet ihn nur dann neu, wenn eine Änderung an Ort und Stelle nicht geht.
Wie es weitergeht
- Scale-to-Zero, damit ein Service schlafen kann
- Abrechnung und Kontingente, warum Requests deine Rechnung bestimmen