-
Kubernetes QoS란? (kube-prometheus-stack 설치로 살펴보는)TECH/Kubernetes 2023. 1. 19. 10:43
최근 kube-prometheus-stack을 설치한 후 prometheus 자체의 메모리 할당량을 살펴보려고 했는데, 이상하게 prometheus 컨테이너만 메트릭이 나타나지 않는 현상을 발견했다.
먼저 Kubernetes의 QoS가 뭔지 알아본 후 prometheus 메트릭이 나타나지 않은 이유를 살펴보자.
QoS Classes
Kubernetes는 QoS를 사용하여 Pod의 evicting과 scheduling을 결정한다. Kubernetes가 Pod를 생성하면 다음 세가지 중 하나의 QoS 클래스를 Pod에 할당하게 된다.
- Guaranteed
- Burstable
- BestEffort
Guaranteed
- 파드 내의 모든 컨테이너는 memory limit과 memory request를 가져야 한다.
- 파드 내의 모든 컨테이너는 memory limit이 memory request와 동일해야 한다.
- 파드 내의 모든 컨테이너는 CPU limit과 CPU request를 가져야 한다.
- 파드 내의 모든 컨테이너는 CPU limit과 CPU request가 동일해야 한다.
이 제한 사항은 init container와 app container에도 동일하게 적용된다.
Burstable
- 파드가 Qos Guaranteed의 조건을 만족하지 않는다.
- 파드 내의 최소 하나의 컨테이너가 memory 혹은 cpu request 혹은 limit을 갖는다.
BestEffort
- 파드 내의 컨테이너에 memory & cpu의 limit 와 request 모두 설정하지 않는다.
kube-prometheus-stack pod의 QoS
kube-prometheus-stack을 통해 설치된 Pod의 QoSClass를 확인해보자
kubectl get pods --output=custom-columns='NAME:.metadata.name,QOS:.status.qosClass' -n monitoring NAME QOS alertmanager-kube-prometheus-kube-prome-alertmanager-0 Burstable kube-prometheus-grafana-644df88695-tbtcg BestEffort kube-prometheus-kube-prome-operator-c8c977f5f-cck68 BestEffort kube-prometheus-kube-state-metrics-6d49ff5d7-2ssxk BestEffort kube-prometheus-prometheus-node-exporter-hmftx BestEffort prometheus-kube-prometheus-kube-prome-prometheus-0 Burstable
prometheus가 실행되고 있는 prometheus-kube-prometheus-kube-prome-prometheus-0 pod는 Burstable 로 설정되어 있다. 즉, 일부 컨테이너에만 resource limit과 request가 설정되어 있다.
파드를 자세하게 확인해보자.
Name: prometheus-kube-prometheus-kube-prome-prometheus-0 ... Init Containers: init-config-reloader: Container ID: docker://8865559e9bb479724a0376ddf473daf8d4b0d560a52e3acda0ff7df79edf20ed Image: quay.io/prometheus-operator/prometheus-config-reloader:v0.62.0 Image ID: docker-pullable://quay.io/prometheus-operator/prometheus-config-reloader@sha256:267b12235d10a810e49b2d40a3deda6256f92690b26997a199601a47283821b9 ... Limits: cpu: 200m memory: 50Mi Requests: cpu: 200m memory: 50Mi Containers: prometheus: Container ID: docker://b8fd650426210ae0f04a8664dc7ac93edf7e42ad1d92df2e4b264c2884dc3ea6 Image: quay.io/prometheus/prometheus:v2.41.0 Image ID: docker-pullable://quay.io/prometheus/prometheus@sha256:1a3e9a878e50cd339ae7cf5718fda08381dda2d4ccd28e94bbaa3190d1a566c2 ... config-reloader: Container ID: docker://56cde37494c0e0a5d6c0539cc2efee5e64200ff2c4f49065c462ca103c652edb Image: quay.io/prometheus-operator/prometheus-config-reloader:v0.62.0 Image ID: docker-pullable://quay.io/prometheus-operator/prometheus-config-reloader@sha256:267b12235d10a810e49b2d40a3deda6256f92690b26997a199601a47283821b9 ... Limits: cpu: 200m memory: 50Mi Requests: cpu: 200m memory: 50Mi ... QoS Class: Burstable
prometheus 컨테이너엔 어떠한 리소스에 대해서도 limit나 request가 설정되어 있지 않고, 이로 인해 이 Pod의 QoS는 Burstable이 된다. 그렇다면 프로메테우스 컨테이너처럼 아무런 리소스도 할당 받지 않은 컨테이너의 리소스는 어떻게 설정될까?
Memory limit을 지정하지 않은 경우
아래 상황 중 하나가 적영된다.
- 사용할 메모리의 상한선이 없을 경우 컨테이너는 실행되고 있는 노드의 사용가능한 메모리를 모두 사용하여 OOM Killer가 작동하게 될 가능성이 있다. 더 나아가, OOM kill의 경우 리소스 limit이 없는 컨테이너가 종료될 가능성이 더 높다.
- 기본 memory limit이 있는 네임스페이스 내에서 실행되고 있는 컨테이너의 경우 기본 limit을 자동으로 할당받는다. Cluster 관리자는 LimitRange를 사용하여 memory limit에 대한 기본 값을 지정할 수 있다.
CPU limit을 지정하지 않은 경우
컨테이너에 CPU limit을 지정하지 않은 경우 아래 상황 중 하나가 적용된다.
- 사용할 수 없는 CPU 리소스 상한이 없을 경우 실행되고 있는 노드의 모든 CPU 리소스를 사용하게 될 수 있다.
- 기본 CPU limit이 있는 네임스페이스에서 실행되는 컨테이너의 경우 기본 limit을 자동으로 할당받게 된다. Cluster 관리자는 LimitRange를 사용하여 CPU limit에 대한 기본 값을 지정할 수 있다.
kubectl describe ns monitoring Name: monitoring Labels: kubernetes.io/metadata.name=monitoring Annotations: <none> Status: Active No resource quota. No LimitRange resource.
프로메테우스가 실행되고 있는 네임스페이스에는 LimitRange 역시 설정되어 있지 않다. 따라서 리소스 상한이 존재하지 않는다.
이제 쿼리를 통해 prometheus-kube-prometheus-kube-prome-prometheus-0 pod내의 컨테이너 들의 리소스를 확인해보자.
Prometheus 컨테이너만 메트릭이 조회가 되지 않는 것을 확인할 수 있다.
참고 자료
https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/
'TECH > Kubernetes' 카테고리의 다른 글
Kubernetes - Pods (0) 2023.11.09 Local ephemeral storage (1) 2023.10.30 Namespaces 네임스페이스란? (0) 2022.11.04 Kubernetes Components - Control Plane (0) 2022.10.13 Custom Resource 커스텀 리소스란? (0) 2022.08.16