모니터링 네트워크 설정 및 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에서 대시보드 임포트
다음 단계로 시각화 대시보드를 가져옵니다:
- Grafana 웹 UI → Dashboards → New → Import a dashboard
- Dashboard ID:
12633입력 - 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>:8080http://<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/alertshttp://<prometheus-host-ip>:9090/ruleshttp://<alertmanager-host-ip>:9093/#/alerts
알림 테스트 및 검증
실제 알림을 트리거하기 위해 stress 도구로 부하 테스트 수행:
dnf install -y epel-release && dnf install stress -y
stress --cpu 8
# Ctrl+C로 종료
커스텀 알림 템플릿 설정
Alertmanager에서 더 직관적인 알림 메시지를 위해 템플릿을 사용할 수 있습니다.
/etc/alertmanager디렉토리에.tmpl확장자 파일 생성- Alertmanager 설정 파일에
templates필드로 경로 지정 - 수신자 설정에서 해당 템플릿 이름 참조
- Config reload 또는 재시작으로 적용