Veröffentlicht am

Kubernetes Kosten senken: 10 Praxis-Tipps

Teilen:
Authors

TL;DR

  • Resource Requests und Limits richtig setzen spart 40-60% der Node-Kosten -- die meisten Pods reservieren 10x mehr als sie brauchen
  • Cluster Autoscaler + Dev/Test nachts abschalten reduziert Kosten um 30-60% durch dynamische Skalierung
  • Spot/Preemptible Instances fuer Batch-Jobs und Dev/Test sparen 60-70% gegenueber On-Demand Preisen
  • VPA (Vertical Pod Autoscaler) empfiehlt optimale Resource-Werte basierend auf tatsaechlichem Verbrauch
  • FinOps-Dashboard mit Kubecost oder OpenCost schafft Kostentransparenz pro Namespace, Team und Label

Kubernetes Kosten senken: 10 Praxis-Tipps

Ihre Kubernetes-Rechnung wächst monatlich? Sie sind nicht allein. Die gute Nachricht: Mit diesen 10 Praxis-Tipps senken Sie Ihre Kosten um 30-50% - heute noch umsetzbar.

Warum Kubernetes-Kosten explodieren

Typische Kostentreiber:
├── Überdimensionierte Ressourcen (70% ungenutzt!)
├── Keine Auto-Scaling-Strategie
├── 24/7 Dev/Test-Umgebungen
├── Fehlende Namespace-Quotas
└── "Wir brauchen das vielleicht mal"

Tipp 1: Resource Requests & Limits richtig setzen

Das Problem

# 90% aller Deployments sehen so aus:
resources:
  requests:
    cpu: "1000m"    # 1 CPU - aber nutzt nur 50m
    memory: "1Gi"   # 1 GB - aber nutzt nur 128Mi

Verschwendung: 95% der reservierten Ressourcen ungenutzt.

Die Lösung

# Tatsächlichen Verbrauch messen
kubectl top pods -A --sort-by=cpu
kubectl top pods -A --sort-by=memory

# Oder mit Prometheus (letzte 7 Tage P95):
# container_cpu_usage_seconds_total
# container_memory_usage_bytes
# Realistische Werte setzen:
resources:
  requests:
    cpu: "50m"      # P50 des tatsächlichen Verbrauchs
    memory: "128Mi"
  limits:
    cpu: "200m"     # P99 + 20% Buffer
    memory: "256Mi"

Ersparnis: 40-60% der Node-Kosten


Tipp 2: Cluster Autoscaler aktivieren

Ohne Autoscaler

Montag 09:00:  10 Nodes (100% Auslastung)
Montag 22:00:  10 Nodes (20% Auslastung)Verschwendung!
Wochenende:    10 Nodes (5% Auslastung)Noch mehr Verschwendung!

Mit Autoscaler

# cluster-autoscaler Konfiguration
apiVersion: autoscaling.openshift.io/v1
kind: ClusterAutoscaler
spec:
  scaleDown:
    enabled: true
    delayAfterAdd: 10m
    delayAfterDelete: 1m
    unneededTime: 5m
  resourceLimits:
    minNodes: 2
    maxNodes: 20

Ersparnis: 30-50% durch dynamische Skalierung


Tipp 3: Dev/Test-Umgebungen nachts abschalten

Das Problem

Dev/Test laufen 24/7, aber Entwickler arbeiten nur 8h/Tag.

Die Lösung: Kubernetes CronJob

# scale-down.yaml - Jeden Abend um 20:00
apiVersion: batch/v1
kind: CronJob
metadata:
  name: scale-down-dev
spec:
  schedule: "0 20 * * 1-5"  # Mo-Fr 20:00
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: kubectl
            image: bitnami/kubectl
            command:
            - /bin/sh
            - -c
            - |
              kubectl scale deployment --all --replicas=0 -n development
          restartPolicy: OnFailure
---
# scale-up.yaml - Jeden Morgen um 07:00
apiVersion: batch/v1
kind: CronJob
metadata:
  name: scale-up-dev
spec:
  schedule: "0 7 * * 1-5"  # Mo-Fr 07:00
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: kubectl
            image: bitnami/kubectl
            command:
            - /bin/sh
            - -c
            - |
              kubectl scale deployment --all --replicas=1 -n development
          restartPolicy: OnFailure

Ersparnis: 60%+ für Dev/Test (nur 8h statt 24h)


Tipp 4: Spot/Preemptible Instances nutzen

Preisvergleich (AWS, ähnlich bei Azure/GCP)

InstanceOn-DemandSpotErsparnis
m5.large$0.096/h$0.029/h70%
m5.xlarge$0.192/h$0.058/h70%
c5.2xlarge$0.340/h$0.102/h70%

Implementierung

# Node Pool für Spot Instances
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: my-cluster
nodeGroups:
  - name: spot-workers
    instanceTypes: ["m5.large", "m5.xlarge", "m5a.large"]
    spot: true
    minSize: 0
    maxSize: 10
    labels:
      lifecycle: spot
    taints:
      - key: "spot"
        value: "true"
        effect: "PreferNoSchedule"
# Workloads für Spot markieren
spec:
  tolerations:
  - key: "spot"
    operator: "Equal"
    value: "true"
    effect: "PreferNoSchedule"
  nodeSelector:
    lifecycle: spot

Geeignet für: Batch-Jobs, Dev/Test, stateless Workloads Nicht geeignet für: Datenbanken, kritische Production

