Veröffentlicht am

FinOps für Kubernetes: Kosten kontrollieren und optimieren

Teilen:
Authors

TL;DR

  • Kubecost und OpenCost liefern Kostentransparenz pro Namespace, Team und Label -- die Basis fuer jede FinOps-Initiative
  • Showback vor Chargeback: Erst Kostenbewusstsein schaffen, dann interne Verrechnung einfuehren
  • Right-Sizing mit VPA-Empfehlungen reduziert Overprovisioning um 40-60% ohne manuelle Analyse
  • Spot-Instances fuer Batch und Dev/Test sparen 60-70% gegenueber On-Demand-Preisen
  • Budget-Alerts und Anomalie-Erkennung verhindern Kostenexplosionen bevor sie auf der Rechnung landen

Kubernetes Cost Management: FinOps-Strategien fuer grosse Umgebungen

Kubernetes macht es einfach, Workloads zu skalieren -- und genauso einfach, die Kosten aus dem Blick zu verlieren. Wenn fuenf Teams in drei Clustern arbeiten und jedes Team eigene Namespaces betreibt, wird die monatliche Cloud-Rechnung schnell zur Black Box. FinOps loest dieses Problem durch Transparenz, Verantwortlichkeit und kontinuierliche Optimierung.

Dieser Guide zeigt, wie Plattform-Teams im Mittelstand eine FinOps-Praxis fuer Kubernetes aufbauen -- von der Tool-Auswahl bis zur kulturellen Veraenderung.

Warum klassisches Cloud-Kostenmanagement bei Kubernetes versagt

Kubernetes fuegt eine Abstraktionsschicht ein, die traditionelle Cloud-Cost-Tools nicht verstehen:

ProblemKlassisches Cloud-ToolFinOps fuer Kubernetes
Shared NodesSieht nur EC2/VM-KostenAllokiert Kosten pro Pod und Namespace
Dynamische SkalierungSnapshot-basiertVersteht HPA/VPA/Cluster-Autoscaler
Multi-TenantKeine Team-ZuordnungLabel-basierte Kostenverteilung
Idle ResourcesErkennt nur gestoppte VMsFindet ungenutzte CPU/Memory in laufenden Pods

Ohne Kubernetes-native Tools fehlt die Sicht auf die tatsaechliche Ressourcennutzung innerhalb der Cluster.

Kostentransparenz herstellen: OpenCost und Kubecost

OpenCost ist das CNCF-Sandbox-Projekt fuer Kubernetes-Kostenmonitoring. Kubecost baut darauf auf und bietet zusaetzlich Savings-Empfehlungen, Alerting und Multi-Cluster-Support.

# OpenCost installieren via Helm
helm repo add opencost https://opencost.github.io/opencost-helm-chart
helm repo update

helm install opencost opencost/opencost \
  --namespace opencost \
  --create-namespace \
  --set opencost.ui.enabled=true \
  --set opencost.prometheus.internal.serviceName=prometheus-server \
  --set opencost.prometheus.internal.namespaceName=monitoring

Kosten-Labels als Pflicht etablieren

Ohne konsistente Labels keine sinnvolle Kostenallokation. Definiert einen Label-Standard, den alle Teams einhalten muessen:

# Pflicht-Labels fuer Kostenallokation
apiVersion: apps/v1
kind: Deployment
metadata:
  name: order-service
  labels:
    app.kubernetes.io/name: order-service
    cost-center: "CC-4711"
    team: "platform-commerce"
    environment: "production"
    business-unit: "e-commerce"
spec:
  template:
    metadata:
      labels:
        app.kubernetes.io/name: order-service
        cost-center: "CC-4711"
        team: "platform-commerce"
        environment: "production"

Mehr zum Thema Label-Standards und Policy-Enforcement findet ihr in unserem Artikel zu Kubernetes Resource Management.

Showback und Chargeback: Kosten zuordnen

Showback zeigt Teams ihre Kosten, ohne sie direkt in Rechnung zu stellen. Das ist der richtige erste Schritt:

# Kubecost Allocation API: Kosten pro Team abfragen
# GET /model/allocation?window=lastmonth&aggregate=label:team

# Beispiel-Ergebnis:
# team: platform-commerce  -> 3.847 EUR/Monat
# team: platform-logistics -> 2.156 EUR/Monat
# team: data-engineering   -> 5.923 EUR/Monat
# team: __idle__           -> 1.874 EUR/Monat (ungenutzt!)

Chargeback geht einen Schritt weiter und verrechnet die Kosten tatsaechlich an Kostenstellen. Automatisiert das mit einem CronJob:

