| 구분 | 결정 주체 | 동작 |
|---|---|---|
| request | kube-scheduler | Pod을 어느 노드에 배치할지 결정하는 기준. kubelet이 해당 양을 컨테이너에 예약 |
| limit | kubelet + 커널(cgroup) | 컨테이너가 사용할 수 있는 상한. 초과 시 throttle 또는 kill |
| 리소스 | 기본 단위 | 비고 |
|---|---|---|
cpu |
core | 물리 코어 또는 vCPU |
memory |
Bytes | |
ephemeral-storage |
Bytes | 노드 로컬 임시 스토리지 |
hugepages-<size> |
Bytes | Linux 전용. overcommit 불가 |
1 = 1 물리 코어 / 1 vCPU — 소수점 허용 (0.5 = 500m)100m = 0.1 CPU. 최소 정밀도 1m500m은 같은 양E P T G M k (10진) / Ei Pi Ti Gi Mi Ki (2진)M(메가바이트) ≠ m(밀리바이트). 400m = 0.4 bytes → 의도한 건 대부분 400Mispec.containers[].resources.requests / .limits에 cpu·memory·ephemeral-storage·hugepages 지정spec:
containers:
- name: app
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
PodLevelResources feature gate)spec.resources로 CPU·Memory 예산을 통째로 선언 가능| 항목 | 적용 방식 |
|---|---|
| CPU limit | cgroup의 hard ceiling. 스케줄링 슬라이스마다 한도 초과 여부 확인 → 초과 시 cgroup 실행 대기 |
| CPU request | 경합 시 가중치(weight)로 작용 — request가 큰 컨테이너가 더 많은 CPU 시간 할당받음 |
| Memory request | 주로 스케줄링용. cgroup v2 노드에선 런타임이 memory.min·memory.low 힌트로 활용 가능 |
| Memory limit | cgroup memory limit. 초과 시 커널 OOM이 컨테이너 내 프로세스를 kill. PID 1이 죽고 restartable이면 K8s가 재시작 |
emptyDir 같은 메모리 볼륨에도 적용됨 — kubelet이 tmpfs emptyDir을 컨테이너 메모리 사용량으로 계산InPlacePodVerticalScaling)/resize 서브리소스로 업데이트resizePolicy 필드로 — 변경 시 컨테이너 재시작이 필요한지 제어 가능status에 리소스 사용량 보고emptyDir 주의사항sizeLimit을 지정하지 않으면 — emptyDir 볼륨이 Pod의 memory limit까지 소비 가능ResourceQuota / LimitRange / ValidatingAdmissionPolicy로 namespace·Pod 단위 제한 적용ephemeral-storage 리소스로 request/limit 가능emptyDir 볼륨/var/log/pods 하위)/etc/hosts)kubernetes.io 도메인 밖의 fully-qualified 리소스 이름 — 클러스터 운영자가 빌트인이 아닌 리소스(예: GPU, 커스텀 디바이스)를 노출하고 사용자가 소비status.capacity에 PATCH 요청으로 수량 직접 등록
status.allocatable을 비동기로 자동 갱신 → 스케줄러는 allocatable 값을 보므로 등록 직후 짧은 지연 발생 가능# status.capacity에 example.com/foo 5개 등록. ~1은 path 안에서 '/'의 인코딩
curl --header "Content-Type: application/json-patch+json" --request PATCH \
--data '[{"op": "add", "path": "/status/capacity/example.com~1foo", "value": "5"}]' \
http://k8s-master:8080/api/v1/nodes/k8s-node-1/status
ignoredByScheduler: true로 두면 스케줄러의 PodFitsResources 검사에서 제외extendedResourceName을 지정하면, 그 클래스에 맞는 디바이스를 Pod의 extended resource request로 요청 가능3, 3000m, 3Ki / 무효: 0.5, 1500m → 1.5가 되므로)limits에만 명시PENDING 유지resources:
requests:
cpu: 2
example.com/foo: 1
limits:
example.com/foo: 1 # request와 동일해야 함
FailedScheduling으로 pendingkubectl describe pod <name> Events에서 원인 확인 (예: 0/42 nodes available: insufficient cpu)cpu: 1인데 Pod이 cpu: 1.1이면 영원히 스케줄 불가kubectl describe nodes <name>로 capacity·할당량 확인| 필드 | 의미 |
|---|---|
Capacity |
노드의 물리 총량 |
Allocatable |
Pod이 실제 쓸 수 있는 양 — 시스템 데몬 몫을 뺀 값이라 Capacity보다 작음 |
Allocatable 기준으로 판단 — 이미 할당된 request 합을 빼고 남는 양에 Pod request가 들어가야 배치됨ResourceQuota로 namespace 단위 총량을 제한 가능 — 단, namespace 쓰기 권한을 가진 사람은 ResourceQuota 자체도 지울 수 있으니 접근 권한도 함께 관리kubectl describe pod <name>로 확인Last State: Terminated
Reason: OOMKilled # memory limit 초과로 커널이 kill
Exit Code: 137 # 128 + SIGKILL(9)
Restart Count: 5 # 지금까지 5번 재시작됨
OOMKilled — 컨테이너가 memory limit보다 많이 쓰려고 했다는 의미