티스토리 뷰

Node-Exporter란?

Node-Exporter는 서버의 하드웨어 및 OS 메트릭을 수집하는 오픈 소스 에이전트입니다. 이는 CPU, 메모리, 디스크 사용량, 네트워크 상태, 시스템 부하 등과 같은 다양한 서버 메트릭을 수집합니다. Node-Exporter는 Prometheus 모니터링 툴과 함께 사용되어 이러한 메트릭을 시각화하고 분석하는 데 도움을 줍니다.

Prometheus란?

Prometheus는 오픈 소스 모니터링 시스템으로, 시계열 데이터를 수집하여 저장하고, 규칙 기반의 경고와 쿼리를 실행할 수 있습니다. Prometheus는 다양한 소스에서 메트릭을 수집하는 여러 에이전트와 통합할 수 있는 강력한 도구로, 이 데이터를 활용하여 시스템의 건강 상태를 모니터링하고, 잠재적 문제를 신속하게 식별할 수 있습니다.

Grafana란?

Grafana는 모니터링 데이터를 시각화하는 데 사용되는 오픈 소스 대시보드 툴입니다. 다양한 데이터 소스를 연동할 수 있으며, 그 중에서도 Prometheus와의 통합이 매우 우수합니다. Grafana를 사용하면 복잡한 시계열 데이터를 이해하기 쉬운 그래프와 차트로 나타내어 데이터 분석을 간소화할 수 있습니다.

 

도커(Docker)의 이점

  • 표준화된 배포: 도커를 사용하면 Node-Exporter, Prometheus, Grafana를 컨테이너로 표준화하여 배포할 수 있습니다. 이는 환경에 구애받지 않고 일관된 방식으로 애플리케이션을 배포하는 데 도움이 됩니다.
  • 이식성: 도커 컨테이너는 도커가 설치된 어느 곳에서나 실행될 수 있으므로, 다양한 환경에 쉽게 이식할 수 있습니다.
  • 종속성 관리: 모든 의존성이 컨테이너 내에 포함되므로, 다른 시스템에서 동일한 설정을 재현하는 데 용이합니다.
  • 빠른 배포와 확장성: 도커 컨테이너는 빠르게 시작되므로, 필요에 따라 신속하게 모니터링 시스템을 확장하거나 축소할 수 있습니다.
  • 분리된 환경: 각 컨테이너는 다른 컨테이너와 분리되어 실행되므로, 응용 프로그램 간의 충돌 없이 동시에 여러 서비스를 실행할 수 있습니다.

구축 방법

1. node-exporter 도커에 설치 (운영 서버)

$ sudo docker pull prom/node-exporter

$ sudo docker run -d \
    -p 9100:9100 \
    prom/node-exporter

여기서 -d 플래그는 컨테이너를 백그라운드에서 실행하며, -p 플래그는 호스트와 컨테이너 간의 포트를 매핑합니다.

2. docker-compose로 prometheus와 grafana 한번에 도커에 설치 (모니터링 서버)

! docker와 docker compose가 설치가 되어있어야 한다.

 

prometheus.yml

global:
  scrape_interval: 1m

scrape_configs:
  - job_name: "prometheus"
    scrape_interval: 1m
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "node"
    static_configs:
      - targets: ["node-exporter-ip:9100"]

prometheus.yml 파일을 통해 Prometheus가 Node-Exporter로부터 메트릭을 수집하도록 설정합니다.  이때, node-exporter-ip는 운영 서버, 즉 node-exporter를 설치한 서버의 ip로 수정합니다. 

 

docker-compose.yml

version: '3'

networks:
  monitor:
    driver: bridge

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
     //[경로]/prometheus/:/etc/prometheus/
      - /home/monitor/prometheus/:/etc/prometheus/
    ports:
      //프로메테우스 포트
      - 9090:9090
    command:
      - "--web.enable-lifecycle"
      - "--config.file=/etc/prometheus/prometheus.yml"
    restart: always
    networks:
      - monitor
    user: root

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    volumes:
      //[경로]/grafana
      - /home/monitor/grafana:/var/lib/grafana
      - /home/monitor/grafana/provisioning:/etc/grafana/provisioning
    environment:
      - GF_SECURITY_ADMIN_USER=아이디
      - GF_SECURITY_ADMIN_PASSWORD=비밀번호
      - GF_USERS_ALLOW_SIGN_UP=false
    restart: always
    networks:
      - monitor
    ports:
      //그라파나 포트
      - 3000:3000
    user: root
    depends_on:
      - prometheus

