📦 Kubernetes ResourceQuota 완전 정리 (Namespace 리소스 제한)

2026. 2. 21. 14:38k8s

Kubernetes를 운영하다 보면 이런 문제가 생긴다.

  • 한 팀이 Pod를 수십 개 생성
  • PVC를 무제한 생성
  • CPU/Memory를 독점
  • 클러스터 전체가 불안정해짐

이걸 막기 위한 기능이 바로 ResourceQuota다.


🔎 ResourceQuota란?

Namespace 단위로 사용할 수 있는 리소스 총량을 제한하는 정책

즉,

“이 네임스페이스는 CPU 4core 이상 못 써.”
“Pod 10개 이상 못 만들어.”

라고 상한선을 걸어주는 기능이다.


🏗 적용 범위

Cluster
 ├── namespace: dev
 │     └── ResourceQuota
 ├── namespace: prod
 │     └── ResourceQuota

✔ Namespace 단위 적용
✖ Cluster 전체 직접 적용 아님

멀티테넌트 환경에서 필수 기능이다.


🛠 기본 예제

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: dev
spec:
  hard:
    pods: "10"
    requests.cpu: "4"
    requests.memory: 8Gi
    limits.cpu: "8"
    limits.memory: 16Gi

의미

항목 설명
pods Pod 최대 10개
requests.cpu 요청 CPU 총합 4core
requests.memory 요청 메모리 총합 8Gi
limits.cpu 제한 CPU 총합 8core
limits.memory 제한 메모리 총합 16Gi

⚙ requests vs limits 차이

구분 의미
requests 스케줄러 기준
limits 컨테이너 런타임 상한

Kubernetes는 requests 기준으로 스케줄링한다.

운영 환경에서는 반드시 requests 제한을 걸어야 한다.


🧪 kubectl로 생성하는 방법

kubectl create quota myrq \
  --hard=cpu=1,memory=1Gi,pods=2 \
  -n test

여기서:

  • cpu → requests.cpu 의미
  • memory → requests.memory 의미

📊 현재 quota 확인

kubectl get quota -n test

예시 출력:

NAME   REQUEST                             LIMIT
myrq   cpu: 0/1, memory: 0/1Gi, pods: 1/2

의미:

  • Pod 1개 사용 중
  • CPU 1core까지 가능
  • 메모리 1Gi까지 가능

🚫 quota 초과 시 발생하는 에러

Pod 생성 시 제한을 넘으면:

Error from server (Forbidden): exceeded quota

즉, 생성 자체가 차단된다.


📦 제한 가능한 리소스 종류

🔹 Compute

  • pods
  • requests.cpu
  • limits.cpu
  • requests.memory
  • limits.memory

🔹 Storage

  • persistentvolumeclaims
  • requests.storage

🔹 Object 개수 제한

  • configmaps
  • secrets
  • services
  • deployments
  • jobs

📏 G vs Gi 차이 (중요)

단위 의미
G 10^9 (1,000,000,000 bytes)
Gi 2^30 (1,073,741,824 bytes)

운영에서는 Gi 사용 권장 (메모리는 2진법 기준이기 때문)


🔥 ResourceQuota + LimitRange 차이

기능 역할
ResourceQuota Namespace 전체 총량 제한
LimitRange Pod/Container 단위 최소/최대 제한

보통 둘을 같이 사용한다.

예:

  • Namespace 전체 CPU 8core
  • 컨테이너 하나당 CPU 최대 2core

🏢 온프렘 운영자 관점에서의 활용 전략

1️⃣ 테넌트별 Namespace 분리

tenant-a
tenant-b
tenant-c

각각 quota 설정


2️⃣ PVC 무한 생성 방지

persistentvolumeclaims: "5"
requests.storage: 200Gi

3️⃣ GPU 노드 제한

requests.nvidia.com/gpu: "2"

🎯 운영 Best Practice

✔ requests는 반드시 제한
✔ limits도 같이 설정
✔ PVC 개수도 제한
✔ Gi 단위 사용
✔ LimitRange와 병행


🏁 핵심 정리

ResourceQuota는

  • Namespace 보호 장치
  • 멀티테넌트 필수 기능
  • 실수 방지용 안전망
  • 운영 안정성의 핵심 요소

클러스터를 “공유 인프라”로 운영한다면 반드시 설정해야 한다.