Prometheus에서 Docker Swarm Service Discovery 활용하기

By deuk9

Docker Swarm 환경에서 Prometheus를 활용해 노드, 태스크, 서비스의 메트릭을 동적으로 수집하는 방법을 소개합니다. 기존의 정적 설정 방식과 달리, dockerswarm_sd_configs를 사용하면 Swarm 내부의 변화에 따라 자동으로 타겟을 갱신할 수 있습니다.

Prometheus 설정 (prometheus.yml)

아래 설정을 적용하면 Docker Swarm의 노드, 태스크, 서비스를 자동으로 검색하고 메트릭을 수집할 수 있습니다.

scrape_configs:
  - job_name: "swarm-nodes"
    dockerswarm_sd_configs:
      - host: tcp://localhost:2375
        role: nodes
        port: 9100
  - job_name: "swarm-tasks"
    dockerswarm_sd_configs:
      - host: tcp://localhost:2375
        role: tasks
    metrics_path: "/actuator/prometheus"
  - job_name: "swarm-services"
    dockerswarm_sd_configs:
      - host: tcp://localhost:2375
        role: services

dockerswarm_sd_configs에서 role 설명

  • nodes: Swarm 클러스터의 각 노드에서 실행되는 Exporter (예: Node Exporter)를 대상으로 메트릭 수집
  • services: Swarm 서비스 단위로 메트릭을 수집하지만, 로드 밸런싱 문제로 인해 특정 컨테이너의 데이터를 지속적으로 수집하는 것이 어렵습니다.
  • tasks: 개별 컨테이너 단위로 모니터링 (예: Spring Actuator 활용)

역할별 활용 방안

1.nodes

  • 각 Swarm 노드에서 실행 중인 Node Exporter와 같은 모니터링 컨테이너를 감지하여 메트릭을 수집합니다.
  • 노드 레벨의 시스템 리소스 사용량을 확인할 때 유용합니다.

2.services

  • 특정 서비스에 대한 메트릭을 수집할 수 있지만, Swarm의 로드 밸런싱으로 인해 특정 컨테이너의 데이터를 지속적으로 수집하는 것이 어렵습니다.
  • 따라서, 개별 컨테이너 단위의 모니터링이 필요할 경우 tasks를 활용하는 것이 더 적합합니다.

3.tasks

  • tasks는 개별 컨테이너의 메트릭을 수집하는 방식으로, Spring Boot Actuator 등과 연계하여 효과적으로 활용할 수 있습니다.
  • 제가 설정방법을 찾지 못했을 수도 있으나 아래와 같은 문제가 있었습니다.
  • 주의 사항:
    • tasks의 포트 설정을 별도로 지정할 수 없습니다.
    • 테스트 결과 내부 네트워크 IP + publish port 로 접근하려고 합니다.
    • 내부 네트워크 IP (10.x.x.x)와publish port로 접근하지만, 내부 네트워크에서는 target port로 접근해야 정상적으로 데이터를 수집할 수 있습니다.
    • docker run -p 8080:8080처럼publish portinner port를 동일하게 설정해야 정상적인 모니터링이 가능합니다.

참고자료