본문 바로가기
클라우드/Prometheus

[Helm] kube-prometheus-stack 모니터링 시스템 구축하기 (Grafana, exporter, monitoring)

by 정권이 내 2023. 7. 3.

[Helm] kube-prometheus-stack 모니터링 시스템 구축하기

 

쿠버네티스 기반의 클러스터 환경에서 가장 많이 사용되는 모니터링 오픈소스인 Prometheus는 파드, 컨테이너, 노드의 여러가지 메트릭 데이터들을 기반으로 시계열 데이터를 생성하여 Grafana 같은 Web UI를 이용해 볼수 있도록 해줍니다.

 

Prometheus를 설치하는 방법은 여러가지가 있지만 kube-prometheus-stack 에서 제공하는 Helm 방식의 설치방법이 가장 효율적이라고 생각해서 설치방법과 여러가지 유용한 설정 정보에 대해 알려드리려 합니다.

 

kube-prometheus-stack 설치하는 이유

Prometheus를 도커로 실행해되고 되고 바이너리 파일로 노드 상에 직접 실행해도 되지만 kube-prometheus-stack은 Helm으로 배포하기 때문에 쿠버네티스 클러스터에서는 다른 방법보다 관리가 편리합니다.

 

또한 Prometheus를 별도로 설치하는것보다 kube-prometheus-stack으로 설치하면 Prometheus와 필수적이라 할정도로 같이 사용되는 node-exporter, Grafana, PrometheusOperator 같은 오픈소스들을 동시에 배포, 관리할수 있으며 멀티클러스터 기반에서 여러개의 Prometheus를 실행해야 할 경우 Thanos 같은 HA구성을 위한 오픈소스 애플리케이션과도 쉽게 결합할수 있습니다.

img

출처 : https://picluster.ricsanfre.com/docs/prometheus/

 

kube-prometheus-stack 설치준비

설치 준비사항

  • 쿠버네티스 클러스터 or minikube 환경
  • Helm

 

1. helm repository update

  • 패키지를 받을수 있도록 레포지토리 정보를 추가, 업데이트 합니다.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

 

2. helm pull

  • helm install 명령으로 바로 설치할수도 있지만 values.yaml 파일을 직접 수정해서 배포하기위해 pull을 사용합니다.
  • main 버전외에 다른버전을 사용하려면 --version 옵션을 사용합니다.
helm pull prometheus-community/kube-prometheus-stack
helm pull prometheus-community/kube-prometheus-stack --version 45.31.0

 

3. 압축 해제

  • 2023/06/30 기준으로 패키지를 받으면 47.0.0 버전을 받게되고 압축을 해제합니다.
tar xvfz kube-prometheus-stack-47.0.0.tgz
drwxr-xr-x  5 ksr930 ksr930   4096 Jun 30 11:07 .
drwxr-xr-x 19 ksr930 ksr930   4096 Jun 30 11:07 ..
-rw-r--r--  1 ksr930 ksr930    398 Jun 20 19:26 .helmignore
-rw-r--r--  1 ksr930 ksr930    656 Jun 20 19:26 CONTRIBUTING.md
-rw-r--r--  1 ksr930 ksr930    449 Jun 20 19:26 Chart.lock
-rw-r--r--  1 ksr930 ksr930   1842 Jun 20 19:26 Chart.yaml
-rw-r--r--  1 ksr930 ksr930  60475 Jun 20 19:26 README.md
drwxr-xr-x  5 ksr930 ksr930   4096 Jun 30 11:07 charts
drwxr-xr-x  2 ksr930 ksr930   4096 Jun 30 11:07 crds
drwxr-xr-x  8 ksr930 ksr930   4096 Jun 30 11:07 templates
-rw-r--r--  1 ksr930 ksr930 136422 Jun 20 19:26 values.yaml

 

Helm 차트 구성

