📦 Kubernetes ResourceQuota 완전 정리 (Namespace 리소스 제한)
2026. 2. 21. 14:38ㆍk8s
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 보호 장치
- 멀티테넌트 필수 기능
- 실수 방지용 안전망
- 운영 안정성의 핵심 요소
클러스터를 “공유 인프라”로 운영한다면 반드시 설정해야 한다.
'k8s' 카테고리의 다른 글
| 🔍 kubectl run에서 sh가 필요할 때와 필요 없는 이유 (0) | 2026.02.21 |
|---|---|
| 🔄 Kubernetes Pod 이미지 변경 시 컨테이너 재시작 동작 이해하기 (0) | 2026.02.21 |
| Grafana에서 Minecraft 로그를 INFO/WARN/ERROR로 분리하기 (Data Stream + Pipeline + Kafka Connect) (0) | 2026.02.14 |
| Grafana+Metricbeat 대시보드 구성과 디스크 사용량 불일치 해결 정리 (0) | 2026.02.14 |
| Grafana에서 겪었던 이슈 정리 (0) | 2026.02.12 |