K8s QoS 클래스
정의 (Definition)
Kubernetes의 QoS(Quality of Service) 클래스는 파드를 request/limit 설정 패턴으로 분류 한 결과이며, 주로 노드 압박 상황에서 어떤 파드가 먼저 축출/종료될지 에 영향을 주는 “생존 우선순위”입니다.
문제가 되는 배경 (Problem Context)
평상시에는 파드가 같은 노드에 공존할 수 있지만, 노드가 메모리 압박에 빠지면 누군가는 희생되어야 합니다. 이때 무작위 OOM이 아니라, 운영자가 의도한 중요도(리소스 보장 의지)를 반영한 우선순위가 필요합니다.
핵심 메커니즘 (How it Works)
QoS는 컨테이너들의 request/limit 조합으로 결정됩니다.
| QoS | 조건(요약) | 압박 시 생존 우선순위(일반적) |
|---|---|---|
| Guaranteed | 모든 컨테이너에 request/limit가 있고, CPU/메모리 각각 request=limit | 높음 |
| Burstable | request는 있으나 Guaranteed 조건을 만족하지 않음 | 중간 |
| BestEffort | request/limit가 없음 | 낮음 |
노드 압박이 오면 kubelet은 eviction을 통해 노드를 보호하며, QoS는 그 과정(및 커널 OOM score 조정)에 영향을 줍니다.
불변 조건과 보장 범위 (Invariants & Guarantees)
- 보장: QoS는 request/limit 설정으로 결정됩니다(런타임에서 임의로 바꿀 수 있는 값이 아님).
- 비보장: Guaranteed라고 해서 “절대 죽지 않는다”는 보장은 없습니다(자기 limit 초과 OOM, 노드 장애 등).
비유 (Analogy)
침몰하는 배에서 구명보트가 부족할 때, “티켓(리소스 보장 의지)”을 명확히 산 사람(Guaranteed)이 먼저 보호되고, 무임승차(BestEffort)가 먼저 내리게 되는 상황에 가깝습니다.
실무적 함의 (Operational Implications)
- 죽으면 안 되는 핵심 서비스는 QoS 목표(예: Guaranteed) 부터 정하고, 그에 맞게 request/limit 구조를 설계해야 합니다.
- QoS는 “평상시 성능 차등”보다 “압박 시 장애 반경”에 더 직접적인 영향을 줍니다.
주의사항 / 오해 (Pitfalls & Misconceptions)
- QoS는 스케줄러의 노드 선택을 직접 바꾸지 않습니다. 스케줄링은 주로 request 총량과 제약(affinity/taint 등)으로 결정됩니다.
- Guaranteed를 만들기 위해 CPU limit까지 강제하면, 일부 워크로드에서는 CPU throttling에 따른 지연이 악화될 수 있습니다(트레이드오프). (관련: K8s CPU와 메모리 Limit 정책)
References
- Kubernetes Docs: Pod Quality of Service Classes
- Related Note: K8s 파드 축출(Eviction) 정책
- Related Note: K8s 메모리 request와 limit 설정