kube-prometheus-stack을 포함한 대부분의 Helm 배포 패키지는 비슷한 구성으로 이루어져있습니다.

  • charts: Helm 차트의 종속 차트를 포함하는 위치입니다. 이 패키지의 경우 grafana, kube-state-metrics, prometheus-node-exporter가 존재합니다.
  • templates: Helm 차트의 템플릿 파일들을 포함합니다. 템플릿은 Kubernetes 리소스의 정의를 작성하는 데 사용되며, 이를 통해 애플리케이션의 배포, 서비스, 구성 등을 관리할 수 있습니다
  • crds: Custom Resource Definitions(CRDs) 파일을 포함할 수 있는 위치입니다. CRD는 Kubernetes API에 사용자 정의 리소스와 그에 대한 스키마를 추가하는 데 사용됩니다.
  • Chart.yaml: Helm 차트의 메타 정보를 정의합니다. 메타 정보에는 차트의 이름, 버전, 유형, 유지 보수자 정보 등이 포함됩니다. 또한 종속 차트, 애플리케이션의 버전 제약 조건 등을 지정할 수도 있습니다.
  • values.yaml: Helm 차트의 기본 구성 값을 정의합니다. 애플리케이션의 설정 옵션, 환경 변수, 리소스 크기 등을 설정할 수 있습니다. values.yaml 파일에 정의된 값은 템플릿 파일 내에서 사용될 수 있으며, 차트를 배포할 때 사용자 지정 값으로 오버라이드할 수도 있습니다.

 

crds, templates 디렉토리의 파일들을 수정할일은 거의 없고 주로 values.yaml을 구성하고자 하는 환경에 맞추어 수정하고 추가로 종속 차트의 세부 설정들도 수정 해야하는 경우에는 charts 디렉토리내의 종속 차트에서 values.yaml을 수정합니다.

 

values.yaml 수정

helm 레포지토리만 추가하고 helm install 명령으로 배포하는것은 간단하지만 커스텀하게 구성하기가 어렵습니다. 하지만 우리는 values.yaml 파일을 수정하여 몇가지 옵션들을 수정해보겠습니다.

 

Grafana - enabled

Grafana는 Prometheus의 시계열 데이터를 활용하여 대시보드를 구성할수 있는 모니터링 UI 오픈소스입니다. 사용하기 위해서 844 line 근처에서 grafana 옵션을 찾고 enabled 값이 true인지 확인합니다.

[./values.yaml 844 line]

grafana:
  enabled: true
  namespaceOverride: ""

  ## ForceDeployDatasources Create datasource configmap even if grafana deployment has been disabled
  ##
  forceDeployDatasources: false

  ## ForceDeployDashboard Create dashboard configmap even if grafana deployment has been disabled
  ##
  forceDeployDashboards: false

  ## Deploy default dashboards
  ##
  defaultDashboardsEnabled: true
...
...

 

Grafana - DataSource

Grafana를 실행후 웹에서 접속하면 DataSource 설정이 있는데 Grafana에서 지원하는 여러가지 오픈소스 스토리지들을 지정할수 있습니다. 웹에서 직접 설정하여도 되지만 Grafana를 재배포 할 경우 저장된 DataSource 정보가 초기화 되기 때문에 매번 설정하지 않으려면 additionalDataSources 옵션을 설정해야 합니다.

[./values.yaml 983 line]

  additionalDataSources:
    - name: Jaeger
      type: jaeger
      uid: my-jaeger
      access: server
      url: http://jaeger-query.monitoring.svc:16686/jaeger
      isDefault: false
      editable: true
      basicAuth: false
      version: 1
    - name: Loki
      type: loki
      url: http://loki.monitoring.svc:3100
      access: proxy
      jsonData:
        maxLines: 1000
        derivedFields:
          - datasourceUid: my-jaeger
            matcherRegex: '((\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+))'
            name: TraceID
            url: '$${__value.raw}'
          - matcherRegex: '((\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+)(\d+|[a-z]+))'
            name: TraceID
            url: 'http://jaeger-query.monitoring.svc:16686/trace/$${__value.raw}'
      basicAuth: true
      isDefault: false
      editable: true
      version: 1
    - name: Prometheus
      access: proxy
      basicAuth: true
      editable: true
      jsonData:
          tlsSkipVerify: true
      orgId: 1
      type: prometheus
      url: http://thanos-query-frontend.monitoring.svc:9090
      version: 1

이 옵션은 실제로 운영중인 Grafana의 DataSource 설정입니다. 내용이 다소 복잡해 보일수도 있지만 여기서는 DataSource를 미리 선언하여 Helm 재배포를 해도 DataSource가 유지 된다는것만 확인하면 됩니다.

 

Grafana - service type

