IT STUDY LOG

[서비스 모니터링] 03. Prometheus + Grafana 본문

devops bootcamp 4/DevOps 인프라 관리

[서비스 모니터링] 03. Prometheus + Grafana

roheerumi 2023. 6. 2. 17:34

# 학습 목표

  • 쿠버네티스 모니터링 시스템이 Prometheus와 Grafana를 통해 구현됨을 이해할 수 있다.

# 학습 내용

1.  Prometheus 모니터링 시스템

- 오픈소스 모니터링/알림 시스템

- 프로메테우스는 쿠버네티스, 노드, 프로메테우스 자체를 모니터링 가능

- 쿠버네티스를 지원하고 관리하는 재단인 CNCF에서 프로메테우스 역시 관리하고 있으며, 이 두 도구를 비롯해 시각화를 담당하는 Grafana와 함께 세 도구 조합은 정석적으로 널리 사용되고 있음

 

프로메테우스 구성 요소

  • 프로메테우스는 시계열(time series) 데이터를 저장
  • 프로메테우스 서버는 다양한 exporter로부터 각 대상의 메트릭을 pull하여 주기적으로 가져오는 모니터링 시스템
    • 예를 들어, 쿠버네티스 관련 메트릭을 가져오고 싶다면 쿠버네티스 exporter를, mongoDB 관련 메트릭을 가져오고 싶다면, mongodb exporter를 사용하면 됨
  • Alert manager:  경고 및 알람을 담당
  • 사용자가 데이터를 질의할 수 있는 Web UI가 존재
    • 이때 질의 언어로는 PromQL(Prometheus Query Language)을 사용합니다.

- Grafana는 프로메테우스의 구성요소는 아니지만 프로메테우스에서 권장하는 시각화 도구

  •  

 

쿠버네티스 exporter

- 프로메테우스에서 쿠버네티스 관련 메트릭을 가져올 수 있는 쿠버네티스 exporter가 존재하며 이때 프로메테우스 exporter는 Kube API를 사용

- 대부분의 필요한 정보를 가져올 수 있음

출처 : https://prometheus.io/docs/introduction/overview/

 

2.  Prometheus, Grafana 설치

Prometheus Operator를 이용하여 설치하기

- minikube를 이용해 클러스터를 생성(--nodes 옵션을 이용하여 여러 개의 노드를 만들 수 있음)

$ minikube start --nodes=3                                                      
😄  Darwin 10.15.7 의 minikube v1.30.1
✨  기존 프로필에 기반하여 docker 드라이버를 사용하는 중
👍  minikube 클러스터의 minikube 컨트롤 플레인 노드를 시작하는 중
🚜  베이스 이미지를 다운받는 중 ...
🤷  docker "minikube" container is missing, will recreate.
🔥  Creating docker container (CPUs=2, Memory=4000MB) ...
🐳  쿠버네티스 v1.26.3 을 Docker 23.0.2 런타임으로 설치하는 중
🔗  Configuring bridge CNI (Container Networking Interface) ...
🔎  Kubernetes 구성 요소를 확인...
💡  After the addon is enabled, please run "minikube tunnel" and your ingress resources would be available at "127.0.0.1"
    ▪ Using image registry.k8s.io/ingress-nginx/controller:v1.7.0
    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
    ▪ Using image registry.k8s.io/ingress-nginx/kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794
🔎  Verifying ingress addon...
🌟  애드온 활성화 : storage-provisioner, default-storageclass, ingress
❗  The cluster minikube already exists which means the --nodes parameter will be ignored. Use "minikube node add" to add nodes to an existing cluster.
🏄  끝났습니다! kubectl이 "minikube" 클러스터와 "default" 네임스페이스를 기본적으로 사용하도록 구성되었습니다.

- 여러 개의 노드를 만들 경우

 > 첫 번째는 master, 나머지 두 개의 노드는 worker 노드로 구성

 > 여러 개의 노드를 구성할 경우, 워커 노드에는 실제로 실행되는 애플리케이션을 배치하며, 마스터 노드는 클러스터 관리 그 자체에 집중

Q. 모니터링의 관점에서 워커 노드에 애플리케이션을 별도로 배치하는 것이 왜 유리할까?


 

Prometheus Operator Quick Start

1. kube-prometheus를 클론

 $ git clone https://github.com/prometheus-operator/kube-prometheus.git

2. 해당 디렉토리로 이동하여 kube-prometheus를 배포

- Prometheus Operator 관련 서비스 및 워크로드가 실행되기 전까지 기다릴 것

$ cd kube-prometheus      

# manifests/setup 안의 워크로드를 전부 실행
# 네임 스페이스와 customresourcedefinition들을 생성 리소스가 생성되기 전에 사용될 때까지 기다림
$ kubectl create -f manifests/setup

