DevOps BootCamp/모니터링

Prometheus + Grafana

cloudmaster 2023. 6. 2. 13:29

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를 사용합니다. 대부분의 필요한 정보는 가져올 수 있습니다.

 

[출처] codestates

 

 

Prometheus, Grafana 설치

Prometheus Operator를 이용하여 설치하기

minikube start --nodes=3
여러 개의 노드를 만들면, 첫 번째는 master, 나머지 두 개의 노드는 worker 노드로 구성됩니다.
여러 개의 노드를 구성할 경우, 워커 노드에는 실제로 실행되는 애플리케이션을 배치하며, 마스터 노드는 클러스터 관리 그 자체에 집중하게 합니다.

 

$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

minikube-m02
type: Worker
host: Running
kubelet: Running

minikube-m03
type: Worker
host: Running
kubelet: Running

 

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

  1. 분산 환경에서의 모니터링
    워커 노드에 애플리케이션을 배치하면, 모든 서버에서 동일한 방식으로 모니터링할 수 있습니다. 또한, 모든 서버에서 동일한 방식으로 애플리케이션을 실행하므로, 문제가 발생했을 때 원인을 빠르게 파악할 수 있다.

  2. 모니터링 리소스의 최소화
    예를 들어, 각 서버에 별도의 모니터링 애플리케이션을 배치하면, 메모리, CPU 등의 리소스를 낭비할 수 있다. 그러나, 워커 노드에 애플리케이션을 배치하면, 서버에서 필요한 메트릭 데이터만 수집하면 되므로, 리소스를 최소한으로 사용할 수 있다.

  3. 로그 및 메트릭 데이터의 중앙 집중화
    워커 노드에 애플리케이션을 배치하면, 로그 및 메트릭 데이터를 중앙 집중화할 수 있다. 중앙 집중화된 데이터를 사용하면, 여러 서버에서 발생한 이슈를 빠르게 파악하고 대처할 수 있다. 또한, 중앙 집중화된 데이터를 사용하여 애플리케이션의 성능과 안정성을 개선할 수 있습니다.

 

kube-prometheus 를 클론 해줍시다.공식 문서에 깃 클론 주소가 있으니 복사해서 진행하면 됩니다

1. kube-prometheus를 클론 하세요.

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

 

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

# STEP 1
kubectl create -f manifests/setup

manifests/setup 안의 워크로드를 전부 실행한다.

 

# STEP 2
until kubectl get servicemonitors --all-namespaces ; do date; sleep 1; echo ""; done

"서비스 모니터" CRD가 생성될 때까지 기다립니다. "No resources found" 메시지는 이 콘텍스트에서 성공을 의미합니다.

 

# STEP 3
kubectl create -f manifests/

manifest/ 안의 워크로드를 전부 실행합니다.

 

그러고 나서 STEP2의 명령어를 입력해 보니...

프로메테우스 관련 프로세스에 대한 동작되는 서비스들과 동작시간을 보는 명령어 인걸로 이해했습니다

 

두 폴더의 리소스를 단일 명령으로 적용할 수 kubectl create -f manifests/setup -f manifests 있지만, 모든 구성 요소를 성공적으로 생성하려면 명령을 여러 번 실행해야 할 수 있습니다.

 

 

프로메테우스 노출

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

http://localhost:9090로 접속해서 프로메테우스에 접속할 수 있습니다.

 

그라파나 노출

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

http://localhost:3000으로 접속해서 그라파나에 접속할 수 있습니다. (초기 사용자 이름과 비밀번호는 admin/admin입니다)