TIL

Resource Management for Pods and Containers

Requests and Limits

구분 결정 주체 동작
request kube-scheduler Pod을 어느 노드에 배치할지 결정하는 기준. kubelet이 해당 양을 컨테이너에 예약
limit kubelet + 커널(cgroup) 컨테이너가 사용할 수 있는 상한. 초과 시 throttle 또는 kill

CPU limit 동작

Memory limit 동작

Resource types

리소스 기본 단위 비고
cpu core 물리 코어 또는 vCPU
memory Bytes  
ephemeral-storage Bytes 노드 로컬 임시 스토리지
hugepages-<size> Bytes Linux 전용. overcommit 불가

리소스 단위

CPU

Memory

컨테이너·Pod 리소스 선언

spec:
  containers:
  - name: app
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

Pod-level resource (alpha — PodLevelResources feature gate)

스케줄링

Limits·Requests의 런타임 적용 방식

항목 적용 방식
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가 재시작

컨테이너 리소스 리사이징

In-place resize (feature gate InPlacePodVerticalScaling)

교체 Pod 발사(replacement) 방식

모니터링

Memory-backed emptyDir 주의사항

Local ephemeral storage

Extended resources

리소스 등록 (advertise)

# 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

리소스 소비 (consume)

resources:
  requests:
    cpu: 2
    example.com/foo: 1
  limits:
    example.com/foo: 1    # request와 동일해야 함

PID limiting

Troubleshooting

Pod이 FailedScheduling으로 pending

필드 의미
Capacity 노드의 물리 총량
Allocatable Pod이 실제 쓸 수 있는 양 — 시스템 데몬 몫을 뺀 값이라 Capacity보다 작음

컨테이너가 종료됨 (terminated)

Last State:     Terminated
  Reason:       OOMKilled    # memory limit 초과로 커널이 kill
  Exit Code:    137          # 128 + SIGKILL(9)
Restart Count:  5            # 지금까지 5번 재시작됨