Prometheus 적용기

배선우
connectfit
Published in
10 min readFeb 25, 2021

Prometheus란 오픈소스 모니터링 시스템으로

2012년 부터 SoundCloud사에서 개발을 시작하였다. 그후 2016년 K8S다음으로 CNCF(Cloud Native Computing Foundation)에서 2번째로 졸업한 프로젝트로 완성도가 높은 오픈소스 프로젝트이다.

Prometheus는 시계열 데이터 베이스로 Go언어로 개발되었다. 데이터는 key-value 형태의 LevelDB에 저장하며, Go, Java, Ruby, Python 기타 많은 언어로 클라이언트 라이브러리가 작성되었다. 주로 Docker 모니터링 용도로 많이 사용된다. Kubernetes 공식홈페이지에서도 같은 CNCF 프로젝트인 Prometheus를 이용하여 모니터링하는 것을 권장하고 있다.

Prometheus의 중요기능 다음과 같다.

  • key-value형태의 시계열데이터를 다차원로 모델 저장
  • 저장된 데이터를 쿼리하는 PromQL (flexible query language)
  • 분산 저장을 허용하지 않는 구조, 단일노드에 데이터를 저장한다.
  • 시계열 데이터를 pull 형태로 HTTP로 수집
  • 직접 push한 데이터도 gateway를 통하여 수집
  • 설정값을 통해서비스에 대한 데이터 수집
  • 다양한 그래픽 및 대시보드 지원

중요 구성요소는 다음것들이 있다.

  • Main prometheus server는 수집된 시계열 데이터를 저장한다.
  • 클라이언트에서 데이터를 수집할 수 있게 도와주고 여러 언어를 지원하는 client library
  • pushgateway는 클라이언트에서 보낸 데이터를 처리한다
  • exporters는 여러 서비스에서 데이터를 수집한다.
  • altermanager는 여러 알람을 관리할 수 있게 해준다.

다음 그림은 Prometheus의 아키텍처를 보여준다.

Prometheus server에서 pull형태로 데이터를 수집하고, 설정해놓은 알람정보를 altermanager를 통해서, 알람을 보낼수 있고, Grafana등과 플러그인을 이용하여 PromQL로 데이터를 쿼리하여 데이터를 시각화하여 볼 수 있다.

Prometheus 설치

k8s 패키지 매니저인 helm를 사용하여, prometheus를 설치하여보자, 필자는 prometheus, grafana를 합쳐서 패키징된 차트인 kube-prometheus-stack를 이용하여 설치하였다.

필수사항은 Kuberentes 1.16, Helm3 버전 이상이다.

우선 설치하기전에, helm repo를 업데이트 해주자.

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
$ helm repo update

그리고, 위 차트에 위치할 k8s namespace를 만들어주자.

# prometheus-ns.yaml
kind: Namespace
apiVersion: v1
metadata:
name: prometheus
$ kubectl create -f prometheus-ns.yaml

그리고 바로 helm 차트를 설치하자.

$ helm install prometheus prometheus-community/kube-prometheus-stack  -n prometheus

그 후 grafana를 실행시켜보자.

$ kubectl port-forward -n prometheus svc/prometheus-grafana 9090:80

k8s port-forward로 grafana를 연결하여, 실행되는 것을 확인하였다.

초기 계정과 비밀번호는 아래와 같이 입력하면 찾을 수 있다.

$ helm show values prometheus-community/kube-prometheus-stack | grep adminPassword

위 비밀번호를 이용하여 로그인하니 잘 되었다.

커뮤니티에서 사용자들이 만들어 업로드한, Grafana 대쉬보드 플러그인을 설치해보자,

Grafana 메인페이지 우측 상단 +아이콘을 클릭하면 플러그인을 Import 할 수 있는 화면으로 이동이 가능하다.

Grafana 대쉬보드 플러그인 페이지에서 Kubernetes로 검색후, 리뷰와 다운로드수가 많은 Kubernetes Deployment Statefulset Daemonset metric를 Import해보았다.

왼쪽 하단에 ‘8588'으로 된dashboard ID가 적혀있다.

dashboard ID를 적은 후 Load버튼을 누르면, 대쉬보드를 Import할 수 있다.

설치하여, Deployment를 prometheus-grafana로 필터링하니, grafana가 사용중인, CPU, Memory 정보를 시각화하여 볼 수 있다.

kube-prometheus-stack 차트를 이용해서 설치한다면 grafana데이터는 persistent volumn에 저장이 되지 않아서, k8s pod가 삭제가 된다면, 설정값이나 유저 데이터는 소실이 된다.

grafana가 영구저장소를 이용할 수 있도록 설정을 수정해주자.

# custom_values.yaml
grafana:
enabled: true
persistence:
enabled: true
type: pvc
storageClassName: standard
accessModes:
- ReadWriteOnce
size: 4Gi
finalizers:
- kubernetes.io/pvc-protection

그리고 원하는 서비스를 prometheus가 메트릭 데이터를 수집할 수 있도록 설정을 변경해보자.

prometheus:
prometheusSpec:
additionalScrapeConfigs:
- job_name: your_job_name
scrape_interval: 15s
kubernetes_sd_configs:
- role: pod
namespaces:
names:
- your_namespace
relabel_configs:
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: namespace
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: pod
- source_labels: [__address__]
action: replace
regex: ([^:]+)(?::\d+)?
replacement: ${1}:your_port
target_label: __address__
- source_labels: [__meta_kubernetes_pod_label_app]
action: keep
regex: your_pod_name

적절한 job, namespace, port, pod 값을 입력해주자.

전체적인 설정파일은 다음과 같다.

# custom_values.yaml
prometheus:
prometheusSpec:
additionalScrapeConfigs:
- job_name: your_job_name
scrape_interval: 15s
kubernetes_sd_configs:
- role: pod
namespaces:
names:
- your_namespace
relabel_configs:
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: namespace
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: pod
- source_labels: [__address__]
action: replace
regex: ([^:]+)(?::\d+)?
replacement: ${1}:your_port
target_label: __address__
- source_labels: [__meta_kubernetes_pod_label_app]
action: keep
regex: your_pod_name
grafana:
enabled: true
persistence:
enabled: true
type: pvc
storageClassName: standard
accessModes:
- ReadWriteOnce
size: 4Gi
finalizers:
- kubernetes.io/pvc-protection

그리고 설정값을 명령어를 사용하여 갱신해주자.

$ helm upgrade --reuse-values -f ./custom_values.yaml prometheus prometheus-community/kube-prometheus-stack -n prometheus

설정을 적용한 다음에, grafana에 접속해보니, 정상적으로 metric을 수집하는 것을 확인하였다.

Grafana에서 대쉬보드를 생성한 후에, PromQL이용하여 매트릭 데이터를 시

LOGOUT서비스는 대부분 grpc를 이용하여 클라이언트와 통신하기 때문에 메트릭으로 수집한 데이터를 보기위해 아래와 같이 PromQL를 작성하였다.

sum by (grpc_method)(rate(grpc_server_handled_total{grpc_code="OK", grpc_service!="grpc.health.v1.Health"}[30m]))

위와 같이 쿼리를 작성하였더니 아래와 같이 시각화된 데이터를 얻을 수 있었다.

그 외 알람등 유용한 기능들을 지원한다.

PromQL 문서를 다시 한번 정독한 뒤에, 다시 한번 서비스에 맞는 모니터링 대쉬보드를 구축해야겠다.

--

--