Prometheus 연방 구조를 이용한 분산 모니터링 시스템 구성

연방(Federation) 아키텍처 개요

대규모 인프라 환경에서는 단일 Prometheus 인스턴스로 모든 메트릭을 수집하기 어려울 수 있습니다. 이 경우, 각 로컬 데이터 센터나 리전에 독립된 Prometheus 서버를 배포하고, 이를 중앙 집중형 Prometheus 인스턴스에서 통합하는 방식이 효과적입니다. 이러한 구조를 Prometheus에서 제공하는 연방(Federation) 기능을 통해 구현할 수 있습니다.

연방은 특정 Prometheus 인스턴스가 다른 Prometheus 서버로부터 미리 집계된 메트릭 데이터를 가져와 통합하는 방식입니다. 핵심은 각 로컬 Prometheus 서버가 /federate 엔드포인트를 통해 외부에 노출되는 메트릭을 필터링하여 제공한다는 점입니다. 중앙 서버는 이 엔드포인트를 대상으로 스크랩(scrapping)을 수행하며, Exporter로부터 직접 수집하는 것과 동일한 방식으로 동작합니다.

시스템 구성도

  • 로컬 계층: 각 데이터 센터 내부의 노드에서 node-exporter를 통해 하드웨어 및 OS 지표 수집
  • 연방 노드: 로컬 Prometheus 인스턴스가 해당 지역의 Exporter 데이터를 수집
  • 중앙 노드: 여러 연방 노드의 /federate 엔드포인트를 스크랩하여 글로벌 뷰 제공

실습: 연방 기반 멀티 클러스터 구성

1. Prometheus 서버 설치 (100.131, 100.132, 100.133)

세 개의 호스트(192.168.100.131~133)에 동일한 버전의 Prometheus를 바이너리 방식으로 설치합니다. 설치 과정은 생략하며, 설정 파일 위치는 /etc/prometheus/prometheus.yml, 실행 포트는 기본값인 9090 사용을 가정합니다.

2. 모니터링 대상 노드에 node-exporter 배포 (100.134, 100.135)

대상 서버 두 대에 node-exporter를 설치하여 시스템 메트릭을 노출합니다. 각각 192.168.100.134:9100192.168.100.135:9100에서 접근 가능해야 합니다.

3. 연방 노드 설정: 로컬 데이터 수집

100.132 및 100.133에 위치한 Prometheus 인스턴스에 대해, 각각 대응하는 node-exporter를 대상으로 하는 scrape job을 정의합니다.

# 100.132 서버의 prometheus.yml
scrape_configs:
  - job_name: 'local-nodes-site-a'
    static_configs:
      - targets: ['192.168.100.134:9100']
# 100.133 서버의 prometheus.yml
scrape_configs:
  - job_name: 'local-nodes-site-b'
    static_configs:
      - targets: ['192.168.100.135:9100']

설정 후 각 인스턴스 재시작: systemctl reload prometheus

4. 중앙 Prometheus에서 연방 데이터 수집 설정

100.131에 위치한 중앙 Prometheus가 100.132와 100.133의 /federate 엔드포인트를 대상으로 스크랩하도록 구성합니다. 주의할 점은 metrics_path/federate로 변경하고, 필요한 메트릭만 필터링하기 위해 params.match[]를 사용하는 것입니다.

scrape_configs:

  - job_name: 'federate-center-site-a'
    scrape_interval: 15s
    honor_labels: true
    metrics_path: '/federate'
    params:
      match[]:
        - '{job="local-nodes-site-a"}'
        - '{__name__=~"node_(disk|cpu|memory).*"}'
    static_configs:
      - targets:
        - '192.168.100.132:9090'

  - job_name: 'federate-center-site-b'
    scrape_interval: 15s
    honor_labels: true
    metrics_path: '/federate'
    params:
      match[]:
        - '{job="local-nodes-site-b"}'
        - '{__name__=~"node_(disk|cpu|memory).*"}'
    static_configs:
      - targets:
        - '192.168.100.133:9090'

honor_labels: true는 충돌 방지를 위해 원격 서버의 레이블을 그대로 유지함을 의미합니다. match[] 파라미터는 정규 표현식 또는 레이블 셀렉터를 사용해 가져올 샘플을 제한합니다.

5. 검증

Prometheus 웹 UI(http://192.168.100.131:9090)에 접속하여 다음을 확인합니다:

  • Targets 탭에서 federate-center-site-a, federate-center-site-b 상태가 UP인지 확인
  • Graph 탭에서 node_memory_MemAvailable_bytes 등의 지표가 다수의 인스턴스에서 수집되었는지 조회

Grafana 대시보드에서도 각 site별 노드 리소스 사용량이 통합되어 표시되는지 확인할 수 있습니다.

태그: prometheus federation Monitoring node-exporter metrics-aggregation

6월 5일 22:11에 게시됨