docker-compose.yml 파일을 작성하여 Prometheus와 Grafana를 동시에 설치하고 구성할 수 있습니다.

GF_SECURITY_ADMIN_USERGF_SECURITY_ADMIN_PASSWORD는 Grafana에 로그인할 때 사용할 관리자 계정의 이름과 비밀번호입니다.

 

 

마지막으로, 다음 명령어를 실행하여 모든 서비스를 시작합니다.

sudo docker-compose up -d

이게 뜨고

 

이제 서버 모니터링 시스템이 구축되었으며, 브라우저에서 내 IP:3000을 통해 Grafana 대시보드에 접속할 수 있습니다.

 

Prometheus와 Grafana를 별도의 서버에 두어야 하는 이유

물론, Node-Exporter는 운영 서버에 두어야 합니다.

Node-exporter는 각 노드(운영 서버)에서 하드웨어 및 OS 지표(metrics)를 수집하는 프로세스입니다.
이는 서버의 CPU, 메모리, 디스크, 네트워크 상태 등의 지표를 제공하기 때문에, 각각의 서버에 설치되어야 합니다.
Node-exporter는 수집된 데이터를 Prometheus가 스크래핑(scraping)할 수 있는 형태로 제공해야 하므로, 모니터링 대상이 되는 서버에서 직접 실행되어야 합니다.

 

하지만, Prometheus와 Grafana는 별도의 서버에 둘 수 있습니다. 
Prometheus는 시계열 데이터를 수집, 저장, 처리 및 쿼리하는 모니터링 시스템입니다. Prometheus 서버는 원격 시스템에서 지표를 수집하기 위해 HTTP 요청을 사용하여 node-exporter 같은 exporter들로부터 데이터를 주기적으로 가져옵니다(scrape). Prometheus는 중앙 집중화된 시스템으로서 동작하며, 여러 노드로부터 데이터를 수집할 수 있기 때문에, 별도의 서버에 설치되어 모든 node-exporter에서 데이터를 수집할 수 있습니다.
Grafana는 수집된 데이터를 시각화하고 대시보드를 제공하는 도구입니다. Grafana는 Prometheus 서버에서 데이터를 쿼리하여 사용자에게 시각화된 형태로 제공합니다. 데이터를 시각화하는 데 있어, 이러한 작업은 많은 리소스를 필요로 하지 않으며, 주로 읽기 작업이기 때문에 분산 배치가 가능합니다.

 

별도의 서버에 두는 것이 더 이점이 있습니다.

  • 리소스 사용 최적화: Node-exporter가 각 서버에 설치되어 있음으로써, 서버의 상태를 로컬에서 직접 모니터링할 수 있습니다. 반면 Prometheus와 Grafana는 높은 리소스를 필요로 하는 작업(예: 데이터베이스 작업, 대규모 데이터의 시각화)을 수행하기 때문에, 이들을 별도의 서버에 배치함으로써 각 서버의 부하를 분산시키고 성능 저하를 방지할 수 있습니다.
  • 보안 및 격리: 중요한 모니터링 데이터베이스인 Prometheus를 분리함으로써 보안을 강화할 수 있습니다. Prometheus 서버를 내부 네트워크에 안전하게 배치하여 민감한 데이터의 노출 위험을 줄일 수 있습니다.
  • 고가용성과 장애 복구: Prometheus와 Grafana를 별도의 서버에 배치하면, 운영 서버가 실패하더라도 모니터링 서비스가 계속 작동할 수 있습니다. 이는 전체 인프라의 모니터링이 단일 서버의 장애에 의존하지 않도록 합니다.
  • 확장성: Prometheus는 수집된 데이터의 양이 많아지면 리소스 요구량이 증가합니다. 따라서, Prometheus와 Grafana를 분리하고 별도의 서버에 배치하면 시스템이 더 많은 데이터와 요청을 처리할 수 있도록 확장하기 용이합니다.

이러한 이유로, node-exporter는 감시 대상 서버에 설치하고, Prometheus와 Grafana는 별도의 서버에 설치하여 더 나은 성능, 확장성, 보안, 고가용성을 달성합니다.

 

최종적으로 시스템 아키텍처를 그려보면 다음과 같습니다!

'Infra' 카테고리의 다른 글

[Docker] Docker 사용하지 않는 도커 이미지 일괄 삭제  (0) 2023.11.23