Kubernetes/삽질

[dcgm-exporter] Grafana/Prometheus no data 현상

비번변경 2022. 7. 13. 23:36

현상

관리하던 쿠버네티스 클러스터에서 Grafana/Prometheus 서비스를 위한 kube-prometheus-stack helm chart를 설치하고 GPU 서버 모니터링을 위해 dcgm-exporter를 함께 설치해서 사용하고 있었다. 다만 최근 몇 가지 이슈가 있어 기존의 kube-prometheus-stack을 완전히 삭제하고 재설치했더니 dcgm-exporter 대시보드에 어떤 메트릭도 보이지 않았다.

Grafana No data
예시 이미지

프로메테우스에서 관련 메트릭을 수집하는지 확인해봤지만, 마찬가지로 dcgm-exporter가 내보내는 메트릭은 수집되지 않는 상태였다.

 

 

환경

환경은 아래와 같다.

  • kubeadm으로 구성한 온프레미스 쿠버네티스 클러스터
  • kubernetes version 1.17.2 ~ 1.19.0
  • helm v3.1.2
  • kube-prometheus-stack-1.11.3
    => alert 설정, grafana persistence, ingress 활성화, prometheus storageSpec, ingress 활성화
  • dcgm-exporter 2.6.1

dcgm-exporter 공식 문서에 쿠버네티스 환경에 dcgm-exporter 설치 시 helm을 통해 설치하도록 안내되어 있으나, 현재 환경에는 아래 2개 파일을 수동으로 apply 하여 설치되어 있었다.

https://github.com/NVIDIA/dcgm-exporter/blob/main/dcgm-exporter.yaml

https://github.com/NVIDIA/dcgm-exporter/blob/main/service-monitor.yaml

 

 

임시 조치 1.

dcgm-exporter 설치 당시 문서를 찾아보았는데, 아래와 같이 조치한 흔적이 있었다.

 

1. 프로메테우스 리소스 확인

kubectl get prometheus

프로메테우스 리소스 확인

 

2. 리소스에서 serviceMonitorSelector 삭제

kubectl edit prometheus <kube-prometheus-st-prometheus>


# 수정 참고
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
... 중략 ...
spec:
... 중략 ...
  serviceMonitorSelector: # 삭제
    matchLabels: # 삭제
      release: <release_name> # 삭제

 

그러나 조치 후에 도리어 정상적으로 수집되던 다른 메트릭조차 수집되지 않는 현상을 확인하여 설정을 원복했다.

 

 

임시 조치 2.

serviceMonitorSelector 설정을 원복 한 후, 기본 메트릭 수집이 정상화되어 확인해보니 다른 서비스 모니터 리소스에는 릴리스 이름으로 label이 설정되어 있었다.

kubectl get servicemonitors.monitoring.coreos.com --show-labels

서비스모니터 레이블 확인

별도로 설치한 dcgm-exporter에만 레이블이 설정되어 있지 않는 것을 볼 수 있다.

 

확인해보니 prometheus 리소스는 prometheus deployment의 원하는 상태를 선언한 것이며, serviceMonitor는 프로메테우스가 모니터링하는 대상의 집합을 선언한 것이라고 한다.

prometheus와 serviceMonitor

그리고 prometheus 리소스는 serviceMonitorSelector 필드를 통해 사용할 serviceMonitor를 선택한다. 

따라서 임시로 아래와 같이 dcgm-exporoter servicemonitor에 label을 추가했다.

kubectl label servicemonitors.monitoring.coreos.com dcgm-exporter release=<release_name>

# 예시
kubectl label servicemonitors.monitoring.coreos.com dcgm-exporter release=prom

이후 잠시 대기하면 promtheus에서 dcgm-exporter가 내보내는 메트릭을 확인할 수 있다.

dcgm-exporter 메트릭

grafana 대시보드 상에서도 정상적으로 메트릭이 표시되는 것을 확인할 수 있다.

dcgm-exporter dashboard

단, dcgm-exporter가 kube-prometheus-stack을 통해 배포된 게 아니기 때문에 release label을 추가하는 건 좋은 방법이 아닌 것 같다.

 

조치. serviceMonitorSelectorNilUsesHelmValues를 false로 설정

nvidia 공식 문서에서 쿠버네티스에서 dcgm-exporter와 grafana, prometheus를 연동하는 방법을 안내하고 있다.

그중 프로메테우스 설정 부분을 보면 prometheusSpec.serviceMonitorSelectorNilUsesHelmValues 부분을 false로 수정하라고 안내되어 있다.

# If true, a nil or {} value for prometheus.prometheusSpec.serviceMonitorSelector will cause the
## prometheus resource to be created with selectors based on values in the helm deployment,
## which will also match the servicemonitors created
##
serviceMonitorSelectorNilUsesHelmValues: false

이 값이 True인 경우에는 helm release 이름을 기반으로 selector를 설정하여 prometheus 리소스를 생성하고 그에 맞춰 serviceMonitor를 생성한다고 한다.

반대로 false인 경우에는 selector 설정 없이 prometheus 리소스를 생성한다. serviceMonitor의 레이블은 True일 때와 동일하게 생성한다.

즉, ServiceMonitorSelector 설정이 없기 때문에 dcgm-exporter에 레이블을 별도로 설정하지 않아도 된다.

 

 

참고 문서

https://docs.nvidia.com/datacenter/cloud-native/gpu-telemetry/dcgm-exporter.html#gpu-telemetry

https://github.com/prometheus-operator/prometheus-operator/blob/main/Documentation/user-guides/getting-started.md