들어가며
이전에는 프로메테우스에 대해서 살펴보았다. 이번에는 node-exporter를 사용해서 리눅스 기반 운영체제를 모니터링 대시보드를 구축하는 방법에 대해서 살펴볼 것이다.
위 사진에 따라 exporter -> prometheus -> grafana의 순서대로 데이터가 흘러가는 구조를 설계할 예정이다. docker-compose 환경을 사용해서 대시보드를 띄울 것이다.
일반적으로 쿠버네티스를 사용하는 환경이라면 좀 더 다양한 exporter를 사용할 수 있겠지만, 이번 포스팅에서는 node-exporter를 이용해서 본인의 컴퓨터를 모니터링하는 대시보드를 소개하고자 한다. 더 나아가서 node-exporter이기 때문에, 다른 노드들을 추가할 수 있는 방법까지 다뤄보고자 한다.
본론
먼저 전체 소스 코드의 링크는 아래와 같다.
- Github Example : https://github.com/marsboy02/node-exporter-monitoring
이제 하나하나씩 살펴보자.
node-exporter
먼저 node-exporter들을 dockerhub에서 찾아보면 다음과 같은 exporter들이 있다. 여기서 prom/node-exporter를 사용해서 노드들의 매트릭을 분출시키는 것들을 살펴보자.
prom/node-exporter를 눌러서 docs를 살펴보면 다양한 활용 방법에 대해서 나와있다. 파라미터나 yml 파일을 작성할 때의 주의사항 등이 있다. 필요에 따라 내용을 추가하거나 하여 커스터마이징 해서 사용할 수 있다.
docker-compose.yml
빠르게 docker-compose.yml을 작성해보자.
version: "3"
networks:
t4y:
driver: bridge
services:
prometheus:
image: prom/prometheus
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
ports:
- 9090:9090
command:
- "--storage.tsdb.path=/prometheus"
- "--config.file=/etc/prometheus/prometheus.yml"
restart: always
networks:
- t4y
grafana:
image: grafana/grafana
container_name: grafana
ports:
- 3000:3000
volumes:
- grafana-data:/var/lib/grafana
- ./grafana/provisioning/:/etc/grafana/provisioning/
restart: always
depends_on:
- prometheus
networks:
- t4y
node_exporter:
image: prom/node-exporter
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- "--path.procfs=/host/proc"
- "--path.rootfs=/rootfs"
- "--path.sysfs=/host/sys"
- "--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)"
ports:
- "9100:9100"
networks:
- t4y
volumes:
grafana-data:
prometheus-data:
이 docker-compose.yml은 Prometheus, Grafana, Node Exporter를 띄우는 스크립트이다. 여기서 네트워크와 볼륨은 세 서비스 간의 데이터 및 통신을 위해서 사용하는 것이고, 각각 9090, 3000, 9100번 포트를 사용한다.
프로메테우스 이미지가 뜰 때, 같은 디렉터리에 존재하는 prometheus.yml을 함께 물고 뜨기 때문에 관련한 설정을 추가해야한다. 같은 디렉토리에 아래의 설정을 추가한다.
global:
scrape_interval: 15s
scrape_timeout: 15s
evaluation_interval: 2m
external_labels:
monitor: "codelab-monitor"
query_log_file: query_log_file.log
scrape_configs:
- job_name: "monitoring-item"
scrape_interval: 10s
scrape_timeout: 10s
metrics_path: "/metrics"
scheme: "http"
static_configs:
- targets: ["prometheus:9090", "node_exporter:9100"]
labels:
service: "monitor"
여기서 중요한 포인트는 targets이다. 안에 들어가 있는 것이 localhost:9090과 localhost:9100가 아니라 prometheus:9090과 node_exporter:9100으로 뜨게 된다.
이는 docker 환경에서 compose로 같이 뜨는 경우 서버의 url을 애플리케이션의 이름의 사용하게 된다. 따라서 추후에 url 등을 통해서 서버 간의 통신을 연결할 때, localhost로 적는 일은 없도록 한다! 하지만 모든 컨테이너의 포트 바운딩을 시켜주었기 때문에 ( ports : "9100:9100" ) 로컬에서 직접 접속하는 경우에는 localhost로 접속할 수 있다.
다음 명령어로 docker-compose를 실행시키면 금방 서버가 뜨는 것을 확인할 수 있다.
docker-compose up -d
자 이제 각각의 컨테이너 포트를 살펴보면서 어떤 일들이 일어나고 있는지 확인해 보자. 먼저 localhost의 9100번 포트로 접속하면 node-exporter가 떠서, 매트릭을 내뿜는 것을 확인할 수 있다.
위 Metrics를 누르면 localhost:9100/metrics로 이동하게 되고, 다음과 같은 정보들을 확인할 수 있다. 여기서 새로고침 버튼을 누르면 계속 정보가 바뀌는 것을 볼 수 있게 된다.
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 2.1209e-05
go_gc_duration_seconds{quantile="0.25"} 5.3708e-05
go_gc_duration_seconds{quantile="0.5"} 7.7041e-05
go_gc_duration_seconds{quantile="0.75"} 9.6624e-05
go_gc_duration_seconds{quantile="1"} 0.000179375
go_gc_duration_seconds_sum 0.002874784
go_gc_duration_seconds_count 35
# HELP go_goroutines Number of goroutines that currently exist.
# TYPE go_goroutines gauge
go_goroutines 9
# HELP go_info Information about the Go environment.
# TYPE go_info gauge
go_info{version="go1.22.3"} 1
# HELP go_memstats_alloc_bytes Number of bytes allocated and still in use.
# TYPE go_memstats_alloc_bytes gauge
go_memstats_alloc_bytes 2.827264e+06
# HELP go_memstats_alloc_bytes_total Total number of bytes allocated, even if freed.
# TYPE go_memstats_alloc_bytes_total counter
go_memstats_alloc_bytes_total 6.8836736e+07
# HELP go_memstats_buck_hash_sys_bytes Number of bytes used by the profiling bucket hash table.
# TYPE go_memstats_buck_hash_sys_bytes gauge
go_memstats_buck_hash_sys_bytes 1.477032e+06
# HELP go_memstats_frees_total Total number of frees.
# TYPE go_memstats_frees_total counter
go_memstats_frees_total 992647
...
이러한 노출된 매트릭을 프로메테우스가 수집해 가게 되는데, 이는 localhost:9090(Prometheus)에서 직접 쿼리를 통해 확인할 수 있다. prometheus.yml을 정의할 때, targets의 파라미터로 넣은 컨테이너를 수집해 오게 된다. 따라서 로컬호스트의 node-exporter의 매트릭뿐만 아니라, 클러스터링을 하려고 한다면 다른 컨테이너의 매트릭을 수집할 수 있는 셈이다.
우리는 대시보드를 만들 것이기 때문에 localhost:3000에서 그라파나 대시보드를 확인해 보자.
기본 username/password는 admin/admin이다. 접속하면 기본적인 대시보드를 확인할 수 있다.
이제 여기서 먼저 prometheus를 연결해줘야 한다. 왼쪽의 Connections - Data source를 통해서 prometheus를 연결한다.
여기서 중요한 포인트는 grafana와 prometheus는 컨테이너로 떠있는 상황이고, docker-compose를 통해 돌아가고 있다는 점이다. 따라서 두 컨테이너 간의 통신을 위해 url을 달아줄 때, http://{docker-compose.yml에 적은 services 명}:9090으로 Connection에 적어줘야 한다는 점이다.
url을 적어준 후 Save & test를 눌러 프로메테우스를 연결한다. 이렇게 되면 node-exporter - prometheus - grafana의 연결이 끝났고 의존성도 잘 물려받게 된다. 이제 대시보드에 들어가서 새로운 대시보드를 만들자.
여기서 직접 Create dashboard를 통해 만드는 것도 좋은 선택이지만, 다양한 사용자들이 대시보드를 공유하는 곳이 있다. 다음을 살펴보고, new - import 그리고 마음에 드는 대시보드의 ID를 넣어주도록 한다. 찾아보면 1860이라는 node-exporter용 대시보드가 있는 것을 살펴볼 수 있다.
- grafana labs dashboards : https://grafana.com/grafana/dashboards/
id에 1860을 입력하고, prometheus를 마저 연결해 주면 아래와 같은 창이 뜬다.
이제 여기서 import를 눌러주면 대시보드를 확인할 수 있다.
여기까지 하면 본인의 컴퓨터에서 9100 포트로 뿜어져 나오는 매트릭을 수집하고 모니터링하는 과정이 끝났다.
Linux에서 node-exporter 세팅
이러한 node-exporter를 내 localhost에서 실행시킨다면 위의 docker-compose.yml을 실행하는 것으로 끝낼 수 있다. 하지만 다른 노드들을 확인하기 위해서라면, 다른 서버에서 node-exporter를 실행시켜야 한다.
이번에는 linux에서 직접 node-exporter를 올리는 스크립트를 살펴보려고 한다. 맨 앞에 달아뒀던 예제 코드에서 node-exporter-init.sh에 해당한다.
# download tar
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.1/node_exporter-1.8.1.linux-amd64.tar.gz
tar xvfz node_exporter-1.8.1.linux-amd64.tar.gz
mv node_exporter-1.8.1.linux-amd64/node_exporter /usr/local/bin/
# insert script
cat <<EOF > /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
EOF
# always
systemctl enable node_exporter.service
# start
systemctl start node_exporter.service
# check status
systemctl status node_exporter.service
위 스크립트를 실행하는 것으로 node_exporter를 실행시킬 수 있다. 하나씩 과정을 뜯어보면 다음과 같다.
1. linux 기반의 node-exporter를 다운로드한다.
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.1/node_exporter-1.8.1.linux-amd64.tar.gz
tar xvfz node_exporter-1.8.1.linux-amd64.tar.gz
mv node_exporter-1.8.1.linux-amd64/node_exporter /usr/local/bin/
2. /etc/systemd/system/node_exporter.service 파일을 vi로 편집하여 다음의 내용을 추가한다.
[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
3. systemctl 명령어를 통해 실행 및 환경설정
# node_exporter가 항상 실행되도록 설정
systemctl enable node_exporter.service
# node_exporter 실행
systemctl start node_exporter.service
# 상태 확인
systemctl status node_exporter.service
이제 node_exporter의 상태가 정상적으로 작동하고 있다고 뜨게 될 것이다. 그라파나 대시보드를 띄우는 곳에서 prometheus.yml을 수정해 targets에 다른 노드들을 추가하면 추가적으로 매트릭을 수집할 수 있게 된다.
참고
- [Velog] su_under : https://velog.io/@su_under/Docker%EC%99%80-Prometheus-Grafana-%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0
- [blog] 진반장 : https://xinet.kr/?p=3939
감사합니다.
'Data Engineering' 카테고리의 다른 글
prometheus와 grafana로 redis 서버 모니터링 (0) | 2024.07.16 |
---|---|
Prometheus란? (1) | 2024.07.14 |