필자는 kubernetes 왕초보이고, 하나하나 모르는 게 나올 때마다 기록해가며 공부할 예정이다.
QoS는 Quality of Service 의 약자이고, pod에 적용되는 단위로 볼 수 있다. container는 리소스를 할당받기 위한 request 와 limit 값을 설정하고, 리소스의 Scheduling은 limit이 아니라 request에 따라 좌우된다.
Pod를 위한 리소스 정의
CPU
(v)Core와 같으며, 0.5 core 혹은 500m 와 같이 표현된다.
Memory
byte로 표현된다.
request와 limit 그리고 QoS Classes 는 강한 연관관계를 가진다.
리소스가 compressible 한지 incompressible 한지에 따라 request와 limit이 강제된다고 한다. 그게 뭔지 알아보자.
Compressible 한 리소스
CPU 자원이 해당된다. Pod가 limit을 넘기면 throttle되지만, limit을 정의하지 않은 경우는 CPU를 초과해서 사용할 수 있다.(가능한 경우라면)
Incompressible 한 리소스
Memory 자원이 해당된다. Pod는 request한 메모리 자원을 할당받으며, request를 초과할 경우 pod는 kill될 수 있다.(다른 pod들이 memory자원을 필요로 한다면) pod가 request한 것보다 적게 memory자원을 사용한다면, kill되지 않는다.
pod가 limit보다 많은 memory자원을 사용한다면, pod에 포함된 container중에서 가장 많은 memory를 사용하는 process가 kernel에 의해 kill될 것이다.
시스템이 CPU나 memory 자원을 전부 고갈되는 상황이라면,(limit의 총합 > machine capacity) 이상적으로는, kubernetes는 덜 중요한 container를 kill하려 할 것이다.
Guaranteed (QoS)
Pod는 top-priority 로 여겨지며, limit을 넘지 않는 한 kill되지 않음이 보장된다.
모든 container의 모든 리소스에 대해 limit와 request 값이 같다면, Guaranteed 로 여겨진다.
Burstable (QoS)
Pod는 최소한의 리소스 보장을 받지만, 필요한 경우 더 많은 리소스를 할당받을 수 있다. 시스템 메모리가 부족한 경우라면, 이들 container들은 request를 초과해서 사용하고, 다른 Best-Effort pod가 없다면, kill될 것이다.
한 개 이상의 container들에 대해 limit와 request가 같지 않다면, Burstable로 설정된다. limit이 정의되지 않았다면, node capacity가 default로 설정된다.
Best-Effort (QoS)
Pod는 가장 낮은 priority를 가진다. 시스템의 메모리가 고갈될 경우 이들 pod들에 포함되는 process들이 kill될 것이다. 이들 container들은 node의 free memory를 양껏 사용할 수 있다.
pod내 모든 container들, 모든 리소스에 대해 request와 limit이 정의되지 않는다면, Best-Effort로 설정된다.