ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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에 할당하게 된다.

    1. Guaranteed
    2. Burstable
    3. 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/

    https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/#if-you-do-not-specify-a-memory-limit

    https://kubernetes.io/docs/tasks/configure-pod-container/assign-cpu-resource/#if-you-do-not-specify-a-cpu-limit

    '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
Designed by Tistory.