Skip to main content

ResourceQuota

When several users or teams share a cluster with a fixed number of nodes, there is a concern that one team could use more than its fair share of resources Resource quotas are a tool for administrators to address this concern.

A resource quota, defined by a ResourceQuota object, provides constraints that limit aggregate resource consumption per namespace. It can limit the quantity of objects that can be created in a namespace by type, as well as the total amount of compute resources that may be consumed by resources in that namespace.

Compute Resource Quotas

These limits control how much CPU and memory can be allocated to pods in a namespace.

Let's create file resource_quota.yaml and put this following configuration.

apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: limited
spec:
hard:
requests.cpu: "1"
requests.memory: "2Gi"
limits.cpu: "2"
limits.memory: "4Gi"
  • request.cpu: Maximum total CPU requested across all pods in this namespace cannot exceed more than 1 core.
  • request.memory: Maximum total memory requested across all pods in this namespace cannot exceed more than 2GB.
  • limits.cpu: Maximum total CPU usage of all pods combined in this namespace cannot exceed more than 2 cores.
  • limits.memory: Maximum total memory usage of all pods combined in this namespace cannot exceed more than 4GB.

Apply and Validate

Let's apply the configuration file using kubectl apply command.

➜ kubectl apply -f resource_quota.yaml 
resourcequota/compute-quota created

We can validate it using kubectl describe quota in the specific namespace like this.

➜ kubectl -n limited describe quota
Name: compute-quota
Namespace: limited
Resource Used Hard
-------- ---- ----
limits.cpu 0 2
limits.memory 0 4Gi
requests.cpu 0 1
requests.memory 0 2Gi

Storage Resource Quotas

These quotas limit how much storage (Persistent Volumes) can be created in a namespace.

Add few more line to our configuration file before in the spec.hard section to define the storage limit.

requests.storage: "64Gi"
persistentvolumeclaims: "10"
  • requests.storage: The total storage requested by PVC in this namespace cannot exceed 64GB.
  • persistentvolumeclaims: The total number of PVC in this namespace cannot exceed 10.

Apply and Validate

Let's apply our configuration file and validate.

➜ kubectl apply -f resource_quota.yaml
resourcequota/compute-quota configured
➜ kubectl -n limited describe quota   
Name: compute-quota
Namespace: limited
Resource Used Hard
-------- ---- ----
limits.cpu 0 2
limits.memory 0 4Gi
persistentvolumeclaims 0 10
requests.cpu 0 1
requests.memory 0 2Gi
requests.storage 0 64Gi

Object Count Quotas

These quotas limit the number of objects (Pods, Services, ConfigMaps, etc.) a namespace can have.

Add few more line to our configuration file before in the spec.hard section to define pods, services, secrets, and configmaps limit.

pods: "5"
services: "2"
secrets: "2"
configmaps: "2"
  • pods: The total number of Pods in a non-terminal state in this namespace cannot exceed 5. A pod is in a terminal state if .status.phase in (Failed, Succeeded) is true.
  • services: The total number of services in this namespace cannot exceed 2.
  • secrets: The total number of secrets in this namespace cannot exceed 2.
  • configmaps: The total number of configmaps in this namespace cannot exceed 2.

Apply and Validate

Again, lets apply our configuration and validate.

➜ kubectl apply -f resource_quota.yaml
➜ kubectl -n limited describe quota   
Name: compute-quota
Namespace: limited
Resource Used Hard
-------- ---- ----
configmaps 1 2
limits.cpu 0 2
limits.memory 0 4Gi
persistentvolumeclaims 0 10
pods 0 5
requests.cpu 0 1
requests.memory 0 2Gi
requests.storage 0 64Gi
secrets 0 2
services 0 2

We can see all of the resource limit that we just created. This will ensure this namespace resource will not exceed our defined limit.

What Happened if Limit Exceeded?

  • If creating or updating a resource violates a quota constraint, the request will fail with HTTP status code 403 FORBIDDEN with a message explaining the constraint that would have been violated.

  • If quotas are enabled in a namespace for compute resources like cpu and memory, users must specify requests or limits for those values; otherwise, the quota system may reject pod creation.

  • We can use LimitRange to enforce default request and limit for compute resource.

References