3.5 KiB
LimitRange in Kubernetes
Overview
A LimitRange in Kubernetes is a namespace-level policy object that defines constraints on the compute resources that individual Pods and Containers can request and use. It helps ensure that workloads run efficiently and fairly within a shared cluster.
A LimitRange can set:
- Minimum and maximum resource requests and limits
- Default requests and limits if none are specified by the user
While a ResourceQuota enforces limits at the namespace level (total resource usage), a LimitRange enforces rules at the Pod or Container level.
Why Use a LimitRange
In a shared cluster, users might:
- Deploy Pods without specifying any resource requests or limits.
- Request excessive resources, leading to inefficient utilization.
A LimitRange prevents these issues by:
- Automatically applying default resource values when unspecified.
- Enforcing minimum and maximum resource thresholds.
- Ensuring fair distribution of resources among applications.
How It Works
When a Pod or Container is created in a namespace with a LimitRange:
- The Kubernetes API server checks if resource requests and limits are defined.
- If they are not provided, the LimitRange applies the configured default values.
- If provided values fall outside the configured minimum or maximum bounds, the API server rejects the creation request.
Example: LimitRange YAML
apiVersion: v1
kind: LimitRange
metadata:
name: mem-cpu-limits
namespace: dev-team
spec:
limits:
- type: Container
max:
cpu: "2" # Maximum 2 cores per container
memory: "2Gi" # Maximum 2Gi memory per container
min:
cpu: "200m" # Minimum 0.2 cores per container
memory: "256Mi" # Minimum 256Mi memory per container
default:
cpu: "500m" # Default limit if not specified
memory: "512Mi"
defaultRequest:
cpu: "250m" # Default request if not specified
memory: "256Mi"
Example Behavior
| Scenario | Request/Limit Defined? | Result |
|---|---|---|
| None | No | Defaults applied (250m CPU, 256Mi Memory) |
| Too High | Yes (e.g., 3 CPU) | Rejected — exceeds max of 2 |
| Too Low | Yes (e.g., 100m CPU) | Rejected — below min of 200m |
Viewing a LimitRange
You can inspect LimitRanges in a namespace using:
kubectl get limitrange -n dev-team
kubectl describe limitrange mem-cpu-limits -n dev-team
LimitRange vs ResourceQuota
| Feature | LimitRange | ResourceQuota |
|---|---|---|
| Scope | Per Container/Pod | Per Namespace |
| Controls | Min/Max/Default resource values | Total resource usage |
| Purpose | Enforce sane defaults and bounds | Prevent namespace-wide overuse |
| Works best with | ResourceQuota | LimitRange |
Summary
A LimitRange ensures that every Pod or Container in a namespace has appropriate resource requests and limits, preventing resource misuse and ensuring cluster stability. It complements ResourceQuota to provide complete resource management across both individual workloads and namespaces.