TIL

Node Exporter 네트워크 수집 문제

하얀잔디 2025. 10. 29. 22:09

오늘은 Node Exporter로 서버 네트워크 트래픽을 수집하다가,
수치가 비정상적으로 너무 낮게 나오거나 일부 인터페이스만 보이는 문제를 겪음.
원인은 단순했는데, Docker 네트워크 네임스페이스 격리 때문이었음.

 

 


 

 문제 상황

 

prom/node-exporter 이미지를 Docker Compose로 올렸는데,


curl localhost:9100/metrics | grep node_network_receive_bytes_total

curl localhost:9100/metrics | grep node_network_receive_bytes_total

명령어 했을 때


이상하게 eth0 대신 docker0, veth 등 일부 인터페이스만 보였음.

 

즉, 호스트 전체 트래픽이 아니라 컨테이너 내부 네트워크만 수집되고 있었음.

 


 

🧠 원인 분석

Docker 컨테이너는 기본적으로 자기만의 네트워크 네임스페이스를 가짐.
즉, 컨테이너 안에서는 호스트의 eth0이 아니라
컨테이너용 가상 NIC(veth, docker0 등) 만 보임.

Node Exporter는 /proc/net/dev에서 네트워크 통계를 읽는데,
이 파일도 네임스페이스 기준으로 분리되어 있음.

 

→ 결국 network_mode: bridge 기본 모드에서는
호스트 NIC 정보를 전혀 못 봄.


✅ 해결 방법

docker-compose.yml에 network_mode: host 추가.

services:
  node_exporter:
    image: prom/node-exporter
    container_name: node_exporter
    command:
      - '--path.rootfs=/host'
    pid: host
    network_mode: host
    restart: unless-stopped
    volumes:
      - '/:/host:ro,rslave'
 

network_mode: host를 주면

 


컨테이너가 호스트와 동일한 네트워크 네임스페이스를 사용함.

즉, 컨테이너 안에서도 /proc/net/dev이
호스트의 실제 eth0, bond0 등 물리 NIC 정보를 반영하게 됨.


📊 적용 후 결과

적용 전에는 eth0 트래픽이 7MB 수준이었는데,
적용 후에는 eth0, docker_gwbridge, veth* 등 실제 트래픽이 모두 집계됨.

 
node_network_receive_bytes_total{device="eth0"} 2.68e+11 node_network_receive_bytes_total{device="docker_gwbridge"} 1.13e+11 node_network_receive_bytes_total{device="veth..."} ...

sar -n DEV 1 5 명령어로 확인해보면
eth0 기준 초당 10~50MB/s 수준의 실제 트래픽과 일치함.


⚠️ 주의할 점

  1. ports: 설정은 제거
    • network_mode: host를 쓰면 이미 호스트 포트를 그대로 사용함.
    • ports: 9100:9100 같이 명시하면 “포트 이미 점유됨” 에러 발생.
  2. 과대집계 주의
    • host 모드를 쓰면 모든 인터페이스(veth, docker0, br-*, lo 등)가 다 노출됨.
    • Grafana/Prometheus에서 쿼리할 때 물리 NIC만 필터링 필요.→ byte/s → bit/s 변환 (*8)
    •  
      rate(node_network_receive_bytes_total{device=~"eth0|ens.*"}[5m]) * 8
  3. pid: host 도 같이 사용
    • 프로세스 정보(/proc/stat 등)도 호스트 기준으로 보려면 pid: host 필요.

🧩 결론

“Node Exporter의 네트워크 수집이 안 되는 이유는 exporter가 컨테이너 네트워크 안에 갇혀 있었기 때문”

  • network_mode: host → 네트워크 정보 접근 가능
  • pid: host → 프로세스 정보 접근 가능
  • --path.rootfs=/host → 파일 시스템 경로 접근 가능

이 세 가지를 조합해야 정상적인 호스트 모니터링이 가능함.


📘 정리

항목설명
network_mode: host 호스트 네트워크 사용 (eth0 트래픽 접근 가능)
pid: host 호스트 프로세스 접근 가능
--path.rootfs=/host 호스트 파일 시스템 접근 가능
/:/host:ro,rslave 호스트 전체를 읽기 전용 마운트
ports: 제거 이미 host 네트워크 공유 중이므로 불필요

🧠 결론 요약

Node Exporter 네트워크 수집 안될 때 가장 먼저 확인할 것

  • network_mode: host 빠져있지 않은가?
  • /proc/net/dev이 실제 NIC 기준인지 확인
  • PromQL에서 가상 NIC 필터링 되어있는지 점검