K8s em Exemplos: Resource Quotas

Resource Quotas limitam consumo agregado de recursos por namespace. Previnem que um único time consuma todos os recursos do cluster. Quotas aplicam a CPU, memória, storage e contagem de objetos. Use para: clusters multi-tenant, controle de custos, planejamento de capacidade, prevenir workloads descontrolados.

compute-quota.yaml

Quotas de compute limitam CPU e memória totais em um namespace. Tanto requests (recursos garantidos) quanto limits (recursos máximos) podem ser restringidos. Pods que excederiam a quota são rejeitados.

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: team-a
spec:
  hard:
    requests.cpu: "10"
    requests.memory: 20Gi
    limits.cpu: "20"
    limits.memory: 40Gi
object-count-quota.yaml

Quotas de contagem de objetos limitam número de recursos. Previna espalhamento de namespace com muitos Pods, Services ou ConfigMaps. Útil para limitar PersistentVolumeClaims para controlar custos de storage.

apiVersion: v1
kind: ResourceQuota
metadata:
  name: object-quota
  namespace: team-a
spec:
  hard:
    pods: "50"
    services: "10"
    configmaps: "20"
    secrets: "20"
    persistentvolumeclaims: "10"
    services.loadbalancers: "2"
    services.nodeports: "5"
storage-quota.yaml

Quotas de storage limitam storage total e número de claims. Podem ter escopo por StorageClass para permitir mais storage SSD que HDD, ou limitar tiers de storage caros.

apiVersion: v1
kind: ResourceQuota
metadata:
  name: storage-quota
  namespace: team-a
spec:
  hard:
    requests.storage: 100Gi
    persistentvolumeclaims: "10"
    fast-ssd.storageclass.storage.k8s.io/requests.storage: 20Gi
    fast-ssd.storageclass.storage.k8s.io/persistentvolumeclaims: "3"
scoped-quota.yaml

Quotas com escopo aplicam apenas a certos Pods. Use escopos para criar limites diferentes para QoS BestEffort vs Guaranteed, ou para Pods terminando vs de longa duração.

apiVersion: v1
kind: ResourceQuota
metadata:
  name: besteffort-quota
  namespace: team-a
spec:
  hard:
    pods: "10"
  scopes:
    - BestEffort
---
apiVersion: v1
kind: ResourceQuota
metadata:
  name: not-besteffort-quota
  namespace: team-a
spec:
  hard:
    pods: "40"
    requests.cpu: "10"
    requests.memory: 20Gi
  scopes:
    - NotBestEffort
limit-range.yaml

LimitRange define defaults e restrições por Pod/Container. Diferente de ResourceQuota (agregado do namespace), LimitRange aplica a recursos individuais. Use juntos: LimitRange para restrições por pod, ResourceQuota para totais do namespace.

apiVersion: v1
kind: LimitRange
metadata:
  name: resource-limits
  namespace: team-a
spec:
  limits:
    - type: Container
      default:
        cpu: "500m"
        memory: 256Mi
      defaultRequest:
        cpu: "100m"
        memory: 128Mi
      max:
        cpu: "2"
        memory: 2Gi
      min:
        cpu: "50m"
        memory: 64Mi
    - type: PersistentVolumeClaim
      max:
        storage: 10Gi
      min:
        storage: 1Gi
priority-quota.yaml

Quotas baseadas em prioridade limitam recursos por PriorityClass. Permita mais recursos para workloads críticos, menos para batch jobs. Aplique escopos de quotas a níveis de prioridade específicos.

apiVersion: v1
kind: ResourceQuota
metadata:
  name: high-priority-quota
  namespace: team-a
spec:
  hard:
    pods: "20"
    requests.cpu: "20"
    requests.memory: 40Gi
  scopeSelector:
    matchExpressions:
      - scopeName: PriorityClass
        operator: In
        values: ["high-priority", "critical"]
---
apiVersion: v1
kind: ResourceQuota
metadata:
  name: low-priority-quota
  namespace: team-a
spec:
  hard:
    pods: "50"
    requests.cpu: "5"
    requests.memory: 10Gi
  scopeSelector:
    matchExpressions:
      - scopeName: PriorityClass
        operator: In
        values: ["low-priority", "batch"]
terminal

Monitore uso de quota para rastrear consumo e planejar capacidade. A coluna Used mostra consumo atual; Hard mostra o limite. Alertas quando se aproximar dos limites ajudam a prevenir rejeições de workload.

$ kubectl describe resourcequota compute-quota -n team-a
Name:            compute-quota
Namespace:       team-a
Resource         Used    Hard
--------         ----    ----
limits.cpu       8       20
limits.memory    16Gi    40Gi
requests.cpu     4       10
requests.memory  8Gi     20Gi

$ kubectl get resourcequota -n team-a
NAME            AGE   REQUEST                      LIMIT
compute-quota   1d    requests.cpu: 4/10, ...      limits.cpu: 8/20, ...
object-quota    1d    pods: 25/50, services: 3/10

$ kubectl create deployment test --image=nginx -n team-a
error: failed to create deployment: exceeded quota

Índice | GitHub | Use as setas do teclado para navegar |