# Chargeback-Report als CronJob automatisieren
apiVersion: batch/v1
kind: CronJob
metadata:
  name: cost-report-generator
  namespace: kubecost
spec:
  schedule: "0 6 1 * *"  # Am 1. jedes Monats um 6:00 Uhr
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: report
            image: curlimages/curl:latest
            command:
            - /bin/sh
            - -c
            - |
              curl -s "http://kubecost-cost-analyzer.kubecost:9090/model/allocation?window=lastmonth&aggregate=label:cost-center&format=csv" \
              | tee /reports/chargeback-$(date +%Y-%m).csv
            volumeMounts:
            - name: reports
              mountPath: /reports
          volumes:
          - name: reports
            persistentVolumeClaim:
              claimName: cost-reports-pvc
          restartPolicy: OnFailure

Fuer eine detaillierte Einfuehrung in Kubernetes-Kostenoptimierung empfehlen wir unseren Praxis-Guide zur Kostenoptimierung.

Right-Sizing: Ueberprovisioning systematisch eliminieren

Die groesste Kostenquelle in Kubernetes ist Overprovisioning -- Pods, die deutlich mehr CPU und Memory reservieren als sie tatsaechlich nutzen.

# Goldilocks installieren fuer VPA-Empfehlungen
helm repo add fairwinds-stable https://charts.fairwinds.com/stable
helm install goldilocks fairwinds-stable/goldilocks \
  --namespace goldilocks \
  --create-namespace

# Namespace fuer VPA-Analyse aktivieren
kubectl label namespace production goldilocks.fairwinds.com/enabled=true

# VPA-Empfehlungen nach 24h pruefen
kubectl get vpa -n production -o yaml | grep -A 5 "recommendation"

Right-Sizing-Policy mit Kyverno erzwingen

# Kyverno Policy: Maximale Resource Requests begrenzen
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: limit-resource-requests
spec:
  validationFailureAction: Enforce
  rules:
  - name: check-cpu-requests
    match:
      any:
      - resources:
          kinds:
          - Pod
    validate:
      message: "CPU Request darf maximal 2 Cores betragen. Bitte Right-Sizing pruefen."
      pattern:
        spec:
          containers:
          - resources:
              requests:
                cpu: "<=2000m"

Idle-Resource-Erkennung und Dev/Test-Scheduling

Nicht nur uebergrosse Pods kosten Geld -- auch komplett ungenutzte Ressourcen und 24/7 laufende Dev-Umgebungen:

# Ungenutzte PersistentVolumeClaims finden
kubectl get pvc --all-namespaces -o json | \
  jq -r '.items[] | select(.status.phase=="Bound") |
  "\(.metadata.namespace)/\(.metadata.name) - \(.spec.resources.requests.storage)"'
# CronJob: Dev-Namespaces nachts herunterfahren (Mo-Fr um 20:00)
apiVersion: batch/v1
kind: CronJob
metadata:
  name: scale-down-dev
  namespace: kube-system
spec:
  schedule: "0 20 * * 1-5"
  jobTemplate:
    spec:
      template:
        spec:
          serviceAccountName: namespace-scaler
          containers:
          - name: scaler
            image: bitnami/kubectl:latest
            command:
            - /bin/sh
            - -c
            - |
              for ns in dev staging qa; do
                kubectl scale deployment --all -n $ns --replicas=0
              done
          restartPolicy: OnFailure

Wie Autoscaling und Kostenreduktion zusammenhaengen, beschreibt unser Guide zu Autoscaling und Kostenersparnis.

Spot-Instance-Strategien fuer Kubernetes

Spot-Instances (AWS), Preemptible VMs (GCP) oder Spot VMs (Azure) bieten 60-70% Ersparnis, erfordern aber eine durchdachte Node-Pool-Architektur:

# EKS Managed Node Group: Spot-Instances fuer nicht-kritische Workloads
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: production-cluster
  region: eu-central-1
managedNodeGroups:
  - name: on-demand-system
    instanceType: m6i.xlarge
    desiredCapacity: 3
    labels:
      workload-type: system

  - name: spot-batch
    instanceTypes:
      - m6i.xlarge
      - m5.xlarge
      - m5a.xlarge
    spot: true
    desiredCapacity: 5
    labels:
      workload-type: batch
    taints:
      - key: spot-instance
        value: "true"
        effect: NoSchedule

Budget-Alerts und Anomalie-Erkennung

