Skip to content

Autoscaling

HPA (Horizontal Pod Autoscaler)

Der metrics-server ist installiert, du kannst also direkt nach CPU-Auslastung skalieren. Verwende autoscaling/v2.

yaml
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: 70

averageUtilization 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.

yaml
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.

yaml
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