K8s Resource Model

1. 정의 (Definition)

Kubernetes Resource Model은 컨테이너가 필요로 하는 컴퓨팅 자원(CPU, Memory)을 **Requests(요청)**와 **Limits(제한)**이라는 두 가지 속성으로 추상화하여 관리하는 모델입니다.

  • Requests: 컨테이너 실행에 필요한 최소 보장 자원량 (Scheduling 기준)
  • Limits: 컨테이너가 사용할 수 있는 최대 자원량 (Throttling/Killing 기준)

2. 등장 배경 (Problem Context)

  • 문제: 물리 서버 환경에서는 애플리케이션 간 자원 격리가 어려워, 하나의 “Bad Neighbor”가 서버 전체의 CPU/메모리를 점유하면 다른 애플리케이션이 굶어 죽는(Starvation) 현상이 발생했습니다.
  • 해결: Kubernetes는 컨테이너별로 “최소한 이만큼은 보장해줘(Requests)“와 “아무리 많이 써도 이 이상은 안 돼(Limits)“를 명시적으로 선언하게 하여, 예측 가능한 성능자원 격리를 동시에 달성했습니다.

3. 핵심 메커니즘 (How it Works)

3.1. 자원의 분류

이 모델은 자원의 성격에 따라 관리 방식이 다릅니다.

  1. Compressible Resource (압축 가능 자원): CPU. 한도를 초과하면 사용량을 억제(Throttling)하여 성능을 낮춥니다. 죽지 않습니다.
  2. Incompressible Resource (압축 불가능 자원): Memory. 한도를 초과하면 공간을 확보하기 위해 프로세스를 강제 종료(OOM Kill)합니다.

3.2. 동작 방식

  • 스케줄러 (Scheduler): 오직 Requests 값만 보고 노드를 배정합니다. Limits는 보지 않습니다.
  • Cgroups (Control Groups): 리눅스 커널의 Cgroups 기능을 이용해 실제 자원 사용을 제한합니다.
    • CPU Requests: cpu.shares (가중치 기반 배분)
    • CPU Limits: cpu.cfs_quota_us (절대적 사용량 제한)
    • Memory Limits: memory.limit_in_bytes (초과 시 OOM)

4. 불변 조건과 보장 범위 (Invariants & Guarantees)

  • Requests 보장: 노드에 가용 자원이 Requests의 총합보다 적으면 파드는 스케줄링되지 않습니다(Pending 상태). 일단 스케줄링되면 해당 양만큼은 물리적으로 보장됩니다.
  • Limits 상한: 컨테이너는 어떤 경우에도 설정된 Limits를 초과하여 자원을 점유할 수 없습니다.

5. 비유 (Analogy)

호텔 예약 시스템에 비유할 수 있습니다.

  • Node: 호텔 건물
  • Requests (예약 보증금): “방 하나 확실히 잡아주세요.” 호텔은 빈방(가용 자원)이 있어야만 손님을 받습니다.
  • Limits (객실 정원): “이 방에는 최대 2명까지만 들어갈 수 있습니다.” 정원을 초과하면 퇴실 조치(OOM Kill) 당하거나 제지(Throttling) 당합니다.

6. 실무적 함의 (Operational Implications)

  • OOMKilled: 파드가 memory limit을 초과했습니다. 메모리 누수(Leak)가 있거나 Limit 설정이 너무 낮습니다.
  • CPU Throttling: 파드가 cpu limit에 도달했습니다. 응답 속도가 느려질 수 있습니다.
  • Pending: 노드에 남은 자원(Allocatable)보다 파드의 requests가 큽니다. Cluster Autoscaler가 필요하거나 requests를 줄여야 합니다.

7. 주의사항 / 오해 (Pitfalls & Misconceptions)

  • “Limits를 설정 안 하면 무제한이다?”: 맞습니다. 하지만 노드 전체 자원을 혼자 독점하다가 노드 자체를 불안정하게 만들 수 있습니다. (Namespace 레벨의 LimitRange로 방어 필요)
  • “Requests는 실제 사용량이다?”: 아닙니다. Requests는 예약된 양입니다. 실제로는 아무것도 안 하고 있어도, 스케줄러는 그만큼 자원이 사용 중이라고 간주합니다.

8. References

References