프로메테우스 모니터링: 완전한 설정 및 최고의 실천 방법

프로메테우스를 사용하여 견고한 인프라 모니터링을 설정하세요.

Page content

프로메테우스 는 클라우드 네이티브 애플리케이션 및 인프라를 모니터링하는 데 facto 표준이 되었으며, 메트릭 수집, 쿼리, 시각화 도구와의 통합을 제공합니다.

technical-diagram

프로메테우스란?

프로메테우스는 2012년 SoundCloud에서 처음 개발된 후 현재 클라우드 네이티브 컴퓨팅 재단(CNCF)의 졸업 프로젝트가 되었으며, 오픈소스 모니터링 및 경고 도구킷입니다. 동적 클라우드 환경에서의 신뢰성과 확장성을 위해 특별히 설계되어 있으며, 마이크로서비스, 컨테이너 및 쿠버네티스 클러스터를 모니터링하는 데 이상적인 솔루션입니다.

주요 기능

시계열 데이터베이스: 프로메테우스는 메트릭 이름과 키-값 쌍(라벨)로 식별되는 시간에 따른 데이터를 저장하여 유연하고 강력한 쿼리 기능을 제공합니다.

Pull 기반 모델: 전통적인 Push 기반 시스템과 달리, 프로메테우스는 설정된 타겟에서 지정된 간격으로 메트릭을 주기적으로 수집하여 더 신뢰성 있고 구성이 간단합니다.

PromQL 쿼리 언어: 실시간으로 메트릭 데이터를 잘라내고 분석할 수 있는 강력한 기능형 쿼리 언어를 제공하며, 집계, 변환, 복잡한 계산을 수행할 수 있습니다.

서비스 발견: 쿠버네티스, Consul, EC2 및 정적 구성과 같은 다양한 메커니즘을 통해 모니터링 대상의 자동 발견이 가능합니다.

외부 의존성 없음: 프로메테우스는 외부 의존성이 필요 없는 단일 바이너리로 작동하여 배포를 간소화하고 운영 복잡성을 줄입니다.

내장 경고 시스템: AlertManager는 프로메테우스에서 경고를 처리하여 중복 제거, 그룹화 및 이메일, PagerDuty 또는 Slack과 같은 알림 채널로 라우팅합니다.

아키텍처 개요

프로메테우스 아키텍처를 이해하는 것은 효과적인 배포에 필수적입니다. 주요 구성 요소는 다음과 같습니다:

  • 프로메테우스 서버: 메트릭을 수집하고 저장하며 규칙을 평가하고 쿼리를 제공합니다.
  • 클라이언트 라이브러리: 애플리케이션 코드를 계측하여 메트릭을 노출합니다.
  • 익스포터: 제3자 시스템을 프로메테우스 형식으로 연결합니다.
  • AlertManager: 경고와 알림을 처리합니다.
  • Pushgateway: 수집할 수 없는 짧은 실행 시간의 작업에서 메트릭을 수신합니다.

일반적인 데이터 흐름: 애플리케이션은 메트릭 엔드포인트를 노출 → 프로메테우스는 이 엔드포인트를 수집 → 데이터는 시간에 따른 데이터베이스에 저장 → PromQL 쿼리가 데이터를 검색 및 분석 → 규칙에 따라 경고가 생성 → AlertManager가 알림을 처리 및 라우팅합니다.

Ubuntu 24.04에 인프라를 배포할 때, 프로메테우스는 포괄적인 모니터링의 훌륭한 기반이 됩니다.

Ubuntu에서 프로메테우스 설치

Linux 시스템에 프로메테우스를 설치하는 방법을 살펴보겠습니다. 예시로 Ubuntu를 사용하지만, 다른 배포판에서도 유사한 절차를 따릅니다.

다운로드 및 설치

먼저 프로메테우스를 위한 전용 사용자를 생성합니다:

sudo useradd --no-create-home --shell /bin/false prometheus

최신 프로메테우스 릴리스를 다운로드합니다:

cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz
tar xvf prometheus-2.48.0.linux-amd64.tar.gz
cd prometheus-2.48.0.linux-amd64

이진 파일을 복사하고 디렉토리를 생성합니다:

