오늘은 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* 등 실제 트래픽이 모두 집계됨.
sar -n DEV 1 5 명령어로 확인해보면
eth0 기준 초당 10~50MB/s 수준의 실제 트래픽과 일치함.
⚠️ 주의할 점
- ports: 설정은 제거
- network_mode: host를 쓰면 이미 호스트 포트를 그대로 사용함.
- ports: 9100:9100 같이 명시하면 “포트 이미 점유됨” 에러 발생.
- 과대집계 주의
- host 모드를 쓰면 모든 인터페이스(veth, docker0, br-*, lo 등)가 다 노출됨.
- Grafana/Prometheus에서 쿼리할 때 물리 NIC만 필터링 필요.→ byte/s → bit/s 변환 (*8)
-
rate(node_network_receive_bytes_total{device=~"eth0|ens.*"}[5m]) * 8
- 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 필터링 되어있는지 점검
'TIL' 카테고리의 다른 글
| Redis 한쪽노드에 메모리 몰린 경우 (0) | 2025.11.03 |
|---|---|
| Redis keys vs Scan 차이 (1) | 2025.11.02 |
| 닷넷 프레임워크 DLL 체험기 (0) | 2025.10.28 |
| DB CPU 스파이크 원인 추적기 (0) | 2025.10.27 |
| HTTPS 안전하지 않음 으로 바뀐다면 http 통신인가? (0) | 2025.10.23 |