DEV Community

Cover image for LimitRange and Resource Quotas: Taming Kubernetes Resource Chaos ๐Ÿš€
Laxman Patel
Laxman Patel

Posted on • Originally published at gorgeousgawin.hashnode.dev

LimitRange and Resource Quotas: Taming Kubernetes Resource Chaos ๐Ÿš€

Kubernetes is a powerful orchestration tool, but with great power comes great responsibility. Imagine a scenario where one greedy pod consumes all the CPU and memory, leaving other pods starving. Or a namespace where resources are over-allocated, causing cluster-wide performance issues. Sounds like a nightmare, right? Enter LimitRange and ResourceQuotaโ€”Kubernetes' dynamic duo for resource management. In this article, weโ€™ll dive into what they are, why theyโ€™re essential, and how to use them effectively.


๏ฟฝ The Problem: Resource Anarchy in Kubernetes

In a Kubernetes cluster, multiple teams and applications share the same resources. Without proper governance, chaos ensues:

  • Resource Hogging: A single pod can monopolize CPU and memory, starving others.

  • Over-Provisioning: Developers might request excessive resources "just to be safe," leading to wasted capacity.

  • Under-Provisioning: Pods might not get enough resources, causing crashes or poor performance.

  • Namespace Sprawl: One namespace could consume all available resources, leaving nothing for others.

This is where LimitRange and ResourceQuota come to the rescue.


๐Ÿ› ๏ธ What Are LimitRange and ResourceQuota?

1. LimitRange: Setting Boundaries for Pods and Containers

Think of LimitRange as a bouncer at a club. It enforces rules on how much CPU, memory, and storage each pod or container can request or use. It ensures that no single pod or container goes overboard.

Key features:

  • Sets minimum and maximum resource limits for CPU and memory.

  • Defines default requests and limits if not specified by the user.

  • Prevents resource starvation by ensuring fair usage.

2. ResourceQuota: Governing Namespace-Level Resources

While LimitRange focuses on individual pods, ResourceQuota operates at the namespace level. Itโ€™s like a budget manager for your Kubernetes namespace, ensuring that no single namespace consumes all the cluster resources.

Key features:

  • Limits the total amount of CPU, memory, and storage a namespace can use.

  • Controls the number of objects (pods, services, secrets, etc.) in a namespace.

  • Prevents resource exhaustion across the cluster.


๏ฟฝ Why Are They Needed?

  1. Fair Resource Allocation: Ensures that all applications get their fair share of resources.

  2. Cost Optimization: Prevents over-provisioning, saving cloud costs.

  3. Stability and Performance: Avoids resource contention, ensuring smooth cluster operations.

  4. Multi-Tenancy: Enables safe sharing of clusters across teams or projects.

  5. Compliance: Helps meet organizational policies and SLAs.


๐Ÿ› ๏ธ How to Use LimitRange and ResourceQuota

1. LimitRange in Action

Letโ€™s create a LimitRange to enforce resource constraints in a namespace.

apiVersion: v1
kind: LimitRange
metadata:
  name: resource-limits
  namespace: my-namespace
spec:
  limits:
  - type: Container
    default:
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:
      cpu: "100m"
      memory: "256Mi"
    max:
      cpu: "1"
      memory: "1Gi"
    min:
      cpu: "50m"
      memory: "128Mi"
Enter fullscreen mode Exit fullscreen mode
  • default: If no resource limits are specified, these values are applied.

  • defaultRequest: The minimum resources a container will request.

  • max and min: The upper and lower bounds for resource usage.

Apply the LimitRange:

kubectl apply -f limitrange.yaml
Enter fullscreen mode Exit fullscreen mode

Now, any pod in the my-namespace namespace will be bound by these limits.


2. ResourceQuota in Action

Next, letโ€™s create a ResourceQuota to limit the total resources in a namespace.

apiVersion: v1
kind: ResourceQuota
metadata:
  name: namespace-quota
  namespace: my-namespace
spec:
  hard:
    requests.cpu: "2"
    requests.memory: "2Gi"
    limits.cpu: "4"
    limits.memory: "4Gi"
    pods: "10"
    services: "5"
    secrets: "10"
Enter fullscreen mode Exit fullscreen mode
  • requests.cpu/memory: Total requested CPU and memory.

  • limits.cpu/memory: Total limit for CPU and memory.

  • pods/services/secrets: Limits the number of these objects in the namespace.

Apply the ResourceQuota:

kubectl apply -f resourcequota.yaml
Enter fullscreen mode Exit fullscreen mode

Now, the my-namespace namespace is capped at the specified resource limits.


๐Ÿงฉ Combining LimitRange and ResourceQuota

When used together, LimitRange and ResourceQuota provide a robust resource management framework:

  • LimitRange ensures individual pods donโ€™t exceed resource bounds.

  • ResourceQuota ensures the namespace as a whole stays within its budget.

For example, if a namespace has a ResourceQuota of 2 CPU and a LimitRange with a max CPU of 1 per pod, you canโ€™t create more than 2 pods with the maximum CPU limit.


๐Ÿš€ Real-World Use Case: Multi-Tenant Clusters

Imagine a SaaS platform where each customer gets a dedicated namespace. Without LimitRange and ResourceQuota, one customerโ€™s misconfigured application could consume all cluster resources, affecting others. By enforcing resource limits and quotas, you ensure fair usage and isolate performance issues.


๐ŸŽฏ Key Takeaways

  • LimitRange enforces resource limits at the pod/container level.

  • ResourceQuota governs resource usage at the namespace level.

  • Together, they ensure fair resource allocation, cost optimization, and cluster stability.

  • Use them to tame resource chaos and build reliable, multi-tenant Kubernetes clusters.

Top comments (0)