Ersparnis: 60-70% für geeignete Workloads


Tipp 5: Pod Disruption Budgets für Spot

Spot-Instances können jederzeit terminiert werden. PDBs schützen:

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: app-pdb
spec:
  minAvailable: 2  # Mindestens 2 Pods müssen laufen
  selector:
    matchLabels:
      app: my-app

Tipp 6: Resource Quotas pro Namespace

Das Problem

Ohne Quotas kann ein Team die ganze Cluster-Kapazität verbrauchen.

Die Lösung

apiVersion: v1
kind: ResourceQuota
metadata:
  name: team-a-quota
  namespace: team-a
spec:
  hard:
    requests.cpu: "10"       # Max 10 CPU requests
    requests.memory: "20Gi"  # Max 20 GB Memory requests
    limits.cpu: "20"
    limits.memory: "40Gi"
    pods: "50"               # Max 50 Pods
# LimitRange für Defaults
apiVersion: v1
kind: LimitRange
metadata:
  name: default-limits
  namespace: team-a
spec:
  limits:
  - default:
      cpu: "200m"
      memory: "256Mi"
    defaultRequest:
      cpu: "100m"
      memory: "128Mi"
    type: Container

Effekt: Teams müssen über Ressourcen nachdenken, bevor sie deployen.


Tipp 7: Unused Resources aufräumen

Finde verschwendete Ressourcen

# Pods ohne Traffic (laufen aber keiner nutzt sie)
kubectl get pods -A --no-headers | wc -l

# PVCs ohne Pod-Bindung
kubectl get pvc -A | grep -v Bound

# ConfigMaps ohne Referenz
kubectl get configmaps -A --no-headers | wc -l

# Alte Deployments mit 0 Replicas
kubectl get deploy -A | awk '$3 == 0'

Automatisiert mit kubectl-janitor

# Lösche Pods älter als 7 Tage in dev
kubectl delete pods -n development --field-selector=status.phase=Succeeded

# Lösche alte ReplicaSets
kubectl delete rs -A --field-selector=status.replicas=0

Ersparnis: 10-20% durch Aufräumen


Tipp 8: Rightsizing mit VPA

Vertical Pod Autoscaler empfiehlt optimale Ressourcen:

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: my-app-vpa
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app
  updatePolicy:
    updateMode: "Off"  # Nur Empfehlungen, keine Auto-Updates
  resourcePolicy:
    containerPolicies:
    - containerName: '*'
      minAllowed:
        cpu: 50m
        memory: 64Mi
      maxAllowed:
        cpu: 2
        memory: 4Gi
# Empfehlungen abrufen
kubectl describe vpa my-app-vpa

# Output:
# Recommendation:
#   Container Recommendations:
#     Container Name:  my-app
#     Lower Bound:     Cpu: 25m, Memory: 64Mi
#     Target:          Cpu: 50m, Memory: 128Mi  ← Das sollten Sie setzen
#     Upper Bound:     Cpu: 100m, Memory: 256Mi

Tipp 9: Multi-Tenancy statt Multi-Cluster

Teuer: Ein Cluster pro Team

Team A Cluster: 3 Nodes (Control Plane + Overhead)
Team B Cluster: 3 Nodes (Control Plane + Overhead)
Team C Cluster: 3 Nodes (Control Plane + Overhead)
─────────────────────────────────────────────────
GESAMT: 9 Nodes + 3x Control Plane Kosten

Günstig: Ein Cluster, Namespaces pro Team

Shared Cluster:
├── Namespace: team-a (ResourceQuota)
├── Namespace: team-b (ResourceQuota)
├── Namespace: team-c (ResourceQuota)
└── Shared Control Plane
─────────────────────────────────────────────────
GESAMT: 4-6 Nodes + 1x Control Plane

Ersparnis: 50%+ durch Shared Infrastructure


Tipp 10: FinOps-Dashboard aufsetzen

Ohne Sichtbarkeit keine Optimierung.

Kubecost (Open Source)

helm install kubecost kubecost/cost-analyzer \
  --namespace kubecost \
  --create-namespace

Features:

  • Kosten pro Namespace/Label/Team
  • Idle Resources Detection
  • Rightsizing Recommendations
  • Budget Alerts

Alternative: OpenCost (CNCF)

helm install opencost opencost/opencost \
  --namespace opencost \
  --create-namespace

Zusammenfassung: Quick Wins

MaßnahmeAufwandErsparnisPrio
Resource Limits setzen1 Tag40-60%Hoch
Cluster Autoscaler2h30-50%Hoch
Dev/Test nachts aus2h60% (Dev)Hoch
Spot Instances1 Tag60-70%Mittel
Resource Quotas2h-Mittel
Unused Resources1h10-20%Niedrig
VPA einrichten4h20-30%Mittel
Multi-TenancyProjekt50%+Groß
FinOps Dashboard2hSichtbarkeitHoch

Nächste Schritte

  1. Heute: kubectl top pods -A ausführen - wo sind die größten Verschwender?
  2. Diese Woche: Resource Requests/Limits für Top-10-Deployments anpassen
  3. Dieser Monat: Cluster Autoscaler + Dev/Test-Scheduling einrichten

Weiterführende Artikel:


Sie wollen die Optimierung nicht selbst machen? Als Managed Service Partner optimieren wir Ihre Kubernetes-Kosten kontinuierlich - inklusive monatlichem FinOps-Report.

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