Profile picture

[Docker] prometheus의 node-exporter로 서버 CPU, Memory 모니터링하기

JaehyoJJAng2024년 03월 03일

개요

prometheus, node-exporter, grafana를 사용하여 리눅스 기반 서버의 모니터링 대시보드를 구축해볼 것이다.


대략적인 구성은 다음과 같다.
image


위 사진을 기반으로 exporter -> prometheus -> grafana의 순서대로 데이터가 넘어가는 파이프라인 구조를 구축할거고,

각 서비스는 docker compose를 사용하여 도커 컨테이너로 띄울거다.

또한, node-exporter로 다른 노드들도 추가하는 방법까지 기록해보려고 한다.


운영 환경

모든 서비스들은 Docker 컨테이너로 배포되므로, 도커 및 도커 컴포즈 설치가 필요하다.


node-exporter

node-exporter들을 dockerhub에서 찾아보면 다음과 같은 exporter들이 쭈르륵 뜰거다.
image
여기서 prom/node-exporter를 사용해 노드들의 매트릭을 분출시키는 과정을 살펴보자!


prom/node-export를 눌러 docs를 읽어보면 다양한 활용 방법에 대한 예시가 나와있다.

파라미터나 yml 파일 작성할 때의 주의 사항 등 ..

필요에 따라 내용을 추가하거나 yml 파일을 커스터마이징하여 사용할 수도 있다.


YAML 작성


docker-compose.yml

아래 yaml은 위 링크를 참고하여 작성한 docker-compose.yml 파일이다.

services:
  prometheus:
    image: prom/prometheus
    restart: always
    container_name: prometheus
    volumes:
      - "./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml"
      - "prom-data:/prometheus"
    ports:
      - "9090:9090"
    command:
      - "--storage.tsdb.path=/prometheus"
      - "--config.file=/etc/prometheus/prometheus.yml"
    networks:
      - "monitor-net"
  
  grafana:
    image: grafana/grafana
    restart: always
    container_name: grafana
    depends_on:
      - "prometheus"
    volumes:
      - "grafana-data:/var/lib/grafana"
      - "./grafana/provisioning:/etc/grafana/provisioning"
    ports:
      - "3000:3000"
    networks:
      - "monitor-net"
    
  node_exporter:
    image: prom/node-exporter
    container_name: exporter    
    volumes:
      - "/proc:/host/proc:ro"
      - "/sys:/host/sys:ro"
      - "/:/rootfs:ro"
    ports:
      - "9100:9100"
    command:
      - "--path.procfs=/host/proc"
      - "--path.rootfs=/rootfs"
      - "--path.sysfs=/host/sys"
      - "--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)"      
    networks:
      - "monitor-net"

networks:
  monitor-net:
    driver: bridge
    external: false

volumes:
  prom-data: {}
  grafana-data: {}

docker-compose.yml 파일은 prometheus, grafana, node exporter를 컨테이너로 띄운다.

여기서 네트워크 및 볼륨은 세 서비스 간의 데이터 및 통신을 위해서 생성해준 것인데

네트워크의 경우에는 도커 컴포즈가 각 프로젝트마다 별도의 bridge 네트워크를 따로 생성해 컨테이너들을 묶어주기 때문에

굳이 필수로 넣어야 하는 옵션은 아니기는 하지만, 도커 네트워크를 추후에 명시적으로 넣어줄 수도 있으니까 나는 networks 항목을 넣어줬다.


prometheus.yml

prometheus 컨테이너를 명시할 때, 프로젝트 경로에 prometheus/prometheus.yml 파일을 volumes에 명시해줬기 때문에,

관련한 설정을 추가해줘야 한다.


docker-compose.yml 있는 경로에 아래 명령을 실행해 prometheus 디렉토리를 생성하자.

mkdir prometheus

그리고 아래 내용을 prometheus.yml 파일로 만들어주자.

vim prometheus/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가 아닌 컨테이너의 이름을 넣어주었다.

만약 prometheus 서버와 node_exporter 서버가 각각 다른 서버로 분리되어 있다면

위처럼 컨테이너 이름이 아닌 각 서버의 IP를 기입해줘야 한다.


그리고 여기서 컨테이너 이름 명시가 가능한 이유는 도커에서 지원하는 서비스 디스커버리(Service Discovery) 기능 때문이다.

자세한 내용은 구글에 검색해보는 걸로 하자.



도커 컴포즈 실행

이제 docker compose를 실행해보자.

docker-compose up -d

컨테이너 상태를 확인해보자.

watch docker-compose ps