Grafana는 웹에서 사용하기 위한 오픈소스이므로 ClusterIP 타입보다는 NodePort나 LoadBalancer 타입으로 사용하는것이 일반적입니다. 제가 진행중인 클라우드 프로젝트에서는 Grafana 서비스를 로드밸런서 타입으로 지정하고 NCP 클러스터에서 DNS를 추가하여 네이버나 구글 사이트에 접속하는 방식처럼 사용중입니다.

 

[./values.yaml 999 line]

service:
  portName: http-web

기본값은 ClusterIP 타입이며 type 옵션으로 NodePort or LoadBalancer 타입을 지정할수 있습니다.

 

service:
  type: NodePort
  nodePort: 31000
  portName: http-web
or
service:
  type: LoadBalancer
  portName: http-web

 

Grafana - Dashboard

Grafana를 실행하고 대시보드까지 만들어본 경험이 있다는 가정하에 설명드리겠습니다.

DataSource와 마찬가지로 대시보드 역시 Helm 재배포하면 만들어 놓았던게 사라지므로 서비스 운영시 만들었던 대시보드를 json 파일로 추출하여 helm 서브차트에 있는 grafana 디렉토리 내부에 저장하여 재배포 후에도 대시보드를 불러올수 있습니다.

 

추출한 json 파일을 ./charts/grafana/dashboards 경로에 넣고 ./charts/grafana/values.yaml 파일을 수정합니다.

[./charts/grafana/values.yaml 642 line]

dashboards:
  default:
    kafka-dashboard:
      file: dashboards/KafkaDashboard.json
    pod-dashboard:
      file: dashboards/PodDashboard.json
    redis-dashboard:
      file: dashboards/RedisDashboard.json
    mysql-dashboard:
      file: dashboards/MysqlDashboard.json
    elastic-dashboard:
      file: dashboards/ElasticsearchDashboard.json

대시보드 이름은 직접 지정하면 되고 file명만 위 예시처럼 작성하면 됩니다.

 

Prometheus - remoteWrite

remoteWrite 옵션은 Prometheus에 저장되는 시계열 데이터들을 다른 스토리지에 저장할수 있는 옵션입니다. 멀티클러스터 구성시 여러개의 Prometheus가 실행될 경우 HA(고가용성)을 위해 시계열 데이터들을 Prometheus가 아닌 외부 스토리지에 저장하게 되는데 가장 많이 쓰이는것이 Thanos라는 오픈소스 스토리지 입니다.

Prometheus와 Thanos 연동에 대한 글은 아래 링크를 참조하시면 됩니다.

 

k8s 멀티 클러스터 Prometheus, Thanos 연동

k8s 멀티 클러스터 Prometheus, Thanos 연동하기 팀에서 클라우드 프로젝트를 수행하면서 모니터링 부분을 맡게되어 Promtheus를 포함한 Grafana, Loki, Jaeger등등 여러가지 모니터링에 필요한 오픈소스 프로

ksr930.tistory.com

 

다시 본론으로 돌아와서 remoteWrite 옵션 설정법은 아래와 같습니다.

[./values.yaml 2738 line]

## The remote_write spec configuration for Prometheus.
remoteWrite:
- url: http://thanos-receive.monitoring.svc:19291/api/v1/receive

 

Prometheus - podMonitor, serviceMonitor

노드의 리소스 정보를 Prometheus로 전송하는 node-exporter 외에도 Pod, Service의 상태정보를 수집하기 위해 Prometheus는 PodMonitor, ServiceMonitor와 연결되야 합니다.

모니터링 데이터를 수집하기 위해서는 아래 두개의 옵션을 기본값인 true에서 false로 변경해야 합니다.

  • podMonitorSelectorNilUsesHelmValues
  • serviceMonitorSelectorNilUsesHelmValues

[./values.yaml 2985, 3008 line]

## 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

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

두개 옵션을 true로 하게되면 helm 배포시 Promehteus-operator와 동일한 릴리즈 태그로 레이블이 지정된 PodMonitors, ServiceMonitors만 검색하기 때문에 필터링 없이 모든 네임스페이스를 검색하기 위해 false로 하는것입니다.

 

여러가지 기능이 더 많이 존재하지만 제가 멀티클러스터 기반에서 Prometheus와 여러가지 오픈소스 프로그램을 활용한 모니터링 시스템을 구축했을때 필요하다고 생각되는 설정 부분들을 정리해봤습니다.

반응형

댓글