/엔지니어/클라우드/Prometheus + Node Exporter —
클라우드중급linuxprometheusmonitoringnode-exporter

Prometheus + Node Exporter — 서버 메트릭 모니터링 구축

Prometheus와 Node Exporter로 리눅스 서버의 CPU·메모리·디스크·네트워크 메트릭을 수집합니다. scrape_configs, PromQL 쿼리, 레코딩 룰, 보존 정책까지 실무 기준으로 구성합니다.

Prometheus 란?

Prometheus는 시계열(time series) 기반의 오픈소스 모니터링 시스템입니다. 핵심 특징은 Pull 방식 으로, Prometheus 서버가 주기적으로 대상(target)의 /metrics 엔드포인트를 긁어(scrape) 옵니다.

  • Pull 모델: 서버가 대상에 접속해 메트릭 수집
  • 다차원 데이터 모델: 메트릭 이름 + 레이블(label) 조합
  • PromQL: 강력한 시계열 쿼리 언어
  • 서비스 디스커버리: 정적 설정 + 동적 발견(K8s, Consul 등)

Node Exporter 는 리눅스 호스트의 CPU·메모리·디스크·네트워크 등 OS 레벨 메트릭을 노출하는 공식 exporter입니다.


아키텍처

CODE
[Node Exporter:9100] <--scrape-- [Prometheus:9090] --query--> [Grafana]
         (호스트 메트릭)               (TSDB 저장)            (시각화)
구성요소포트역할
Prometheus9090수집·저장·쿼리·알림
Node Exporter9100호스트 OS 메트릭 노출
Alertmanager9093알림 라우팅(선택)

1. Node Exporter 설치

Bash
VER=1.8.2
cd /tmp
curl -LO https://github.com/prometheus/node_exporter/releases/download/v${VER}/node_exporter-${VER}.linux-amd64.tar.gz
tar xzf node_exporter-${VER}.linux-amd64.tar.gz
sudo cp node_exporter-${VER}.linux-amd64/node_exporter /usr/local/bin/

sudo useradd --no-create-home --shell /bin/false node_exporter

systemd 서비스 /etc/systemd/system/node_exporter.service:

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

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
  --collector.systemd \
  --collector.processes

[Install]
WantedBy=multi-user.target
Bash
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
curl -s localhost:9100/metrics | head

node_cpu_seconds_total, node_memory_MemAvailable_bytes 같은 메트릭이 보이면 성공입니다.


2. Prometheus 설치

Bash
VER=2.53.0
cd /tmp
curl -LO https://github.com/prometheus/prometheus/releases/download/v${VER}/prometheus-${VER}.linux-amd64.tar.gz
tar xzf prometheus-${VER}.linux-amd64.tar.gz
cd prometheus-${VER}.linux-amd64
sudo cp prometheus promtool /usr/local/bin/
sudo mkdir -p /etc/prometheus /var/lib/prometheus
sudo cp -r consoles console_libraries /etc/prometheus/

3. prometheus.yml 구성

/etc/prometheus/prometheus.yml:

YAML
global:
  scrape_interval: 15s
  evaluation_interval: 15s
  external_labels:
    cluster: 'prod'

rule_files:
  - "/etc/prometheus/rules/*.yml"

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['localhost:9093']

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node'
    static_configs:
      - targets:
          - '192.168.1.31:9100'
          - '192.168.1.32:9100'
        labels:
          env: 'prod'
    relabel_configs:
      # instance 레이블을 호스트명처럼 깔끔하게
      - source_labels: [__address__]
        regex: '([^:]+):.*'
        target_label: host
        replacement: '$1'

설정 검증 후 실행:

Bash
promtool check config /etc/prometheus/prometheus.yml

/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus \
  --storage.tsdb.retention.time=30d \
  --web.enable-lifecycle

--web.enable-lifecycle 를 켜면 무중단 리로드가 가능합니다.

Bash
curl -X POST http://localhost:9090/-/reload

대상 상태는 웹 UI http://<서버>:9090/targets 또는:

Bash
curl -s 'http://localhost:9090/api/v1/targets' | jq '.data.activeTargets[].health'

4. 핵심 PromQL 쿼리

CPU 사용률(%)

PROMQL
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

메모리 사용률(%)

PROMQL
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100

디스크 사용률(%) — 루트 파티션

PROMQL
100 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100)

네트워크 수신 트래픽(bytes/s)

PROMQL
rate(node_network_receive_bytes_total{device!~"lo|veth.*"}[5m])

디스크 가득 참 예측(4시간 뒤 0 이하면 위험)

PROMQL
predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 4 * 3600) < 0

rate() 는 Counter(단조 증가) 메트릭에만 사용합니다. Gauge(증감하는 값, 예: 메모리)에는 rate를 쓰면 안 됩니다.


5. 레코딩 룰로 쿼리 비용 절감

자주 쓰는 무거운 쿼리는 미리 계산해 새 시계열로 저장합니다. /etc/prometheus/rules/node.yml:

YAML
groups:
  - name: node-recording
    interval: 30s
    rules:
      - record: instance:node_cpu_utilization:ratio
        expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

      - record: instance:node_memory_utilization:ratio
        expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100

Grafana나 알림에서는 instance:node_cpu_utilization:ratio 처럼 미리 계산된 값을 참조하면 됩니다.


6. 보존 정책과 스토리지

옵션의미
--storage.tsdb.retention.time=30d30일 보관
--storage.tsdb.retention.size=50GB용량 기준 보관

장기 보관·다중 클러스터 집계가 필요하면 Thanos나 VictoriaMetrics 같은 원격 스토리지를 연동합니다. 단일 Prometheus의 로컬 디스크는 단기 보관에 적합합니다.


정리

항목핵심
수집 방식Pull — Prometheus가 /metrics를 scrape
호스트 메트릭Node Exporter(:9100)
설정 검증promtool check config
무중단 리로드--web.enable-lifecycle + POST /-/reload
Counterrate() / Gauge
성능레코딩 룰로 사전 계산
보존retention.time / .size, 장기는 Thanos

Prometheus의 핵심은 "Counter는 rate, Gauge는 그대로"라는 메트릭 타입 구분과 PromQL 패턴입니다. Node Exporter로 OS 메트릭을 안정적으로 수집하면, 다음 단계인 Grafana 시각화와 알림으로 자연스럽게 확장할 수 있습니다.

#prometheus#monitoring#node-exporter#metrics
편집 안내 · Editorial Note

이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.

관련 공식 문서Prometheus 공식 문서

질문 & 답변 (Q&A)

이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.