image


메트릭 확인

localhost:9100으로 접속하여 node-exporter가 정상적으로 메트릭을 출력하고 있는지 확인해보자.
image
정상적으로 메트릭이 출력된다.


메트릭의 자세한 정보를 봐볼까?

위 "Metrics"를 클릭하면 localhost:9100/metrics로 이동하고, 거기서 아래와 같은 데이터를 확인할 수 있다. 여기서 새로고침을 누르면 계속해서 정보가 업데이트된다.
image



이렇게 노출된 메트릭을 프로메테우스가 수집해 가는데, 이는 localhost:9090으로 접속해 확인할 수 있다.
image


prometheus.yml 파일을 정의했을 때, targets의 파라미터로 넣은 컨테이너의 메트릭을 위와 같이 수집한다.

따라서 targets에 다른 노드들의 주소 값을 넣으면 해당 노드에 대한 메트릭도 수집할 수 있는 셈인거다.


그라파나 설정

이제 본격적으로 그라파나 대시보드를 만들어 볼거다.

그 전에, localhost:3000으로 접속해 그라파나 홈페이지로 접속하자.
image
초기 로그인 정보는 admin/admin 이다.


접속하면 기본적인 대시보드 화면으로 리다이렉트로 된다. image


먼저 메트릭을 그라파나와 연동하는 작업을 해줘야 한다.


메트릭 연동

prometheus를 연결할거다.

왼쪽 메뉴의 Connections - Data source를 통해서 prometheus를 연결할 수 있다.
image
image


여기서 확인해야 할 건 grafanaprometheus는 도커 컴포즈를 통해 컨테이너로 배포된 상황이다.

따라서 도커의 서비스 디스커버리 기능으로 url에 서비스명:포트만으로 prometheus 연동이 가능하다.
image


만약 prometheus, grafana 서버가 각각 다른 서버로 분리되어 있다면?

위에서 말했듯이 해당 서버의 IP:포트를 기입해야 한다.


URL을 적어준 후, Save & test를 클릭해 프로메테우스를 연결해주자.

이렇게 되면 node-exporter - prometheus - grafana의 연동이 끝났고 의존성도 물려받게 된다.
image

이제 대시보드를 만들어보자

그라파나 대시보드 생성

왼쪽 메뉴에서 Dashboards를 클릭해 대시보드 페이지로 이동하자.
image


여기서 Create dashboard로 자기만의 대시보드를 만드는 것도 좋지만,

그라파나가 처음이면 상당히 복잡하고 어려울거다. 나도 도저히 혼자 처음부터 만들 엄두가 안나서 다른 사용자들이 만든 대시보드를 사용하기로 했다.

다른 사용자들이 만든 대시보드들은 아래 링크에서 확인 가능하다.
https://grafana.com/grafana/dashboards/


나의 경우에는 1860 이라는 node-exporter용 대시보드를 선택했다.

id에 1860을 입력하고, prometheus를 마저 연결하면 아래와 같은 창이 뜬다.
image


여기서 import를 눌러주면 대시보드 확인이 가능하다.
image

자, 여기까지만 하면 내 컴퓨터(서버)에서 9100번 포트로 출력되는 메트릭을 수집하여 모니터링하는 과정이 끝나게 된다.

그렇지만 내 컴퓨터에서만 만족할 수는 없다.

다른 모니터링 해야 할 장비들이 내 컴퓨터만 있는 것은 아니니까!


클라이언트에 node-exporter 설정

이번 실습에서의 클라이언트 OS는 리눅스가 되겠다.

해당 클라이언트의 메트릭을 수집하여 모니터링 하기 위해, node-exporter를 클라이언트 서버에 설정해보자!


node-exporter 설치

  • 아래 단계를 차근차근 따라해보자.

1. 리눅스 기반의 node-exporter 다운로드

node-porter의 최신 release는 아래 링크에서 확인
https://github.com/prometheus/node_exporter/releases

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 --now node_exporter.service

# 상태 확인
systemctl status node_exporter.service

4. node_exporter가 정상 동작 중인지 netstat으로 확인해보자.

netstat -nltp

image
보면 9100번 포트가 정상 동작 중인 것을 볼 수 있을 거다.


5. prometheus.yml의 targets에 클라이언트 추가하기

이제 모니터링 서버로 다시 돌아가서

prometheus.yml 파일의 targets 속성에 해당 클라이언트의 정보를 추가해주자.
image


이제 해당 클라이언트의 메트릭도 수집하여 모니터링할 수 있게 되었다!
image


Loading script...