Prometheus Grafana Monitoring Stack 구축: DevOps 엔지니어를 위한 가이드
Prometheus와 Grafana를 활용한 강력한 모니터링 스택 구축 방법을 Docker Compose 예시와 함께 상세히 설명합니다. DevOps 엔지니어링 관점에서 메트릭 수집, 시각화, 경고 설정까지 다룹니다.
Prometheus Grafana Monitoring Stack 구축: DevOps 엔지니어를 위한 가이드
현대 인프라의 복잡성이 증가함에 따라 시스템의 상태를 실시간으로 파악하고 잠재적인 문제를 사전에 감지하는 능력은 DevOps 엔지니어에게 필수적인 역량입니다. 이러한 요구사항을 충족시키기 위해 Prometheus와 Grafana는 업계 표준으로 자리 잡은 강력한 모니터링 솔루션입니다. 이 글에서는 Prometheus와 Grafana를 활용하여 효과적인 모니터링 스택을 구축하는 방법을 DevOps 엔지니어링 관점에서 상세히 다루고자 합니다. Docker Compose를 이용한 실제 구축 예시와 함께 메트릭 수집, 시각화, 그리고 경고 설정까지 종합적으로 살펴보겠습니다.
모니터링 스택의 중요성 및 Prometheus Grafana 소개
오늘날의 IT 환경은 마이크로서비스 아키텍처, 컨테이너화, 클라우드 네이티브 기술의 확산으로 인해 과거와 비교할 수 없을 정도로 복잡해졌습니다. 이러한 환경에서 시스템의 안정성과 성능을 유지하기 위해서는 지속적인 모니터링이 필수적입니다. 시스템 장애를 신속하게 감지하고, 성능 병목 현상을 식별하며, 미래의 용량 계획을 수립하는 데 있어 모니터링은 핵심적인 역할을 수행합니다.
Prometheus는 Cloud Native Computing Foundation(CNCF) 프로젝트 중 하나로, 시계열 데이터베이스(TSDB)를 기반으로 하는 오픈소스 모니터링 시스템입니다. Prometheus는 Pull 기반 모델을 사용하여 대상(Target)으로부터 메트릭(Metric)을 주기적으로 가져와 저장합니다. 강력한 쿼리 언어인 PromQL을 통해 복잡한 시계열 데이터를 효율적으로 분석하고, 다양한 Exporter를 통해 거의 모든 종류의 시스템과 애플리케이션에서 메트릭을 수집할 수 있습니다.
Grafana는 다양한 데이터 소스를 지원하는 오픈소스 데이터 시각화 및 대시보드 도구입니다. Prometheus와 완벽하게 통합되어 수집된 메트릭을 아름답고 직관적인 그래프와 차트로 시각화할 수 있게 해줍니다. 또한, 강력한 경고(Alerting) 기능을 제공하여 특정 조건 발생 시 Slack, Email 등 다양한 채널로 알림을 보낼 수 있습니다. Prometheus와 Grafana는 서로의 단점을 보완하며 시너지 효과를 내어, 현대적인 모니터링 스택의 표준으로 널리 사용되고 있습니다.
Prometheus Grafana 스택 아키텍처 이해
Prometheus와 Grafana를 중심으로 하는 모니터링 스택은 일반적으로 다음과 같은 구성 요소들로 이루어집니다.
- Prometheus Server: 메트릭 수집의 핵심입니다. 설정된 Scrape Interval에 따라 Target으로부터 메트릭을 Pull하여 자체 TSDB에 저장합니다. PromQL을 통해 쿼리를 처리하고, Alertmanager로 경고를 보냅니다.
- Exporter: 모니터링 대상(Target)의 메트릭을 Prometheus가 Scraping할 수 있는 형식으로 노출하는 작은 서비스입니다. 예를 들어,
Node Exporter는 Linux 호스트의 CPU, 메모리, 디스크 I/O 등의 시스템 메트릭을 노출하며,cAdvisor는 Docker 컨테이너의 리소스 사용량을 노출합니다. 애플리케이션의 경우, 클라이언트 라이브러리를 통해 직접 메트릭을 노출할 수도 있습니다. - Grafana: Prometheus Server에 저장된 메트릭 데이터를 쿼리하여 시각화합니다. 다양한 대시보드를 구성할 수 있으며, 데이터 기반의 경고 규칙을 설정하고 알림 채널을 관리합니다.
- Alertmanager: Prometheus Server로부터 받은 경고(Alert)를 처리하고 라우팅합니다. 중복 경고를 제거하고, 그룹화하며, 다양한 알림 채널(Slack, PagerDuty, Email 등)로 전송하는 역할을 합니다. 이 글에서는 Alertmanager까지 다루지는 않지만, 실제 운영 환경에서는 필수적인 구성 요소입니다.
이러한 구성 요소들이 유기적으로 결합하여 시스템의 전반적인 상태를 실시간으로 파악하고, 문제 발생 시 즉각적인 대응을 가능하게 합니다.
Docker Compose를 활용한 Prometheus Grafana 스택 구축
이제 Docker Compose를 사용하여 Prometheus, Grafana, 그리고 Node Exporter를 한 번에 배포하는 방법을 살펴보겠습니다. 이 방법을 통해 로컬 환경이나 단일 서버에 간편하게 모니터링 스택을 구축할 수 있습니다.
디렉터리 구조 및 설정 파일 준비
먼저, 다음과 같은 디렉터리 구조를 생성합니다.
.
├── docker-compose.yml
├── prometheus
│ └── prometheus.yml
└── grafana
├── provisioning
│ ├── datasources
│ │ └── datasource.yml
│ └── dashboards
│ └── dashboard.yml # (선택 사항)
└── data # Grafana 데이터 저장용
Prometheus 설정 (prometheus.yml)
prometheus/prometheus.yml 파일을 다음과 같이 작성합니다. 이 설정은 Prometheus 자체와 Node Exporter를 모니터링 대상으로 추가합니다.
global:
scrape_interval: 15s # 모든 대상으로부터 15초마다 메트릭 수집
evaluation_interval: 15s # 경고 규칙을 15초마다 평가
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090'] # Prometheus 자체 모니터링
- job_name: 'node_exporter'
static_configs:
- targets: ['node_exporter:9100'] # Node Exporter 모니터링 (docker-compose 서비스 이름)
Grafana 설정 (datasource.yml)
grafana/provisioning/datasources/datasource.yml 파일을 작성하여 Prometheus를 Grafana의 데이터 소스로 등록합니다. provisioning 기능을 사용하면 Grafana가 시작될 때 자동으로 데이터 소스를 설정할 수 있습니다.
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus:9090 # docker-compose 서비스 이름과 포트
isDefault: true
access: proxy
editable: true
Docker Compose 파일 작성 (docker-compose.yml)
이제 docker-compose.yml 파일을 작성하여 Prometheus, Grafana, Node Exporter 서비스를 정의합니다.
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
restart: unless-stopped
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
volumes:
- ./grafana/provisioning/:/etc/grafana/provisioning/
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=admin # 운영 환경에서는 강력한 비밀번호 사용 권장
restart: unless-stopped
depends_on:
- prometheus
node_exporter:
image: prom/node-exporter:latest
container_name: node_exporter
command:
- '--path.rootfs=/host'
network_mode: "host" # 호스트 네트워크를 사용하여 호스트 메트릭 수집
pid: "host" # 호스트 PID 네임스페이스에 접근
volumes:
- /:/host:ro,rslave
restart: unless-stopped
volumes:
prometheus_data:
grafana_data:node_exporter의 network_mode: "host"와 pid: "host" 설정은 컨테이너가 호스트의 네트워크 스택과 PID 네임스페이스를 사용하여 호스트 머신의 실제 메트릭을 수집할 수 있도록 합니다. 이는 Docker 컨테이너 내부에서 호스트 자체의 리소스 사용량을 모니터링할 때 유용합니다.
스택 실행 및 확인
모든 설정 파일 작성이 완료되었다면, 터미널에서 docker-compose.yml 파일이 있는 디렉터리로 이동하여 다음 명령어를 실행합니다.
docker-compose up -d
명령어가 성공적으로 실행되면, 다음 URL로 접속하여 각 서비스의 상태를 확인할 수 있습니다.
- Prometheus UI:
http://localhost:9090 - Grafana UI:
http://localhost:3000(기본 로그인: admin/admin)
Grafana에 로그인 후, 왼쪽 메뉴의 "Configuration" -> "Data sources"로 이동하면 datasource.yml에서 설정한 Prometheus 데이터 소스가 자동으로 추가된 것을 확인할 수 있습니다.
Node Exporter를 이용한 호스트 메트릭 모니터링
위 docker-compose.yml 파일에 이미 node_exporter 서비스가 포함되어 있습니다. node_exporter는 Linux/Unix 시스템의 하드웨어 및 OS 메트릭(CPU 사용률, 메모리 사용량, 디스크 I/O, 네트워크 트래픽 등)을 Prometheus가 Scraping할 수 있는 형태로 노출합니다.
Prometheus의 prometheus.yml 파일에 node_exporter job이 설정되어 있으므로, Prometheus는 node_exporter:9100으로 접속하여 호스트 메트릭을 주기적으로 수집하게 됩니다.
Grafana에서 이 데이터를 시각화하려면, Node Exporter 대시보드를 임포트하는 것이 가장 효율적입니다. Grafana Labs에서 제공하는 공식 대시보드 중 "Node Exporter Full" (ID: 1860)과 같은 대시보드를 활용할 수 있습니다.
- Grafana UI에 로그인합니다.
- 왼쪽 메뉴에서 "Dashboards" -> "Import"를 클릭합니다.
- "Import via grafana.com" 필드에 대시보드 ID (예:
1860)를 입력하고 "Load"를 클릭합니다. - 데이터 소스로 "Prometheus"를 선택하고 "Import"를 클릭합니다.
이제 Node Exporter가 수집한 다양한 호스트 메트릭을 시각화한 대시보드를 Grafana에서 확인할 수 있습니다.
Grafana 대시보드 구성 및 경고 설정
Grafana는 강력한 대시보드 생성 기능을 제공합니다. 수집된 메트릭을 기반으로 원하는 정보를 시각화하고, 특정 조건 발생 시 알림을 받을 수 있도록 경고를 설정하는 방법을 살펴보겠습니다.
대시보드 생성 및 패널 추가
새로운 대시보드를 생성하고 패널을 추가하여 PromQL 쿼리를 통해 데이터를 시각화할 수 있습니다.
- Grafana UI에서 왼쪽 메뉴의 "Dashboards" -> "New dashboard" -> "Add new panel"을 클릭합니다.
- "Data source"로 "Prometheus"를 선택합니다.
- "PromQL" 입력 필드에 원하는 쿼리를 입력합니다.
예를 들어, Node Exporter를 통해 수집된 호스트의 CPU 사용률을 확인하려면 다음 PromQL 쿼리를 사용할 수 있습니다.
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
이 쿼리는 지난 5분 동안의 유휴(idle) CPU 시간 비율을 기반으로 CPU 사용률을 계산합니다. 다른 유용한 PromQL 쿼리 예시는 다음과 같습니다.
- 메모리 사용률 (Bytes):
node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Cached_bytes - node_memory_Buffers_bytes - 네트워크 수신 바이트(초당):
rate(node_network_receive_bytes_total{device="eth0"}[5m])
쿼리 결과를 그래프, 게이지, 스탯 등 다양한 시각화 패널로 표현할 수 있습니다.
경고(Alerting) 설정
Grafana는 데이터 소스에서 가져온 메트릭을 기반으로 경고 규칙을 생성할 수 있습니다.
- 대시보드에서 경고를 설정할 패널을 선택하고 "Edit" 버튼을 클릭합니다.
- 왼쪽 메뉴에서 "Alert" 탭을 클릭한 후 "Create Alert"를 클릭합니다.
- Alert rule name: 경고 규칙의 이름을 지정합니다 (예:
High CPU Usage). - Evaluate every: 경고 규칙을 얼마나 자주 평가할지 설정합니다 (예:
1m). - For: 특정 상태가 얼마나 오래 지속되어야 경고가 트리거될지 설정합니다 (예:
5m). - Conditions: 경고 트리거 조건을 정의합니다.
-
A(쿼리 결과)IS ABOVE80(CPU 사용률이 80%를 초과할 때)
-
- No Data Option: 데이터가 없을 때 어떻게 처리할지 설정합니다 (예:
No Data -> Alerting). - Notification: 경고 발생 시 알림을 보낼 채널을 설정합니다.
알림 채널을 설정하려면, Grafana 왼쪽 메뉴의 "Alerting" -> "Notification channels"에서 Slack, Email, Webhook 등 원하는 채널을 추가해야 합니다. 예를 들어, Slack Webhook URL을 설정하여 경고 발생 시 Slack 채널로 알림을 받을 수 있습니다.
Kubernetes 환경에서의 Prometheus Grafana 연동 (고려 사항)
이 글에서는 Docker Compose를 사용한 로컬 환경 구축을 다루었지만, 실제 프로덕션 환경에서는 Kubernetes와 같은 컨테이너 오케스트레이션 플랫폼 위에서 Prometheus Grafana 스택을 운영하는 경우가 많습니다. Kubernetes 환경에서는 몇 가지 추가적인 고려 사항이 있습니다.
| 특징 | Docker Compose 환경 | Kubernetes 환경 |
|---|---|---|
| 배포 방식 | docker-compose.yml 파일 수동 관리 | Helm Chart, Prometheus Operator 사용 |
| 서비스 발견 | static_configs로 수동 지정 | Service Discovery (Kubernetes API 서버 연동) |
| 메트릭 수집 | Node Exporter, cAdvisor (컨테이너) | kube-state-metrics, cAdvisor (kubelet 내장) |
| 스케일링 | 제한적 | Horizontal Pod Autoscaler(HPA) 등 유연한 스케일링 |
| 고가용성 | 수동 구성 필요 | 기본적으로 고가용성 고려 |
Kubernetes 환경에서는 Prometheus Operator를 사용하는 것이 가장 일반적입니다. Prometheus Operator는 Kubernetes API를 확장하여 Prometheus, Alertmanager, Grafana 등을 Kubernetes 리소스로 관리할 수 있게 해줍니다. 이를 통해 Prometheus의 설정, 배포, 스케일링, 백업 등을 Kubernetes 네이티브 방식으로 자동화할 수 있습니다. 또한, kube-state-metrics와 같은 Exporter를 통해 Kubernetes 클러스터 자체의 상태(Pod 수, Deployment 상태 등)를 모니터링할 수 있습니다.
마무리
Prometheus와 Grafana를 활용한 모니터링 스택 구축은 현대적인 DevOps 환경에서 시스템의 가시성을 확보하고 안정성을 유지하는 데 필수적인 과정입니다. 이 글을 통해 Docker Compose를 이용한 기본적인 스택 구축 방법부터 Node Exporter를 통한 호스트 메트릭 수집, Grafana 대시보드 구성 및 경고 설정까지 실질적인 가이드를 제공하고자 했습니다.
성공적인 모니터링 스택은 단순히 도구를 설치하는 것을 넘어, 시스템의 핵심 지표를 이해하고, 의미 있는 경고를 설정하며, 데이터를 기반으로 의사결정을 내리는 DevOps 문화를 정착시키는 데 기여합니다. 이제 여러분은 이 가이드를 바탕으로 자신만의 모니터링 시스템을 구축하고, 나아가 Alertmanager를 통한 고급 경고 관리, Custom Exporter 개발, 그리고 Thanos나 Cortex와 같은 분산형 Prometheus 솔루션으로 확장하는 여정을 시작할 수 있을 것입니다.
관련 게시글
GitOps Workflow 설계 가이드: Kubernetes와 CI/CD를 활용한 자동화
GitOps는 선언적 인프라 및 애플리케이션 관리를 위한 강력한 패러다임입니다. 이 가이드에서는 Git을 Single Source of Truth로 활용하여 Kubernetes 환경에서 안정적이고 효율적인 GitOps 워크플로우를 설계하는 방법을 Docker, CI/CD 자동화 예시와 함께 상세히 설명합니다.
GitHub Actions Advanced Workflows: Docker, Kubernetes CI/CD
GitHub Actions를 활용한 Docker, Kubernetes 기반 CI/CD 파이프라인 구축 심화 가이드. DevOps 엔지니어링 관점에서 자동화 전략을 탐구합니다.
Terraform Infrastructure Automation: DevOps 엔지니어링 가이드
Terraform을 활용한 인프라 자동화의 핵심 개념부터 실제 AWS 환경에서의 배포 예시까지, DevOps 엔지니어링 관점에서 자세히 알아봅니다. IaC, Docker, Kubernetes, CI/CD 파이프라인 통합 전략을 다룹니다.