프로메테우스와 그라파나로 개발 서버 모니터링하기

essem
9 min readJun 1, 2019

--

개발 서버 같은 머신들의 상태를 프로메테우스(Prometheus)와 그라파나(Grafana)를 사용하면 깔끔한 그래프로 모니터링할 수 있다.

개발 서버에는 익스포터(Exporter)를 설치해서 각종 지표를 노출하고, 프로메테우스가 해당 지표를 모아서 저장하며, 그라파나가 데이터를 가져와서 각종 그래프로 보여준다.

개발 서버 ⇒ 익스포터 ⇒ 프로메테우스 ⇒ 그라파나 ⇒ 브라우저

익스포터 설치

먼저 모니터링하고 싶은 머신에 익스포터를 설치해야 한다. 리눅스 머신이라면 공식으로 제공되는 노드 익스포터(Node Exporter)를 설치하면 되고 윈도우 머신이라면 공식은 아니지만, 많이 사용되는 WMI 익스포터(WMI Exporter)를 설치하면 된다.

리눅스에 노드 익스포터를 설치하려면 공식 다운로드 페이지에서 압축 파일을 받아서 압축을 해제한 후 실행 파일인 node_exporter/usr/local/bin 디렉토리 아래 복사한다. 그리고 시스템 서비스로 등록하기 위해 /etc/systemd/system/node_exporter.service 파일을 만든 후 다음 내용을 입력한다.

[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target

다음 명령을 통해 서비스를 등록하고 시작 시킨다.

sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter

만약 설치한 머신의 IP 주소가 192.168.100.219라면 http://192.168.100.219:9100/metrics 주소로 접속해 보자. 다음과 같이 각종 지표가 표시되는 것을 볼 수 있다.

프로메테우스 설치

프로메테우스를 독립적으로 설치할 수도 있지만 쿠버네티스에 설치해 보자.

먼저 프로메테우스가 어느 URL에서 지표들을 읽어 들일지 정의하는 설정 파일을 준비해야 한다. configmap 디렉토리를 만들고 그 안에 prometheus.yml 만들자. 다음은 프로메테우스의 기본 설정 파일에 노드 익스포터 내용을 추가한 예제이다.

global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['192.168.100.219:9100']

이 설정 파일을 쿠버네티스 컨피그맵으로 생성해 보자.

kubectl create configmap -n demo prometheus --from-file=configmap/

컨피그맵이 준비 되었으니 프로메테우스를 설치해 보자. 다음 매니페스트에서 네임스페이스, 볼륨 크기, 인그래스의 호스트명 등을 자신의 환경에 맞게 수정하자.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: prometheus
namespace: demo
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus
namespace: demo
spec:
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
containers:
- image: prom/prometheus
name: prometheus
ports:
- containerPort: 9090
volumeMounts:
- name: data
mountPath: /prometheus
- name: config
mountPath: /etc/prometheus/prometheus.yml
subPath: prometheus.yml
volumes:
- name: data
persistentVolumeClaim:
claimName: prometheus
- name: config
configMap:
name: prometheus
---
apiVersion: v1
kind: Service
metadata:
name: prometheus
namespace: demo
spec:
ports:
- port: 9090
selector:
app: prometheus
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: prometheus
namespace: demo
spec:
rules:
- host: prometheus.foo.com
http:
paths:
- backend:
serviceName: prometheus
servicePort: 9090

쿠버네티스에 배포 후 브라우저로 접속해서 첫 페이지가 잘 나오는지 확인해 보자. (아래 스크린샷은 로컬 쿠버네티스여서 내부 IP를 사용했으나 인그래스를 사용했다면 해당 주소로 접속하자.)

Status ⇒ Targets 메뉴를 눌러 등록한 익스포터의 정보를 잘 읽어 오는지 확인해 보자.

다음은 Graph 메뉴에서 다음과 같은 수식을 입력해서 잘 표시되는지 테스트해 보자.

rate(node_cpu_seconds_total{mode="system"}[1m])

그라파나 설치

다음 매니페스트에서 네임스페이스, 볼륨 크기, 인그래스의 호스트명 등을 자신의 환경에 맞게 수정하자.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: grafana
namespace: demo
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
namespace: demo
spec:
selector:
matchLabels:
app: grafana
template:
metadata:
labels:
app: grafana
spec:
containers:
- image: grafana/grafana
name: grafana
ports:
- containerPort: 3000
volumeMounts:
- name: data
mountPath: /var/lib/grafana
volumes:
- name: data
persistentVolumeClaim:
claimName: grafana
---
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: demo
spec:
ports:
- port: 3000
selector:
app: grafana
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: grafana
namespace: demo
spec:
rules:
- host: grafana.foo.com
http:
paths:
- backend:
serviceName: grafana
servicePort: 3000

쿠버네티스에 배포 후 브라우저로 접속해 보자.

admin/admin으로 로그인 후 데이터 소스로 프로메테우스를 선택하자. 그리고 URL은 프로메테우스의 내부 도메인인 http://prometheus:9090 으로 입력한다.

대시보드를 직접 처음부터 만드는 것은 어렵기 때문에 잘 만들어진 대시보드를 임포트해 보자. Dashboard ⇒ Manage ⇒ Import 메뉴를 선택 후 대시보드 아이디에 1860을 입력 후 Load 버튼을 누르면 다음과 같은 화면으로 바뀐다. 프로메테우스를 선택 후 임포트를 진행하자.

임포트 된 대시보드를 선택하면 다음과 같은 화면을 볼 수 있다.

(참고로 WMI Exporter 용 대시 보드도 있으니 필요하면 임포트해서 사용해 보자)

그라파나는 각 그래프마다 경보(Alert)을 설정할 수 있으며 이메일, 슬랙을 포함한 다양한 알림 방법을 제공하기 때문에 반드시 설정하는 것을 추천한다.

참고 문서

--

--