customresourcedefinition.apiextensions.k8s.io/alertmanagerconfigs.monitoring.coreos.com created
customresourcedefinition.apiextensions.k8s.io/alertmanagers.monitoring.coreos.com created
#... 중략 ...#
customresourcedefinition.apiextensions.k8s.io/thanosrulers.monitoring.coreos.com created
namespace/monitoring created


# "servicemonitors" CRD가 생성될 때 까지 기다림
# "No resources found" 메시지가 발생하면 성공된 것
$ until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done

# manifest/ 안의 워크로드를 전부 실행
$ kubectl create -f manifests/
alertmanager.monitoring.coreos.com/main created
networkpolicy.networking.k8s.io/alertmanager-main created
#... 중략 ...#
serviceaccount/prometheus-operator created
servicemonitor.monitoring.coreos.com/prometheus-operator created

 

2. 관련 서비스를 로컬호스트에 포트 포워딩으로 노출

1) 프로메테우스 노출 : http://localhost:9090로 접속해서 프로메테우스에 접속 가능

$ kubectl --namespace monitoring port-forward svc/prometheus-k8s 9090 &

2) 그라파나 노출 : http://localhost:3000으로 접속해서 그라파나에 접속 가능

- 초기 사용자 이름과 비밀번호는 admin/admin

$ kubectl --namespace monitoring port-forward svc/grafana 3000 &

3. 생성된 쿠버네티스 리소스 확인

더보기
$ kubectl get namespace
NAME              STATUS   AGE
default           Active   10d
kube-node-lease   Active   10d
kube-public       Active   10d
kube-system       Active   10d
monitoring        Active   21m

$ kubectl get all --namespace="monitoring" 
NAME                                       READY   STATUS    RESTARTS   AGE
pod/alertmanager-main-0                    2/2     Running   0          15m
pod/alertmanager-main-1                    2/2     Running   0          15m
pod/alertmanager-main-2                    2/2     Running   0          15m
pod/blackbox-exporter-6bc47b9578-hw2db     3/3     Running   0          16m
pod/grafana-57f885b6c8-q4cz7               1/1     Running   0          16m
pod/kube-state-metrics-f76ffbf8b-zv7ls     3/3     Running   0          16m
pod/node-exporter-9sq7l                    2/2     Running   0          16m
pod/prometheus-adapter-6b88dfd544-nvw8f    1/1     Running   0          16m
pod/prometheus-adapter-6b88dfd544-z4wjm    1/1     Running   0          16m
pod/prometheus-k8s-0                       2/2     Running   0          15m
pod/prometheus-k8s-1                       2/2     Running   0          15m
pod/prometheus-operator-58899ccbf4-lc8dp   2/2     Running   0          16m

NAME                            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/alertmanager-main       ClusterIP   10.111.201.192   <none>        9093/TCP,8080/TCP            16m
service/alertmanager-operated   ClusterIP   None             <none>        9093/TCP,9094/TCP,9094/UDP   15m
service/blackbox-exporter       ClusterIP   10.111.198.84    <none>        9115/TCP,19115/TCP           16m
service/grafana                 ClusterIP   10.108.176.133   <none>        3000/TCP                     16m
service/kube-state-metrics      ClusterIP   None             <none>        8443/TCP,9443/TCP            16m
service/node-exporter           ClusterIP   None             <none>        9100/TCP                     16m
service/prometheus-adapter      ClusterIP   10.104.131.70    <none>        443/TCP                      16m
service/prometheus-k8s          ClusterIP   10.105.29.195    <none>        9090/TCP,8080/TCP            16m
service/prometheus-operated     ClusterIP   None             <none>        9090/TCP                     15m
service/prometheus-operator     ClusterIP   None             <none>        8443/TCP                     16m

NAME                           DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/node-exporter   1         1         1       1            1           kubernetes.io/os=linux   16m

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/blackbox-exporter     1/1     1            1           16m
deployment.apps/grafana               1/1     1            1           16m
deployment.apps/kube-state-metrics    1/1     1            1           16m
deployment.apps/prometheus-adapter    2/2     2            2           16m
deployment.apps/prometheus-operator   1/1     1            1           16m

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/blackbox-exporter-6bc47b9578     1         1         1       16m
replicaset.apps/grafana-57f885b6c8               1         1         1       16m
replicaset.apps/kube-state-metrics-f76ffbf8b     1         1         1       16m
replicaset.apps/prometheus-adapter-6b88dfd544    2         2         2       16m
replicaset.apps/prometheus-operator-58899ccbf4   1         1         1       16m

NAME                                 READY   AGE
statefulset.apps/alertmanager-main   3/3     15m
statefulset.apps/prometheus-k8s      2/2     15m

 

# references

https://prometheus.io/

 

Prometheus - Monitoring system & time series database

An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.

prometheus.io

https://grafana.com/

 

Grafana: The open observability platform | Grafana Labs

Your observability stack Operational dashboards for your data here, there, or anywhere

grafana.com

 

Comments