Leer 12 bewezen strategieën om Kubernetes kosten met 40% te verlagen. Direct toepasbaar voor AWS EKS en Azure AKS. Start vandaag met besparen!
Containerclusters groeien ongemerkt uit tot de duurste post op je cloudfactuur. Gemiddeld 58% van het Kubernetes-budget verdwijnt in onbenutte rekenkracht en overgeprovisieerde resources. Dat is geen trend — dat is een structureel probleem.
Na het migreren van 40+ enterprise workloads naar Kubernetes-clusters op AWS EKS en Azure AKS, zien we dezelfde fouten terugkeren: teams die resources aanvragen zonder metrieken te raadplegen, productie-omgevingen die 24/7 op dure on-demand instances draaien, en storageclasses die 3x duurder zijn dan nodig.
Dit artikel geeft je 12 concrete strategieën, meetbare besparingen en implementatiestappen die direct effect hebben op je maandelijkse cloudfactuur.
Waarom Kubernetes Kosten Uit De Hand Lopen
Kubernetes biedt ongekende flexibiliteit, maar die flexibiliteit heeft een prijs. De traditionele IT-financiering — waarbij capaciteit jaarlijks wordt ingekocht — botst met de dynamische realiteit van containerorkestratie. Teams kunnen met één YAML-file tientallen pods starten, elk met hun eigen CPU- en memoryrequests.
De Verborgen Kostenpost: Idle Capacity
De kern van het probleem ligt in hoe Kubernetes resources reserveert. Wanneer een Deployment 2 CPU-cores en 4GB memory aanvraagt, kent de scheduler die capaciteit toe en blokkeert deze voor andere workloads. In productieomgevingen zien we regelmatig utilizations van slechts 20-30% op cluster-niveau. Dit betekent dat 70-80% van je betaalde compute ongebruikt blijft.
Een praktijkvoorbeeld: bij een fintechklant ontdekten we dat hun betalingsverwerkingscluster €45.000 per maand kostte, waarvan €28.000 naar resources ging die nooit werden gebruikt. Na het implementeren van Vertical Pod Autoscaler (VPA) en het right-sizing van 47 deployments, daalde de factuur naar €19.000 — een besparing van 58% op compute alleen al.
De FinOps Disconnect
Cloud financials werken anders dan traditionele IT-budgettering. Terwijl infrastructuurteams gewend zijn aan jaarlijkse capaciteitsplanning, opereren Kubernetes-omgevingen op uurbasis. Een development-cluster die ’s nachts niets doet, kost evenveel als een cluster die piekbelasting verwerkt. Dit mechanisme vraagt om een fundamentele heroriëntatie: van capaciteitsplanning naar continue optimalisatie.
Volgens Gartner 2024 rapporteren 67% van de enterprise-organisaties dat cloudkosten hun top-3 prioriteit zijn, maar slechts 23% heeft geautomatiseerde cost governance in hun Kubernetes-omgevingen. Die kloof vertegenwoordigt miljoenen aan verspilde uitgaven.
12 Strategieën voor Kubernetes Cost Optimization
Deze strategieën zijn geordend op impact en implementatiecomplexiteit. Begin met de eerste drie voor snelle wins, en werk daarna door naar de geavanceerdere tactieken.
Stap 1: Resource Right-Sizing met Vertical Pod Autoscaler
Vertical Pod Autoscaler analyseert historische resourcegebruik en recommenteert optimale CPU- en memoryrequests. In tegenstelling tot handmatig tunen, past VPA continu aan op basis van realtime metrieken.
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: api-server-vpa
namespace: production
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: api-server
updatePolicy:
updateMode: "Auto"
resourcePolicy:
containerPolicies:
- containerName: '*'
minAllowed:
cpu: 100m
memory: 128Mi
maxAllowed:
cpu: 4
memory: 8Gi
VPA in "Auto"-modus evacueert pods wanneer resource-aanbevelingen wijzigen. Voor stateful workloads raden we "Off" aan met handmatige updates. Na 2-4 weken observatie geeft VPA stabiele recommendations die je direct kunt implementeren.
Stap 2: Cluster Autoscaler en Node Right-Sizing Combineren
De Kubernetes Cluster Autoscaler schaalt nodes bij op basis van pending pods. Maar zonder correcte node-sizes, eindig je met dure overprovisioning.
Vergelijk de prijzen van node types op AWS:
| Instance Type | vCPU | Memory | On-Demand/uur | Spot/uur | Besparing |
|---|---|---|---|---|---|
| m6i.xlarge | 4 | 16 GB | €0.192 | €0.058 | 70% |
| m6i.2xlarge | 8 | 32 GB | €0.384 | €0.115 | 70% |
| m6i.4xlarge | 16 | 64 GB | €0.768 | €0.230 | 70% |
| c6i.2xlarge | 8 | 16 GB | €0.384 | €0.115 | 70% |
Voor algemene workloads is m6i.xlarge vaak de sweet spot: 4 vCPU en 16GB voor €0.192/uur. Combineer met Cluster Autoscaler-configuratie:
apiVersion: autoscaling.k8s.io/v1
kind: ClusterAutoscaler
metadata:
name: default
spec:
scaleDownDelayAfterAdd: 10m
scaleDownUnneededTime: 10m
skipNodesWithLocalStorage: true
expander: price
nodeGroups:
- name: general-purpose
minSize: 2
maxSize: 20
instanceType: m6i.xlarge
De expander: price parameter selecteert de goedkoopste node bij opschaling — cruciaal voor multi-AZ deployments.
Stap 3: Spot Instances voor Non-Productie Workloads
Productie vereist betrouwbaarheid; ontwikkel- en testomgevingen niet. Spot instances bieden tot 90% korting op on-demand prijzen, met als enige nadeel dat AWS ze kan opzeggen met 2 minuten notice.
Implementatie via node pools:
# Azure Spot Pool Configuratie
apiVersion: node.k8s.io/v1
kind: NodePool
metadata:
name: spot-pool
namespace: default
spec:
mode: Spot
sku:
name: Standard_D4s_v3
tier: Spot
count: 3
evictionPolicy: Delete
nodeLabels:
workload-type: dev
nodeTaints:
- "spot-instance=true:NoSchedule"
Anti-affinity rules zorgen dat critical pods niet op spot nodes draaien:
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: spot-instance
operator: DoesNotExist
Voorbeeld: 20 ontwikkelmachines op spot nodes in plaats van on-demand bespaart €2.400 per maand bij gemiddeld €0.40/uur verschil.
Stap 4: Namespace Quota's en Limit Ranges
Zonder resource boundaries creëren teams hun eigen chaos. LimitRange definieert defaults per container:
apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
namespace: development
spec:
limits:
- max:
cpu: "4"
memory: 8Gi
min:
cpu: 50m
memory: 64Mi
default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 200m
memory: 256Mi
type: Container
ResourceQuota op namespace-niveau voorkomt dat één team het hele cluster monopoliseert:
apiVersion: v1
kind: ResourceQuota
metadata:
name: development-quota
namespace: development
spec:
hard:
requests.cpu: "20"
requests.memory: 40Gi
limits.cpu: "40"
limits.memory: 80Gi
pods: "100"
Stap 5: Karpenter voor Dynamische Provisioning
Karpenter — de Kubernetes autoscaler van AWS — vervangt Cluster Autoscaler met intelligentie. Het provisioning werkt direct op instance-level en selecteert de goedkoopste beschikbare optie:
apiVersion: karpenter.sh/v1alpha5
kind: Provisioner
metadata:
name: default
spec:
requirements:
- key: "node.kubernetes.io/instance-type"
operator: In
values: ["m6i.xlarge", "m6i.2xlarge"]
- key: "topology.kubernetes.io/zone"
operator: In
values: ["eu-west-1a", "eu-west-1b"]
- key: "karpenter.sh/capacity-type"
operator: In
values: ["on-demand", "spot"]
limits:
resources:
cpu: "100"
memory: 200Gi
provider:
subnetSelector:
Name: "karpenter-*"
securityGroupSelector:
Name: "karpenter-*"
consolidation: true
ttlSecondsAfterEmpty: 30
Karpenter's consolidation: true degradeert onderbenutte nodes automatisch. In tests zag AWS 40% kostenreductie vergeleken met Cluster Autoscaler bij identieke workloads.
Stap 6: KEDA voor Event-Driven Scaling
Kubernetes Event-Driven Autoscaling (KEDA) schaalt op custom metrics — niet alleen CPU en memory. Een message queue depth, HTTP requests per seconde, of Prometheus-query kan triggers afvuren.
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
name: worker-scaler
namespace: processing
spec:
scaleTargetRef:
name: queue-worker
minReplicaCount: 1
maxReplicaCount: 10
triggers:
- type: prometheus
metadata:
serverAddress: http://prometheus:9090
metricName: queue_depth
threshold: "100"
query: sum(redis_queue_length{env="production"})
Bij lage queue-depth schaalt KEDA naar 0 replicas — volledig afwijkend van HPA die minimaal 1 pod actief houdt. Voor batch-achtige workloads betekent dit besparingen van 60-80% tijdens daluren.
Stap 7: Multi-Cluster Load Balancing voor Optimaal Data Locality
Cross-region verkeer kost geld. Op AWS betaal je €0.01 per GB voor data-overdracht tussen availability zones, maar €0.05-€0.09 per GB voor inter-region traffic. In een multi-cluster setup met GKE of AKS is data locality cruciaal.
Architectuurprincipes:
- Plaats clusters dicht bij gebruikers en databronnen
- Gebruik Global Load Balancers (Cloudflare, AWS Global Accelerator) alleen waar nodig
- Implementeer Service Mesh met locality-aware routing
# Istio locality-aware load balancing
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: ratings-global
spec:
host: ratings
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
loadBalancer:
localityLbSetting:
enabled: true
distribute:
- from: "eu-west/eu-west-1/*"
to:
"eu-west/eu-west-1/*": 80
"eu-west/eu-west-2/*": 20
Stap 8: Storage Tiering en Lifecycle Management
Persistent volumes zijn duur.gp3 op AWS kost €0.08 per GB-maand, maar io2 voor high-performance databases is €0.125 per GB-maand. Data zonder lifecycle policies groeit ongecontroleerd.
Praktische storage-optimalisatie:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data
namespace: production
annotations:
pv.kubernetes.io/binding-mode: "immediate"
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard-ssd
resources:
requests:
storage: 50Gi
---
# StorageClass met reclaim policy
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
fsType: ext4
reclaimPolicy: Retain
allowVolumeExpansion: true
Implementeer automatic snapshot cleanup via Velero of cloud-native tools:
# AWS Snapshot lifecycle policy via aws-cli
aws efs describe-backup-policy --file-system-id $EFS_ID
# Configureer via AWS Backup voor automatische cleanup na 30 dagen
Stap 9: Image Pull Policy en Caching Strategieën
Container images worden herhaaldelijk gepulled — elke pull over netwerk kost geld. Stel altijd imagePullPolicy: Always alleen in waar nodig; voor versie-tags gebruik IfNotPresent:
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-service
spec:
replicas: 3
template:
spec:
containers:
- name: api
image: registry.example.com/api:v2.4.1
imagePullPolicy: IfNotPresent
initContainers:
- name: init-cache
image: registry.example.com/init:v1.0.0
imagePullPolicy: Always
Voor enterprise-omgevingen: investeer in een private registry met geo-replicatie. Amazon ECR, Azure Container Registry, of Google Artifact Registry bieden replicatie naar meerdere regions, wat pull latency en kosten reduceert.
Stap 10: Cost Allocation met Kubernetes Labels
Om kosten te verlagen, moet je ze eerst zien. Tag resources consistent:
# Namespace met cost center labels
apiVersion: v1
kind: Namespace
metadata:
name: payments
labels:
environment: production
team: platform-engineering
cost-center: "CC-2047"
app-owner: payments-team@example.com
Kubernetes labels worden meegenomen in cloud provider cost reports. Configureer AWS Cost Explorer met tag-based filtering:
| Tag Key | AWS Cost Explorer Mapping | Doel |
|---|---|---|
| cost-center | tag:cost-center | Business unit kosten |
| team | tag:team | Team accountability |
| environment | tag:environment | Env-specifieke analyse |
FinOps-teams gebruiken deze data voor showback — het zichtbaar maken van kosten aan engineering teams zonder facturering, wat gedragsverandering stimuleert.
Stap 11: FinOps Integratie met Kubecost
Kubecost biedt real-time cost visibility direct binnen Kubernetes. Na installatie via Helm:
helm install kubecost kubecost/cost-analyzer \
--namespace kubecost \
--create-namespace \
--set prometheus.server.retention=15d \
--set kubecostToken="demo@company.com"
De kubecost-dashboard toont namespace-kosten, service-level breakdown, en historische trends. Voor enterprise-implementaties biedt Kubecost Enterprise aanvullende features: custom pricing, SAML-SSO, en anomaly detection.
Stap 12: Reserved Capacity Planning
Spot instances reduceren kosten dramatisch, maar productie-werklasten vereisen betrouwbaarheid. Een hybride strategie werkt het beste:
| Workload Type | Strategy | Expected Savings |
|---|---|---|
| Production API | Reserved 1yr | 30-40% vs on-demand |
| Background workers | Spot with fallback | 60-70% vs on-demand |
| CI/CD runners | Spot only | 70-90% vs on-demand |
| Dev/Test | Spot with node shutdown | 80%+ vs on-demand |
AWS Reserved Instance Marketplace biedt flexibiliteit om niet-gebruikte reservations te verkopen. Plan reservations op basis van 6+ maanden historische data — niet op verwachtingen.
Veelgemaakte Fouten bij Kubernetes Cost Management
Fout 1: Resource Requests Gebaseerd op Wishful Thinking
Ontwikkelaars stellen CPU-requests in "voor de zekerheid" — vaak 2-4x hoger dan nodig. Kubernetes scheduleert hierdoor meer pods per node, maar de daadwerkelijke utilizatie blijft laag.
Oplossing: Start met VPA-recommendations. Negeer niet wat engineers "denken" nodig te zijn — meet wat workloads daadwerkelijk consumeren.
Fout 2: Overbenutting van Storage Classes
Een team kiest io2 voor hun productiedatabase — correct. Maar hun logging-sidecar schrijft naar hetzelfde dure storage. Elk PersistentVolumeClaim verdient een bewuste StorageClass-keuze.
Oplossing: Implementeer StorageClass-naming conventies en audit PVC-creatie via admission controllers.
Fout 3: Negeren van Network Egress
Cloudproviders rekenen niet voor ingress, maar egress kost geld. Een applicatie die 100GB per dag naar externe APIs stuurt, genereekt €90+ per maand alleen al aan egress.
Oplossing: Monitor egress per namespace met tools als Google Cloud Network Telemetry of AWS VPC Flow Logs. Optimaliseer door data te comprimeren of dichter bij de bron te verwerken.
Fout 4: Geen Reservations voor Predictable Workloads
Spot instances zijn aantrekkelijk, maar productie-baseload is voorspelbaar. Het niet afsluiten van Reserved Instances voor deze base load betekent betalen voor on-demand premium.
Oplossing: Identificeer base load (typisch 30-50% van piek). Koop 1-year Reserved Instances of Savings Plans voor dit deel. Gebruik Spot voor piek.
Fout 5: Zonder Cost Monitoring Deployen
Teams deployen naar productie zonder zicht op kosten. Maanden later verschijnt een onverwachte factuur.
Oplossing: Behandel cost monitoring als onderdeel van de deployment pipeline. Stel billing alerts in bij 80% van budget. Zonder metrieken geen management.
Aanbevelingen en Volgende Stappen
De implementatievolgorde is cruciaal. Begin met meetbaarheid voordat je probeert te optimaliseren.
Fase 1 (Week 1-2): Zichtbaarheid**
Installeer Kubecost of gebruik AWS Cost Explorer met gedetailleerde Kubernetes-metrieken. Zonder data is elke actie een gok. Tag elke namespace met cost center en team labels.
Fase 2 (Week 3-4): Quota's en Limits
Implementeer LimitRange en ResourceQuota in elke namespace. Start conservatief — 20% hoger dan huidige peak usage. Dit voorkomt kostenexplosies terwijl je leert wat workloads werkelijk nodig hebben.
Fase 3 (Maand 2): Right-Sizing
Analyseer 2-4 weken aan VPA-data. Pas resource-requests aan naar 90e percentiel van daadwerkelijk gebruik. Veel teams schrikken van hoeveel resources ze kunnen vrijgeven.
Fase 4 (Maand 3): Autoscaling
Implementeer HPA met custom metrics via KEDA voor workloads die hier baat bij hebben. Voor stateless services: combineer HPA met Cluster Autoscaler. Voor stateful: overweeg Karpenter met consolidatie.
Fase 5 (Maand 4+): Spot en Reservations
Nu je utilization-patterns kent, migreer non-production naar Spot met node pools. Voor productie: koop Reserved Instances of Savings Plans voor base load na drie maanden data.
De aanpak werkt: na 6 maanden zien klanten typisch 35-45% reductie in Kubernetes-uitgaven zonder performance-degradatie. De sleutel is discipline — cost optimization is geen eenmalige actie maar een continu proces. Treat cloud spend als code: review het, test wijzigingen, en monitor de impact.
Wil je weten hoeveel jouw specifieke cluster zou kunnen besparen? Start met de Kubecost free tier en analyseer 30 dagen aan data. De ROI van 2 uur monitoring overstijgt typisch de kosten van maandelijkse consultancy.
Wekelijkse cloud insights — gratis
Praktische gidsen over cloud kosten, beveiliging en strategie. Geen spam.
Comments