Node Exporter
Node Exporter는 Linux 시스템의 하드웨어 및 운영체제 수준 메트릭을 수집하여 Prometheus에 노출하는 도구입니다. Lumie 클러스터의 모든 노드에 DaemonSet 형태로 배포되어 CPU, 메모리, 디스크, 네트워크 등 시스템 전반의 상태를 모니터링합니다. 현재 클러스터는 마스터 노드 1개와 워커 노드 3개(worker-2, worker-3, worker-4)로 구성되며, 총 4개의 Node Exporter 파드가 실행됩니다.
배포 구성
- 네임스페이스:
node-exporter - 차트:
prometheus-node-exporterv4.39.0 (prometheus-community) - 이미지:
zot.lumie-infra.com/prometheus/node-exporter:v1.8.2 - 배포 형태: DaemonSet (모든 노드에 1개씩 배포)
아키텍처
핵심 설정
호스트 접근 권한
Node Exporter는 호스트의 시스템 정보에 접근하기 위해 호스트 네트워크와 PID 네임스페이스를 공유합니다:
hostNetwork: true
hostPID: true
모든 노드 배포
마스터 노드를 포함한 모든 노드에 배포되도록 Toleration이 설정되어 있습니다:
tolerations:
- operator: Exists # 모든 Taint 허용
Prometheus 통합
ServiceMonitor 설정
prometheus:
monitor:
enabled: true
additionalLabels:
release: prometheus
namespace: "" # node-exporter 네임스페이스에 ServiceMonitor 생성
attachMetadata:
node: true # 노드 메타데이터를 메트릭 라벨에 추가
relabelings:
- targetLabel: cluster
replacement: "mayne-cluster"
attachMetadata.node: true를 설정하면 각 메트릭에 노드 이름과 관련 메타데이터가 자동으로 추가됩니다.
ServiceMonitor는 node-exporter 네임스페이스에 생성되어 동일 네임스페이스의 서비스를 자동으로 발견합니다(namespace: "").
서비스 구성
헤드리스 서비스로 각 파드에 직접 접근 가능합니다:
service:
type: ClusterIP
clusterIP: None
주요 메트릭
CPU
| 메트릭 | 설명 |
|---|---|
node_cpu_seconds_total | CPU 모드별 누적 시간 (idle/user/system 등) |
node_load1 / node_load5 / node_load15 | 1/5/15분 부하 평균 |
메모리
| 메트릭 | 설명 |
|---|---|
node_memory_MemTotal_bytes | 전체 메모리 용량 |
node_memory_MemAvailable_bytes | 사용 가능한 메모리 |
node_memory_MemFree_bytes | 빈 메모리 |
node_memory_Buffers_bytes | 버퍼 캐시 |
node_memory_Cached_bytes | 페이지 캐시 |
디스크
| 메트릭 | 설명 |
|---|---|
node_filesystem_size_bytes | 파일시스템 전체 크기 |
node_filesystem_avail_bytes | 사용 가능한 공간 |
node_disk_io_time_seconds_total | 디스크 I/O 시간 |
node_disk_read_bytes_total | 누적 읽기 바이트 |
node_disk_written_bytes_total | 누적 쓰기 바이트 |
네트워크
| 메트릭 | 설명 |
|---|---|
node_network_receive_bytes_total | 수신 바이트 누적 |
node_network_transmit_bytes_total | 송신 바이트 누적 |
node_network_receive_errs_total | 수신 오류 횟수 |
활용 예시
노드 CPU 사용률
# 노드별 CPU 사용률 (%)
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
노드 메모리 사용률
# 노드별 메모리 사용률 (%)
100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)
디스크 사용률
# 파일시스템별 디스크 사용률 (%)
100 * (1 - node_filesystem_avail_bytes{fstype!="tmpfs"} / node_filesystem_size_bytes{fstype!="tmpfs"})
네트워크 처리량
# 인터페이스별 수신 속도 (bytes/s)
irate(node_network_receive_bytes_total[5m])
리소스 설정
resources:
requests:
cpu: 15m
memory: 100Mi
limits:
memory: 100Mi # CPU 제한 없음 (안정성 우선)
문제 해결
특정 노드에서 메트릭이 수집되지 않는 경우
# 모든 노드의 Node Exporter 파드 상태 확인
kubectl get pods -n node-exporter -o wide
# 특정 노드의 Node Exporter 로그 확인
kubectl logs -n node-exporter -l app.kubernetes.io/name=node-exporter \
--field-selector spec.nodeName=<node-name>
# 직접 메트릭 엔드포인트 확인
kubectl port-forward -n node-exporter pod/<pod-name> 9100:9100
curl http://localhost:9100/metrics | head -50
ServiceMonitor 확인
# ServiceMonitor 상태 확인
kubectl get servicemonitor -n node-exporter
# Prometheus 타겟에서 node-exporter 확인
kubectl port-forward -n prometheus svc/prometheus-kube-prometheus-prometheus 9090:9090
# http://localhost:9090/targets 에서 node-exporter 섹션 확인