IT STUDY LOG
[서비스 모니터링] 03. Prometheus + Grafana 본문
# 학습 목표
- 쿠버네티스 모니터링 시스템이 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를 사용
- 대부분의 필요한 정보를 가져올 수 있음
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
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
Grafana: The open observability platform | Grafana Labs
Your observability stack Operational dashboards for your data here, there, or anywhere
grafana.com
'devops bootcamp 4 > DevOps 인프라 관리' 카테고리의 다른 글
[성능 테스트] 01. 가용성과 확장성 (0) | 2023.06.06 |
---|---|
[서비스 모니터링] 04. 서비스 수준 목표 (0) | 2023.06.05 |
[서비스 모니터링] 02. 쿠버네티스 클러스터 모니터링 (0) | 2023.06.02 |
[서비스 모니터링] 01. 모니터링의 목표와 측정 항목 (0) | 2023.06.02 |
[컨테이너 오케스트레이션] 04. 쿠버네티스 네트워크 (0) | 2023.05.22 |