k8s limitrange doc
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
## 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:
|
||||
|
||||
1. The Kubernetes API server checks if resource requests and limits are defined.
|
||||
2. If they are not provided, the LimitRange applies the configured default values.
|
||||
3. If provided values fall outside the configured minimum or maximum bounds, the API server rejects the creation request.
|
||||
|
||||
---
|
||||
|
||||
### Example: LimitRange YAML
|
||||
|
||||
```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:
|
||||
|
||||
```bash
|
||||
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.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user