Skip to content

Resource Requests and Limits

Overview

Resource management ensures fair scheduling and prevents resource starvation.

FieldPurpose
requestsMinimum guaranteed resources (used for scheduling)
limitsMaximum allowed resources (enforced at runtime)

Resource Types

CPU:

  • Measured in millicores (m) or cores
  • 1 core = 1000m
  • Example: 100m = 0.1 CPU

Memory:

  • Measured in bytes (Ki, Mi, Gi)
  • Example: 256Mi = 256 mebibytes

Basic Example

yaml
apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: app
    image: nginx
    resources:
      requests:
        memory: "64Mi"
        cpu: "100m"
      limits:
        memory: "128Mi"
        cpu: "200m"

How Scheduling Works

  1. Scheduler looks at requests to find a node with enough capacity
  2. Node's allocatable resources must >= sum of all pod requests
  3. Limits are enforced by kubelet (cgroups) at runtime

Behavior When Limits Exceeded

ResourceBehavior
CPUThrottled (process slowed down)
MemoryOOMKilled (pod terminated)

Best Practices

yaml
# Good: requests < limits (burstable)
resources:
  requests:
    cpu: "100m"
    memory: "128Mi"
  limits:
    cpu: "500m"
    memory: "256Mi"

# Guaranteed QoS: requests = limits
resources:
  requests:
    cpu: "100m"
    memory: "128Mi"
  limits:
    cpu: "100m"
    memory: "128Mi"

LimitRange

Set default/min/max for a namespace:

yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
  namespace: default
spec:
  limits:
  - default:          # default limit
      memory: "512Mi"
      cpu: "500m"
    defaultRequest:   # default request
      memory: "256Mi"
      cpu: "100m"
    max:              # max allowed
      memory: "1Gi"
      cpu: "1"
    min:              # min allowed
      memory: "64Mi"
      cpu: "50m"
    type: Container

ResourceQuota

Limit total resources in namespace:

yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: dev
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
    pods: "10"

Useful Commands

bash
# Check node capacity and allocatable
kubectl describe node <node-name> | grep -A5 "Allocatable"

# Check resource usage
kubectl top pods
kubectl top nodes

# Check pod resources
kubectl describe pod <pod-name> | grep -A10 "Limits"

Released under the MIT License.