Docker 기반으로 빠르게 구축하는 Prometheus-Grafana-Alertmanager 모니터링 스택

모니터링 네트워크 설정 및 Prometheus 배포

먼저, 컨테이너 간 통신을 위한 전용 네트워크를 생성하고, Prometheus 구성 파일을 준비합니다.

docker network create monitoring
mkdir -p /etc/prometheus
vim /etc/prometheus/prometheus.yml

이후 다음 명령어로 Prometheus 컨테이너를 실행합니다:

docker run -itd --name prometheus \
--net=monitoring \
-p 9090:9090 \
--restart always \
-v /etc/prometheus:/etc/prometheus \
-v prometheus-data:/prometheus \
prom/prometheus:v2.53.2

기본 설정 파일 /etc/prometheus/prometheus.yml 예시:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets: []

rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

Grafana 설치 및 초기 설정

Grafana는 시각화 대시보드를 제공합니다. 다음 명령어로 컨테이너를 시작합니다:

docker run -d --name=grafana \
--net=monitoring \
-p 3000:3000 \
--restart always \
-v grafana-data:/var/lib/grafana \
grafana/grafana

웹 인터페이스에 접속하여 기본 로그인 정보 admin/admin로 로그인 후 비밀번호를 변경합니다. 이후 데이터 소스 추가를 통해 Prometheus와 연결합니다:

  • Home → Connections → Data Sources → Add Data Source → Prometheus
  • 주소 입력: http://<prometheus-host-ip>:9090
  • Save & Test로 연결 테스트

Node Exporter를 통한 서버 지표 수집

노드 수준의 시스템 메트릭(메모리, CPU, 디스크 등)을 수집하기 위해 Node Exporter를 설치합니다.

tar -xzvf node_exporter-1.8.2.linux-amd64.tar.gz -C /opt
cd /opt
ln -sv node_exporter-1.8.2.linux-amd64 node_exporter
useradd prometheus && echo "prometheus:prometheus" | chpasswd
chage -M 99999 prometheus
chown -R prometheus:prometheus /opt/node_exporter-1.8.2.linux-amd64/

시스템 서비스로 등록합니다:

vim /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network-online.target

[Service]
Type=simple
User=prometheus
Group=prometheus
ExecStart=/opt/node_exporter/node_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target

서비스 활성화 및 시작:

systemctl daemon-reload
systemctl enable node_exporter.service
systemctl start node_exporter.service

Prometheus에 노드 모니터링 추가

다음과 같이 prometheus.yml에 새로운 수집 작업을 추가합니다:

scrape_configs:
  - job_name: 'linux-server'
    metrics_path: '/metrics'
    scheme: http
    static_configs:
      - targets: ['192.168.16.170:9100']

변경 사항 적용을 위해 Prometheus 컨테이너에 신호 전달:

docker exec -it prometheus kill -HUP 1

Grafana에서 대시보드 임포트

다음 단계로 시각화 대시보드를 가져옵니다:

  1. Grafana 웹 UI → Dashboards → New → Import a dashboard
  2. Dashboard ID: 12633 입력
  3. Load → 이름 설정 및 데이터 소스 선택 → Import 완료

cAdvisor를 통한 컨테이너 모니터링

컨테이너 성능 지표 수집을 위해 cAdvisor를 배포합니다:

docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/cadvisor/cadvisor-amd64:v0.49.1
docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/cadvisor/cadvisor-amd64:v0.49.1 gcr.io/cadvisor/cadvisor-amd64:v0.49.1
docker rmi swr.cn-north-4.myhuaweicloud.com/ddn-k8s/gcr.io/cadvisor/cadvisor-amd64:v0.49.1

컨테이너 실행:

docker run -d --name=cadvisor \
--publish=8080:8080 \
--restart always \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--detach=true \
--privileged \
--device=/dev/kmsg \
gcr.io/cadvisor/cadvisor-amd64:v0.49.1

모니터링 페이지 확인:

  • http://<host-ip>:8080
  • http://<host-ip>:8080/metrics

Prometheus에 cAdvisor 추가 및 대시보드 임포트

