Resource Requests and Limits
Overview
Resource management ensures fair scheduling and prevents resource starvation.
| Field | Purpose |
|---|---|
requests | Minimum guaranteed resources (used for scheduling) |
limits | Maximum 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
- Scheduler looks at
requeststo find a node with enough capacity - Node's allocatable resources must >= sum of all pod requests
- Limits are enforced by kubelet (cgroups) at runtime
Behavior When Limits Exceeded
| Resource | Behavior |
|---|---|
| CPU | Throttled (process slowed down) |
| Memory | OOMKilled (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: ContainerResourceQuota
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"