Zum Hauptinhalt springen

Node Exporter

Node Exporter는 Linux 시스템의 하드웨어 및 운영체제 수준 메트릭을 수집하여 Prometheus에 노출하는 도구입니다. Lumie 클러스터의 모든 노드에 DaemonSet 형태로 배포되어 CPU, 메모리, 디스크, 네트워크 등 시스템 전반의 상태를 모니터링합니다. 현재 클러스터는 마스터 노드 1개와 워커 노드 3개(worker-2, worker-3, worker-4)로 구성되며, 총 4개의 Node Exporter 파드가 실행됩니다.

배포 구성

  • 네임스페이스: node-exporter
  • 차트: prometheus-node-exporter v4.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_totalCPU 모드별 누적 시간 (idle/user/system 등)
node_load1 / node_load5 / node_load151/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 섹션 확인

관련 문서