prometheus.yml에 다음과 같이 작업 추가:

  - job_name: 'docker-server'
    static_configs:
      - targets: ['192.168.16.170:8080']

변경사항 반영:

docker exec -it prometheus kill -HUP 1

Grafana에서 다음 대시보드 임포트:

  • Dashboard ID: 14282
  • 임포트 후 이름 및 데이터 소스 설정

Alertmanager 설정 및 알림 구성

알림 처리를 위한 Alertmanager를 배포합니다:

mkdir -p /etc/alertmanager
vim /etc/alertmanager/alertmanager.yml

예시 설정 파일:

global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.163.com:25'
  smtp_from: 'test@163.com'
  smtp_auth_username: 'test@163.com'
  smtp_auth_password: 'XXXXXX'
  smtp_require_tls: false

route:
  receiver: 'default-receiver'
  group_by: [alertname]
  group_wait: 1m
  group_interval: 5m
  repeat_interval: 30m

receivers:
- name: 'default-receiver'
  email_configs:
  - to: 'test@yeah.net'
    send_resolved: true

컨테이너 실행:

docker run -d --name=alertmanager \
--net=monitoring \
-v /etc/alertmanager:/etc/alertmanager \
-p 9093:9093 \
--restart always \
prom/alertmanager

Prometheus 알림 목적지 설정

Prometheus 설정 파일에 Alertmanager 주소를 추가합니다:

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['192.168.16.170:9093']

설정 재적용:

docker exec -it prometheus kill -HUP 1

사용자 정의 알림 규칙 작성

규칙 파일은 /etc/prometheus/rules/ 폴더에 저장됩니다.

서버 리소스 과부하 감지 규칙 (linux-server.yml):

groups:
- name: Linux-Server
  rules:
  - alert: HighCPUUsage
    expr: 100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[2m])) by (instance) * 100) > 80
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "{{ $labels.instance }} CPU 사용률 초과"
      description: "{{ $labels.instance }} CPU 사용률 {{ $value }}% 이상"

  - alert: HighMemoryUsage
    expr: 100 - (node_memory_MemFree_bytes + node_memory_Cached_bytes + node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100 > 80
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "{{ $labels.instance }} 메모리 사용률 초과"
      description: "{{ $labels.instance }} 메모리 사용률 {{ $value }}% 이상"

  - alert: HighDiskSpaceUsage
    expr: 100 - (node_filesystem_free_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext4|xfs"} * 100) > 80
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "{{ $labels.instance }} {{ $labels.mountpoint }} 디스크 사용률 초과"
      description: "{{ $labels.instance }} {{ $labels.mountpoint }} 사용률 {{ $value }}% 이상"

목표 연결 실패 감지 (general.yml):

groups:
- name: General
  rules:
  - alert: InstanceDown
    expr: up == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "{{ $labels.instance }} 연결 실패"
      description: "{{ $labels.instance }} 접근 불가, 시스템 장애 가능성 있음"

최종 prometheus.yml에 규칙 파일 포함:

rule_files:
  - "./rules/linux-server.yml"
  - "./rules/general.yml"

재시작 후 알림 상태 확인 가능:

  • http://<prometheus-host-ip>:9090/alerts
  • http://<prometheus-host-ip>:9090/rules
  • http://<alertmanager-host-ip>:9093/#/alerts

알림 테스트 및 검증

실제 알림을 트리거하기 위해 stress 도구로 부하 테스트 수행:

dnf install -y epel-release && dnf install stress -y
stress --cpu 8
# Ctrl+C로 종료

커스텀 알림 템플릿 설정

Alertmanager에서 더 직관적인 알림 메시지를 위해 템플릿을 사용할 수 있습니다.

  1. /etc/alertmanager 디렉토리에 .tmpl 확장자 파일 생성
  2. Alertmanager 설정 파일에 templates 필드로 경로 지정
  3. 수신자 설정에서 해당 템플릿 이름 참조
  4. Config reload 또는 재시작으로 적용

태그: prometheus Grafana AlertManager docker cAdvisor

7월 28일 11:28에 게시됨