Resource Management & Limits¶
🎯 Learning Objectives
- Master resource requests and limits
- Understand resource quotas and limit ranges
- Learn advanced resource management patterns
- Troubleshoot resource-related issues
- Optimize resource utilization
Effective resource management is critical for cluster stability and performance. Understanding requests, limits, quotas, and limit ranges enables optimal resource utilization.
Resource Requests vs Limits
Requests: Guaranteed resources (used for scheduling) Limits: Maximum resources (enforced by cgroups)
OOMKilled
Containers exceeding memory limits are killed (OOMKilled). Always set appropriate limits.
Resource Requests and Limits¶
Basic Resource Configuration¶
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: app
image: nginx:alpine
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
CPU Units
CPU can be specified as: whole numbers (1, 2) or millicores (1000m = 1 CPU).
Quality of Service Classes¶
Kubernetes assigns QoS classes based on resource configuration:
Guaranteed: - All containers have requests = limits - Highest priority, last to be evicted
Burstable: - At least one container has request < limit - Medium priority
BestEffort: - No requests or limits - Lowest priority, first to be evicted
QoS Strategy
Use Guaranteed QoS for critical workloads, Burstable for most applications, BestEffort only for non-critical.
Resource Quotas¶
Namespace Quota¶
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: production
spec:
hard:
requests.cpu: "10"
requests.memory: 20Gi
limits.cpu: "20"
limits.memory: 40Gi
persistentvolumeclaims: "10"
pods: "20"
Quota Enforcement
Resource quotas are enforced at namespace level. Plan quotas carefully to avoid blocking deployments.
Limit Ranges¶
Default Limits¶
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
namespace: default
spec:
limits:
- default:
memory: "512Mi"
cpu: "500m"
defaultRequest:
memory: "256Mi"
cpu: "250m"
type: Container
Default Limits
Limit ranges provide defaults when containers don't specify resources. Prevents resource exhaustion.
Troubleshooting¶
Common Issues¶
Pods Pending (Insufficient Resources)¶
# Check node resources
kubectl describe node <node-name>
# Check resource requests
kubectl get pods -o custom-columns=NAME:.metadata.name,REQ-CPU:.spec.containers[*].resources.requests.cpu,REQ-MEM:.spec.containers[*].resources.requests.memory
# Check quota usage
kubectl describe quota -n <namespace>
Troubleshooting Steps
- Check node capacity
- Verify resource requests
- Check resource quotas
- Review pod scheduling events
- Consider node scaling
OOMKilled Pods¶
# Check pod status
kubectl get pods | grep OOMKilled
# Check memory usage
kubectl top pod <pod-name>
# Check limits
kubectl describe pod <pod-name> | grep -A 5 Limits
Memory Issues
OOMKilled indicates memory limit exceeded. Increase limits or optimize application memory usage.
Best Practices¶
Production Recommendations
- Always set resource requests and limits
- Use Guaranteed QoS for critical workloads
- Implement resource quotas per namespace
- Set limit ranges for defaults
- Monitor resource usage
- Right-size resources based on metrics
Next Chapter: Performance Tuning