# Kubecost Alert-Konfiguration in values.yaml
kubecostProductConfigs:
  alertConfigs:
    alerts:
    - type: budget
      threshold: 5000
      window: monthly
      aggregation: namespace
      filter: "production"
      slackWebhookUrl: "https://hooks.slack.com/services/YOUR/WEBHOOK/URL"

    - type: spendChange
      threshold: 0.3  # Alert bei 30% Kostenanstieg
      baselineWindow: 7d
      window: 1d
      aggregation: cluster
      slackWebhookUrl: "https://hooks.slack.com/services/YOUR/WEBHOOK/URL"

Einen umfassenden Ueberblick zu Kubernetes-Kostenmonitoring findet ihr in unserem Monitoring-Guide.

FinOps-Reifegrad-Modell und Teamstruktur

Phase 1: Crawl (Monat 1-3)
├── OpenCost/Kubecost installieren
├── Label-Standards definieren
├── Monatliche Kosten-Reports erstellen
└── Erste Showback-Dashboards bereitstellen

Phase 2: Walk (Monat 4-8)
├── Team-Budgets definieren
├── Right-Sizing-Empfehlungen umsetzen
├── Spot-Instances fuer Dev/Test einfuehren
└── Woechentliche FinOps-Reviews

Phase 3: Run (ab Monat 9)
├── Chargeback-Modell aktivieren
├── Anomalie-Erkennung automatisieren
├── Reserved Capacity planen
└── FinOps in OKRs und Team-Ziele integrieren

Im Mittelstand braucht es kein dediziertes FinOps-Team. Der Schluessel ist ein woechentliches 30-Minuten-Meeting, in dem die Top-3-Kostentreiber besprochen und Massnahmen vereinbart werden.

RolleFinOps-AufgabeZeitaufwand
Platform EngineerTooling, Dashboards, Policies20%
Team LeadBudget-Reviews, Optimierungsentscheidungen5%
Engineering ManagerQuartals-Budget-Planung5%
Finance/ControllingChargeback-Verrechnung10%

Reserved Capacity und Commitment-Planung

# AWS: Savings Plans Empfehlungen abrufen
aws ce get-savings-plans-purchase-recommendation \
  --savings-plans-type COMPUTE_SP \
  --term-in-years ONE_YEAR \
  --payment-option NO_UPFRONT \
  --lookback-period-in-days SIXTY_DAYS

Faustregel fuer Commitments:

  • Baseline-Last (Minimum ueber 30 Tage) mit Reserved Instances/Savings Plans abdecken
  • Variable Last mit On-Demand
  • Peaks und Batch-Jobs mit Spot-Instances

Checkliste: FinOps-Quick-Wins

  • OpenCost oder Kubecost in allen Clustern installiert
  • Label-Standard definiert und per Policy erzwungen
  • Monatlicher Kosten-Report an alle Team-Leads
  • Dev/Test-Umgebungen nachts und am Wochenende heruntergefahren
  • VPA-Empfehlungen fuer die Top-20 teuersten Deployments umgesetzt
  • Budget-Alerts fuer Namespaces konfiguriert
  • Spot-Instances fuer nicht-kritische Workloads aktiviert
  • Ungenutzte PVCs und Load Balancer identifiziert und bereinigt

Fazit

FinOps fuer Kubernetes ist kein einmaliges Projekt, sondern eine kontinuierliche Praxis. Startet mit Transparenz (Showback), baut Verantwortlichkeit auf (Team-Budgets) und automatisiert dann die Optimierung (Right-Sizing, Spot, Scale-Down). Fuer eine detaillierte Einfuehrung in Hosting-Kosten verschiedener Anbieter empfehlen wir unseren Kubernetes Hosting Kosten Vergleich.

Die wichtigste Erkenntnis: Kubernetes-Kosten sind kein reines Infrastruktur-Problem. Sie sind ein Organisations-Problem, das technische Loesungen und kulturelle Veraenderung erfordert.


Sie moechten FinOps fuer Ihre Kubernetes-Umgebung einfuehren? Wir unterstuetzen Sie bei der Tool-Auswahl, Dashboard-Einrichtung und dem Aufbau einer nachhaltigen Kostenkultur. Kontaktieren Sie uns fuer ein unverbindliches Erstgespraech.

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

kubernetesopencost+1 weitere

OpenCost FinOps: Kubernetes-Kosten pro Team aufschlüsseln

Meistern Sie mit OpenCost 2026 die präzise Kostenallokation und Showback in Kubernetes für FinOps im Mittelstand. Dieser Guide zeigt DevOps-Teams, wie sie Cloud-Kosten transparent machen, Budgets überwachen und die Kubernetes Kostenoptimierung sowie Effizienz signifikant steigern – ideal als leistungsstarke Kubecost-Alternative.

Weiterlesen →