2025-01-10

CPU en Memory in Kubernetes: Het Kritieke Verschil voor je Applicaties

In onze vorige blogpost introduceerden we Kubernetes en zijn belangrijkste concepten. Nu gaan we dieper in op één van de meest cruciale aspecten: het beheer van CPU en geheugen. Het verschil tussen deze resources lijkt op het eerste gezicht subtiel, maar heeft verstrekkende gevolgen voor zowel de stabiliteit als de kosten van je cloudomgeving.

De Basis: Hoe Werkt Resource Management?

Elke container in Kubernetes heeft resources nodig om te kunnen draaien. De twee belangrijkste zijn CPU en geheugen. In Kubernetes configureer je deze via 'requests' en 'limits':

apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: app
    resources:
      requests:
        memory: "1Gi"
        cpu: "500m"
      limits:
        memory: "2Gi"
        cpu: "2000m"

Deze configuratie vertelt Kubernetes dat:

  • De container minimaal 500 milliCPU (0.5 CPU) en 1GB geheugen nodig heeft
  • De container maximaal 2 CPU's en 2GB geheugen mag gebruiken

Het Fundamentele Verschil: Compressible vs Non-Compressible

CPU: De Flexibele Resource

CPU is wat we een 'compressible' resource noemen. Dit betekent dat het systeem CPU-tijd dynamisch kan verdelen zonder dat applicaties crashen. Wanneer er niet genoeg CPU beschikbaar is:

  1. Het systeem verdeelt de beschikbare CPU-tijd proportioneel volgens de requests
  2. Containers worden 'throttled' als ze hun limiet bereiken: ze krijgen minder CPU-tijd
  3. Daardoor blijven applicaties  langzamer maar blijven functioneren
Praktijkvoorbeeld:

Stel je hebt twee containers:

  • Container A: request: 1 CPU
  • Container B: request: 2 CPU

Als er CPU-schaarste is, krijgt Container B altijd twee keer zoveel CPU als Container A, vanwege de 2:1 verhouding in requests.

Memory: De Harde Grens

Geheugen is 'non-compressible'. Als een applicatie geheugen heeft gealloceerd, kan het systeem dit niet zomaar terugnemen. Dit leidt tot:

  1. Het systeem kan geheugen niet herverdelen tussen containers
  2. Bij geheugentekort wordt een container direct gestopt (OOMKill)
  3. Er is geen graduele degradatie mogelijk

Voor kritieke services zoals databases is het vaak verstandig om geheugen request en limit gelijk te zetten. Dit voorkomt dat de container meer geheugen alloceert dan gegarandeerd beschikbaar is.

Het Gevaar van Overcommitment

Een veel voorkomend probleem is 'overcommitment', vooral met geheugen. Stel je hebt een node met 16GB geheugen:

apiVersion: v1
kind: Pod
metadata:
  name: risky-config
spec:
  containers:
  - name: app-1
    resources:
      requests:
        memory: "2Gi"
      limits:
        memory: "8Gi"
  - name: app-2
    resources:
      requests:
        memory: "2Gi"
      limits:
        memory: "8Gi"

Deze configuratie is riskant omdat:

  • De totale memory requests (4GB) passen op de node
  • De totale limits (16GB) kunnen de node overbelasten. Vergeet niet dat de node nog wat gebeugen moet overhebben voor de kernel, beheersprocessen, ...
  • Als beide containers naar hun limiet groeien, zal er gegarandeerd een OOMKill plaatsvinden

Monitoring en Optimalisatie

Het configureren van resources is geen eenmalige actie. Je hebt inzicht nodig in:

  1. Actueel Gebruik:
    • Wat is het baseline geheugengebruik?
    • Hoeveel CPU wordt daadwerkelijk gebruikt?
    • Zijn er regelmatige pieken?
  2. Resource Pressure:
    • Worden containers throttled?
    • Zijn er OOMKills?
    • Is er sprake van evictions?
  3. Kostenperspectief:
    • Zijn nodes efficiënt benut?
    • Zijn requests significant hoger dan het gebruik?
    • Kunnen workloads beter verdeeld worden?

De Krane Labs Aanpak

Bij Krane Labs zien we vaak dat teams worstelen met resource configuratie. Onze expertise helpt bij:

  1. Analyse: We brengen het werkelijke gebruik in kaart met gedetailleerde metrics
  2. Optimalisatie: We stellen resource configuraties bij op basis van data
  3. Preventie: We implementeren early warning systems voor resource problemen
  4. Kostenbesparing: We identificeren kansen voor efficiënter resource gebruik

Conclusie

Het effectief beheren van CPU en memory in Kubernetes vereist begrip van hun fundamentele verschillen. Met de juiste configuratie en monitoring voorkom je zowel onnodige kosten als onverwachte downtime. Bij Krane Labs helpen we je niet alleen met de initiële setup, maar zorgen we voor continue optimalisatie naarmate je workload evolueert.

Wil je weten hoe je resources optimaal kunt configureren voor jouw specifieke use case? Neem contact met ons op voor een gratis analyse van je huidige setup.

Onze laatste blogposts