Schritt 1: Sichtbar machen, wohin das Geld fließt
Ohne Zuordnung auf Namespace und Workload bleibt jede Maßnahme eine Vermutung. Der erste Schritt ist deshalb reine Messarbeit, einmal in der Cloud-Rechnung und einmal im Cluster.
kubectl top nodes
kubectl top pods -A --sort-by=cpu | head -20
# Was ist reserviert, was laeuft wirklich?
kubectl describe node ip-10-42-1-17.eu-central-1.compute.internal \
| sed -n '/Allocated resources/,/Events/p'
# Requests je Namespace aufsummieren
kubectl get pods -A -o json | jq -r '
.items[] | .metadata.namespace as $ns
| .spec.containers[].resources.requests
| select(. != null) | "\($ns) \(.cpu // "0") \(.memory // "0")"' | sort | uniq -cDer Abschnitt Allocated resources zeigt die Reservierung, kubectl top die tatsächliche Nutzung. Die Lücke zwischen beiden Zahlen ist dein Sparpotenzial, und sie beträgt in ungepflegten Clustern regelmäßig mehr als die Hälfte.
# AWS: Monatskosten nach Dienst
aws ce get-cost-and-usage \
--time-period Start=2026-06-01,End=2026-07-01 \
--granularity MONTHLY --metrics UnblendedCost \
--group-by Type=DIMENSION,Key=SERVICE
# Azure: laufender Monat, taeglich aufgeloest
az costmanagement query --type ActualCost \
--scope "/subscriptions/$SUB_ID" \
--timeframe MonthToDate --dataset-granularity DailyErwartbar ist ein Bild, in dem EC2 beziehungsweise Virtual Machines den Löwenanteil ausmachen, während der Posten für den verwalteten Cluster selbst kaum auffällt. Genau das ist die Begründung dafür, bei den Nodes anzusetzen und nicht beim Cluster.
Für die Zuordnung innerhalb des Clusters brauchst du ein Werkzeug, das Node-Preise auf Pods herunterrechnet. OpenCost ist das quelloffene Projekt der CNCF und liest die Preislisten der Anbieter selbst ein, Kubecost setzt darauf auf und ergänzt Oberfläche und Berichte. Beide brauchen saubere Labels, sonst landet der größte Anteil im Topf unallocated und die Diskussion beginnt von vorn. Wie aus der einmaligen Auswertung ein dauerhafter Prozess mit klaren Zuständigkeiten wird, steht auf FinOps einführen.