k8s QoS Class
개념
k8s에서 pod에는 QoS Class라는 것이 있다.
Qos는 Quality of Service의 약자로서 서비스 품질이라는 뜻이며, k8s에서 pod의 스케줄링과 제거 우선순위를 판단하는데 사용되는 값이다.
종류는 세 가지뿐이다.
- Guaranteed
- Burstable
- Best-Effort
동작 방식
노드에 가용 리소스가 부족해지면 누군가는 희생되어야 한다.
이 때, k8s 스케줄러는 QoS Class를 보고 어떤 pod를 희생시킬지 판단한다.
kubelet은 Best-Effort를 가장 먼저 종료 시키고, Best-Effort가 없다면 Burstable을 강제 종료 시킨다.
간단히 설명하면 위와 같지만 정확히 설명하자면,
QoS Class를 보고 판단하다기 보다는 QoS Class에 의해 정해지는 oom_score_adj라는 값에 의해 희생되는 것이다.
자세한 설명을 보고싶다면 더보기를 클릭!
OS 커널에서 동작하는 OOM killer는 메모리를 상한치 이상으로 사용하는 프로세스를 종료시키는 역할을 한다.
OOM killer는 oom_score의 값에 우선순위를 두어 프로세스를 희생시키는데, 이 oom_score를 산출하는데 재료로 쓰이는 것이 oom_score_adj이다.
kubelet이 container를 기동시킬 때 아래에 적혀있는 oom_score_adj 값을 부여한다.
const (
// KubeletOOMScoreAdj is the OOM score adjustment for Kubelet
KubeletOOMScoreAdj int = -999
// KubeProxyOOMScoreAdj is the OOM score adjustment for kube-proxy
KubeProxyOOMScoreAdj int = -999
guaranteedOOMScoreAdj int = -998
besteffortOOMScoreAdj int = 1000
)
보다시피 guaranteed는 -998, besteffort는 1000의 상수값으로 고정돼있음을 확인할 수 있다.
(숫자가 클수록 먼저 희생된다.)
여기서 한 가지 의문이 들 수있다.
그럼 CPU는?
이를 이해하기 위해서는 k8s가 리소스를 분류하는 기준을 알아야한다.
k8s에서는 리소스를 compressible(압축 가능한) 리소스와 incompressible(압축 불가능한) 리소스로 구분한다.
compressible 리소스는 노드에 가용자원만 있다면 pod의 한계치를 넘어서라도 사용할 수 있는 리소스를 말한다. 현재 k8s에서 compressible 리소스는 cpu다.
incompressible 리소스는 compressible 리소스와는 반대로 한계치를 넘으면 해당 리소스를 가장 많이 사용하는 컨테이너를 종료 시키거나, 한계치를 넘지 않더라도 다른 중요한 파드를 위해서 다른 파드를 종료시킬 수도 있는 리소스를 말한다. k8s에서 incompressible 리소스는 memory다.
즉, incompressible한 리소스에 대해서만 컨테이너의 희생여부를 결정하기 때문에, cpu가 아닌 memory 기준으로만 판단하는 것이다.
생성 방법 및 특징
Guaranteed
생성 방법
모든 컨테이너의 cpu/memory requests값과 limits값을 동일하게 설정
특징
노드의 자원이 부족해지면 다른 pod을 종료시키고 실행을 보장받는 최우선순위의 클래스
k8s 스케줄러가 가용 자원이 확실한 곳에 배치 시켜줌
Burstable
생성 방법
guaranteed의 생성 조건은 만족하지 않으면서 cpu/memory의 requests값 혹은 limits값을 설정
즉, 설정은 돼있지만 requests != limits 인 형태 (혹은 한쪽이 설정 안돼있어도 가능)
특징
Guaranteed-와 Best-Effort의 사이로서, 노드 메모리가 부족해지면 종료될 가능성이 있음
가용 자원이 충분하지 않은 노드에 배치가 될 수도 있음
Best-Effort
생성 방법
모든 컨테이너의 cpu/memory requests값과 limits값을 전부 설정하지 않음
특징
노드에 가용 메모리가 있다면 마음대로 사용할 수 있지만, 노드의 메모리가 부족해지면 가장 먼저 종료됨
가용 자원이 충분하지 않은 노드에 배치가 될 수도 있음
참고 사이트
https://kubernetes.io/ko/docs/tasks/configure-pod-container/quality-service-pod/
https://engineering.linecorp.com/ko/blog/prometheus-container-kubernetes-cluster/
https://medium.com/blutv/qos-classes-of-k8s-pods-722238a61c93