sudo cp prometheus /usr/local/bin/
sudo cp promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool

sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
sudo chown prometheus:prometheus /etc/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus

sudo cp -r consoles /etc/prometheus
sudo cp -r console_libraries /etc/prometheus
sudo cp prometheus.yml /etc/prometheus/prometheus.yml
sudo chown -R prometheus:prometheus /etc/prometheus

Ubuntu의 패키지 관리에 대해서는 우리의 포괄적인 Ubuntu 패키지 관리 가이드를 참조하십시오.

프로메테우스 구성

/etc/prometheus/prometheus.yml을 편집합니다:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

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

rule_files:
  - 'alert_rules.yml'

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

  - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9100']

시스템드 서비스 생성

/etc/systemd/system/prometheus.service를 생성합니다:

[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus/ \
  --web.console.templates=/etc/prometheus/consoles \
  --web.console.libraries=/etc/prometheus/console_libraries \
  --storage.tsdb.retention.time=30d

[Install]
WantedBy=multi-user.target

프로메테우스를 시작하고 활성화합니다:

sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus
sudo systemctl status prometheus

프로메테우스 웹 인터페이스에 http://localhost:9090에서 액세스할 수 있습니다.

Node Exporter 설정

Node Exporter는 리눅스 시스템의 하드웨어 및 OS 메트릭을 노출합니다. 서버를 모니터링하려면 설치하십시오:

cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xvf node_exporter-1.7.0.linux-amd64.tar.gz
sudo cp node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/node_exporter

/etc/systemd/system/node_exporter.service 시스템드 서비스를 생성합니다:

[Unit]
Description=Node Exporter
After=network.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target

Node Exporter를 시작합니다:

sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter

Node Exporter는 9100 포트에서 메트릭을 노출합니다.

PromQL 이해

PromQL(Prometheus Query Language)은 프로메테우스 데이터를 쿼리하는 핵심입니다. 여기에 필수적인 쿼리 패턴이 있습니다:

기본 쿼리

메트릭에 대한 모든 시간 시리즈 선택:

node_cpu_seconds_total

레이블로 필터링:

node_cpu_seconds_total{mode="idle"}

여러 레이블 필터:

node_cpu_seconds_total{mode="idle",cpu="0"}

범위 벡터 및 집계

시간에 따른 속도 계산:

rate(node_cpu_seconds_total{mode="idle"}[5m])

모든 CPU에 대한 합계:

sum(rate(node_cpu_seconds_total{mode="idle"}[5m]))

레이블에 따라 그룹화:

sum by (mode) (rate(node_cpu_seconds_total[5m]))

실용적인 예시

CPU 사용률 퍼센트:

100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

메모리 사용률:

(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100

디스크 사용률:

(node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes * 100

네트워크 트래픽 속도:

rate(node_network_receive_bytes_total[5m])

도커 배포

도커 컨테이너에서 프로메테우스를 실행하면 유연성과 관리가 더 용이해집니다:

docker-compose.yml을 생성합니다:

version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=30d'
    ports:
      - "9090:9090"
    restart: unless-stopped

  node_exporter:
    image: prom/node-exporter:latest
    container_name: node_exporter
    command:
      - '--path.rootfs=/host'
    volumes:
      - '/:/host:ro,rslave'
    ports:
      - "9100:9100"
    restart: unless-stopped

  alertmanager:
    image: prom/alertmanager:latest
    container_name: alertmanager
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
      - alertmanager_data:/alertmanager
    ports:
      - "9093:9093"
    restart: unless-stopped

volumes:
  prometheus_data:
  alertmanager_data:

스택을 시작합니다:

docker-compose up -d

쿠버네티스 모니터링

프로메테우스는 쿠버네티스 클러스터를 모니터링하는 데 탁월합니다. kube-prometheus-stack Helm 차트는 완전한 모니터링 솔루션을 제공합니다.

Helm을 사용하여 설치합니다:

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack

이 설치는 다음을 포함합니다:

  • Prometheus Operator
  • Prometheus 인스턴스
  • AlertManager
  • Grafana
  • Node Exporter
  • kube-state-metrics
  • 사전 구성된 대시보드 및 경고

Grafana에 액세스합니다:

kubectl port-forward svc/prometheus-grafana 3000:80

기본 자격 증명: admin/prom-operator

쿠버네티스 배포판에 대해서는 플랫폼별 기능에 따라 약간의 조정이 필요한 유사한 배포 프로세스가 있습니다.

경고 설정

AlertManager는 프로메테우스가 보낸 경고를 처리합니다. 경고 규칙 및 알림 채널을 구성합니다.

경고 규칙

/etc/prometheus/alert_rules.yml을 생성합니다:

groups:
  - name: system_alerts
    interval: 30s
    rules:
      - alert: HighCPUUsage
        expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "{{ $labels.instance }}에서 CPU 사용률이 높습니다"
          description: "CPU 사용률이 80%를 초과했습니다 (현재 값: {{ $value }}%)"

      - alert: HighMemoryUsage
        expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "{{ $labels.instance }}에서 메모리 사용률이 높습니다"
          description: "메모리 사용률이 85%를 초과했습니다 (현재 값: {{ $value }}%)"

      - alert: DiskSpaceLow
        expr: (node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100 < 15
        for: 10m
        labels:
          severity: critical
        annotations:
          summary: "{{ $labels.instance }}의 디스크 공간이 부족합니다"
          description: "{{ $labels.mountpoint }}에서 사용 가능한 디스크 공간이 15% 미만입니다"

      - alert: InstanceDown
        expr: up == 0
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "{{ $labels.instance }} 인스턴스가 다운되었습니다"
          description: "{{ $labels.job }} 인스턴스 {{ $labels.instance }}이 2분 이상 다운되었습니다"

AlertManager 구성

/etc/prometheus/alertmanager.yml을 생성합니다:

global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.gmail.com:587'
  smtp_from: 'alerts@example.com'
  smtp_auth_username: 'alerts@example.com'
  smtp_auth_password: 'your-password'

route:
  group_by: ['alertname', 'cluster', 'service']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 12h
  receiver: 'team-email'
  routes:
    - match:
        severity: critical
      receiver: 'team-pagerduty'
    - match:
        severity: warning
      receiver: 'team-slack'

receivers:
  - name: 'team-email'
    email_configs:
      - to: 'team@example.com'
        headers:
          Subject: '{{ .GroupLabels.alertname }}: {{ .Status | toUpper }}'

  - name: 'team-slack'
    slack_configs:
      - api_url: 'https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK'
        channel: '#alerts'
        title: '경고: {{ .GroupLabels.alertname }}'
        text: '{{ range .Alerts }}{{ .Annotations.description }}{{ end }}'

  - name: 'team-pagerduty'
    pagerduty_configs:
      - service_key: 'your-pagerduty-key'

Grafana와 통합

프로메테우스에는 기본 웹 인터페이스가 있지만, Grafana는 더 우수한 시각화 기능을 제공하여 포괄적인 대시보드를 생성할 수 있습니다.

프로메테우스를 데이터 소스로 추가

  1. Grafana를 열고 구성 → 데이터 소스로 이동
  2. “데이터 소스 추가"를 클릭
  3. “프로메테우스"를 선택
  4. URL을 http://localhost:9090 (또는 프로메테우스 서버)로 설정
  5. “저장 및 테스트"를 클릭

인기 있는 대시보드 ID

grafana.com에서 사전 구성된 대시보드를 가져옵니다:

  • Node Exporter Full (ID: 1860): 포괄적인 리눅스 메트릭
  • Kubernetes Cluster Monitoring (ID: 7249): K8s 개요
  • Docker Container Monitoring (ID: 193): 컨테이너 메트릭
  • Prometheus Stats (ID: 2): 프로메테우스 내부 메트릭

커스텀 대시보드 생성

PromQL 쿼리를 사용하여 패널을 생성합니다:

{
  "title": "CPU 사용률",
  "targets": [{
    "expr": "100 - (avg(rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)"
  }]
}

인기 있는 익스포터

프로메테우스 모니터링을 특화된 익스포터로 확장합니다:

Blackbox Exporter

HTTP, HTTPS, DNS, TCP 및 ICMP를 통해 엔드포인트를 테스트합니다:

scrape_configs:
  - job_name: 'blackbox'
    metrics_path: /probe
    params:
      module: [http_2xx]
    static_configs:
      - targets:
          - https://example.com
          - https://api.example.com
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: localhost:9115

데이터베이스 익스포터

  • mysqld_exporter: MySQL/MariaDB 메트릭
  • postgres_exporter: PostgreSQL 메트릭
  • mongodb_exporter: MongoDB 메트릭
  • redis_exporter: Redis 메트릭

애플리케이션 익스포터

  • nginx_exporter: NGINX 웹 서버 메트릭
  • apache_exporter: Apache HTTP 서버 메트릭
  • haproxy_exporter: HAProxy 로드 밸런서 메트릭

클라우드 익스포터

  • cloudwatch_exporter: AWS CloudWatch 메트릭
  • stackdriver_exporter: Google Cloud 메트릭
  • azure_exporter: Azure Monitor 메트릭

최고의 실천 방법

데이터 보존

필요에 따라 적절한 보존 기간을 설정합니다:

--storage.tsdb.retention.time=30d
--storage.tsdb.retention.size=50GB

기록 규칙

자주 쿼리되는 표현식을 사전 계산합니다:

groups:
  - name: example_rules
    interval: 30s
    rules:
      - record: job:node_cpu_utilization:avg
        expr: 100 - (avg by (job) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

레이블 관리

  • 레이블 카디널리티를 낮게 유지
  • 일관된 이름 규칙 사용
  • 고카디널리티 레이블(사용자 ID, 타임스탬프) 피하기

보안

  • 인증 및 HTTPS 활성화
  • 프로메테우스 API에 대한 액세스 제한
  • 쿠버네티스에서 네트워크 정책 사용
  • 민감한 메트릭에 대한 RBAC 구현

고가용성

  • 여러 프로메테우스 인스턴스 실행
  • Thanos 또는 Cortex를 사용하여 장기 저장
  • 계층 구조 설정을 위한 연합 구현

일반적인 문제 해결

높은 메모리 사용

  • 수집 주기를 줄이세요
  • 보존 기간을 줄이세요
  • PromQL 쿼리를 최적화하세요
  • 기록 규칙을 구현하세요

누락된 메트릭

  • /targets에서 타겟 상태 확인
  • 네트워크 연결 검증
  • 수집 구성 검증
  • 익스포터 로그 확인

느린 쿼리

  • 복잡한 집계에 기록 규칙 사용
  • 레이블 필터 최적화
  • 시간 범위 축소
  • 원격 저장소 사용 시 인덱스 추가

성능 최적화

쿼리 최적화

# 나쁨: 고카디널리티
sum(rate(http_requests_total[5m]))

# 좋음: 관련 레이블로 그룹화
sum by (status, method) (rate(http_requests_total[5m]))

리소스 제한

쿠버네티스 배포에 대해:

resources:
  requests:
    memory: "2Gi"
    cpu: "1000m"
  limits:
    memory: "4Gi"
    cpu: "2000m"

결론

프로메테우스는 현대 인프라에 대한 강력하고 확장 가능한 모니터링 솔루션을 제공합니다. Pull 기반 아키텍처, 강력한 쿼리 언어, 그리고 수많은 익스포터의 광범위한 생태계 덕분에, 베어메탈 서버부터 복잡한 쿠버네티스 클러스터까지 모든 것을 모니터링하기에 이상적입니다.

프로메테우스를 Grafana와 시각화에, AlertManager와 알림에 결합함으로써, 기업 규모의 모니터링 요구사항을 충족할 수 있는 포괄적인 관찰 플랫폼을 만들 수 있습니다. 활발한 커뮤니티와 CNCF의 지원은 지속적인 개발과 지원을 보장합니다.

기본 메트릭 수집부터 시작하여, 특정 서비스에 맞는 익스포터를 점진적으로 추가하고, 실제 경험을 바탕으로 경고 규칙을 세분화하세요. 프로메테우스는 단일 서버 배포에서 다중 데이터센터 모니터링 아키텍처까지 인프라와 함께 확장됩니다.

관련 자료

외부 참조