Prometheus, Grafana, node-exporter, cAdvisor
시스템 모니터링을 위해서 Prometheus와 Grafana를 사용하여 서버와 애플리케이션의 성능 지표를 실시간으로 시각화하고 분석하는 것은 널리 사용되고 있습니다.
이러한 모니터링 환경을 Docker 기반으로 구성한 과정에 대해 정리합니다.
Prometheus는 성능 지표를 수집하기 위해 사용하고, prometheus에 수집된 데이터를 시각화하기 위해 Grafana를 사용합니다.
Node Exporter
Node Exporter는 Prometheus 생태계의 일부로, Linux 및 기타 유닉스 계열 운영 체제의 다양한 하드웨어 및 OS 메트릭을 수집해주는 도구입니다. 이러한 메트릭에는 CPU 사용률, 메모리 사용량, 디스크 I/O, 네트워크 트래픽, 파일 시스템 사용량 등이 포함됩니다.
Node Exporter는 경량의 고성능 바이너리로, 주로 백그라운드에서 서비스로 실행됩니다. 시스템의 다양한 상태 정보를 수집하여 HTTP 엔드포인트(:9100 기본 포트)를 통해 Prometheus 서버로 데이터를 스크랩할 수 있도록 제공합니다.
이 도구를 사용하면 서버의 리소스 상태를 모니터링하고, 문제를 조기에 진단하며, 시스템 성능 최적화에 필요한 데이터를 수집할 수 있습니다. Prometheus와 함께 Node Exporter를 사용하면 서버 전반의 상세한 상태 정보를 지속적으로 추적할 수 있는 강력한 모니터링 솔루션을 구축할 수 있습니다.
node_exporter:
image: prom/node-exporter
container_name: node-exporter
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
- /etc/localtime:/etc/localtime:ro
restart: always
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
ports:
- 9100:9100
networks:
- prom-grafana
호스트의 지표 수집시 컨테이너와의 시간동기화를 위해 /etc/localtime 을 read-only 로 마운트해 주었습니다.
네트워크는 이후 설명할 컨테이너들과 동일한 것을 사용하기 위해 지정하였습니다.
cAdvisor
cAdvisor(Container Advisor)는 구글에서 개발한 오픈 소스 프로젝트로, Docker 컨테이너의 자원 사용량과 성능 정보(예: CPU, 메모리, 디스크 I/O, 네트워크 사용량 등)를 실시간으로 수집하고 모니터링하는 도구입니다.
cAdvisor는 서버 내에서 실행 중인 모든 컨테이너를 자동으로 감지하고 모니터링하며, 수집한 데이터를 웹 UI를 통해 실시간으로 시각화하거나 외부 시스템(Prometheus 등)으로 전송할 수 있습니다. 이를 통해 여러 컨테이너의 실행 상태를 중앙 집중적으로 관리하고 관찰할 수 있는 기능을 제공합니다.
- 경량화된 디자인으로 컨테이너의 성능에 최소한의 부담을 줍니다.
- 다양한 인프라와 호환되며, 간단하게 Docker 환경에서 실행 가능합니다.
- 수집된 메트릭은 HTTP 엔드포인트를 통해 제공되어 Prometheus와 같은 모니터링 시스템과의 연동이 용이합니다.
cAdvisor를 사용하면 컨테이너 기반 환경에서 리소스 사용량을 손쉽게 모니터링하고 성능 최적화 또는 문제 해결을 위한 인사이트를 얻을 수 있습니다.
cadvisor:
image: gcr.io/cadvisor/cadvisor
container_name: cadvisor
ports:
- 8080:8080
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
- /etc/localtime:/etc/localtime:ro
networks:
- prom-grafana
도커엔진의 데이터디렉터리인 /var/lib/docker 에서 지표를 수집해야 하므로 해당 디렉터리를 마운트해 줍니다. 그 외 호스트의 지표 수집을 위한 디렉터리들도 마운트합니다.
Prometheus
Prometheus는 오픈 소스 시스템 모니터링 및 경고 도구로, 주로 시계열 데이터베이스를 중심으로 개발되었습니다. SoundCloud에서 시작되어 현재는 CNCF(Cloud Native Computing Foundation)의 후원을 받고 있는 프로젝트입니다.
- 데이터 수집: HTTP를 통해 지정된 간격으로 타겟에서 메트릭을 수집하는 모델을 사용합니다. 이러한 데이터 수집 방식을 "스크래핑"이라고 하며, Prometheus는 다양한 소스(Node Exporter, cAdvisor 등)로부터 메트릭을 수집할 수 있습니다.
- 다양한 메트릭 저장: 메트릭은 시계열 데이터로 저장되며, 고도의 압축과 효율성을 갖춘 시계열 데이터베이스에 저장됩니다.
- 강력한 쿼리 언어: PromQL(Prometheus Query Language)을 통해 복잡한 쿼리를 작성하여 수집된 메트릭을 분석하고 시각화할 수 있습니다.
- 시각화 및 경고: 기본 대시보드 기능을 제공하며, Grafana와 연동하여 더욱 풍부하고 사용자 정의 가능한 시각화를 지원합니다. 또한 경고 규칙을 설정하여 특정 조건이 만족될 때 경고를 전송할 수 있습니다.
- 고가용성: 클러스터링을 통해 고가용성 및 확장성을 지원하며, 다양한 서비스 디스커버리 메커니즘과 통합됩니다.
Prometheus는 모니터링 및 경고 서비스에 적합하며, 시스템의 성능 모니터링, 리소스 사용 추적, 장애 감지 및 대응을 위한 필수 도구로 자리잡고 있습니다.
prometheus:
image: prom/prometheus
user: "1000:1000"
container_name: prometheus
volumes:
- ./prometheus/config:/etc/prometheus
- ./prometheus-data:/prometheus
- /etc/localtime:/etc/localtime:ro
ports:
- 9090:9090
command:
- '--storage.tsdb.path=/prometheus'
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.size=10GiB'
restart: always
networks:
- prom-grafana
수집된 데이터 저장을 위한 디렉터리 (prometheus-data) 를 적절히 마운트하여 줍니다.
prometheus 컨테이너가 실행되려면 storage.tsdb의 경로에 대한 권한이 올바르게 구성되어야 합니다. 로컬 디렉터리를 위와 같이 사용하는 경우 "user: 1000:1000" 의 형태로 컨테이너 실행 계정의 정보를 구성하고, 호스트에서 해당 디렉터리를 미리 생성해 두도록 합니다.
또한 수집데이터가 차지하는 디스크 공간 제한을 위해 storage.tsdb.retention.size 옵션에 사용할 디스크 크기를 작성해 줍니다.
만일 용량이 아닌 수집 기간을 제한하려면 storage.tsdb.retention.time 옵션을 사용하면 됩니다.
도커 tempfs 불륨을 사용하려면 아래와 같이 구성할 수 있습니다. 이때 uid 는 docker 실행 계정의 ID 를 작성해 주도록 합니다.
volumes:
prometheus-data:
driver: local
driver_opts:
o: "size=100g,uid=1000"
device: tmpfs
type: tmpfs
앞서 구성한 node_exporter, cadvisor 로부터의 지표 수집을 위해 prometheus/config/prometheus.yml 파일을 아래와 같이 작성해 줍니다.
global:
scrape_interval: 10s
scrape_timeout: 10s
evaluation_interval: 1m
external_labels:
monitor: 'codelab-monitor'
query_log_file: query_log_file.log
scrape_configs:
- job_name: 'monitoring-item'
scrape_interval: 10s
scrape_timeout: 10s
metrics_path: '/metrics'
honor_labels: false
honor_timestamps: false
scheme: 'http'
static_configs:
- targets: ['prometheus:9090', 'node_exporter:9100', 'cadvisor:8080']
labels:
service: 'monitor'
Grafana
Grafana는 오픈 소스 데이터 시각화 및 모니터링 툴로, 다양한 데이터 소스로부터 수집한 메트릭을 시각적으로 표현하고 분석할 수 있게 해줍니다. 주로 대시보드를 통해 데이터를 시각화하며, 인터랙티브하고 사용자 정의가 가능한 그래프와 차트를 생성할 수 있습니다.
- 다양한 데이터 소스 지원: Prometheus, InfluxDB, Graphite, Elasticsearch, AWS CloudWatch, Google Cloud Monitoring 등 다양한 데이터 소스와 쉽게 통합할 수 있습니다.
- 대시보드 구성: 사용자는 자신의 필요에 맞게 대시보드를 생성하고 수정할 수 있으며, 여러 대시보드를 조합하여 하나의 뷰를 구성할 수 있습니다.
- 알람 기능: 특정 조건을 기반으로 경고를 설정할 수 있으며, 이메일, Slack, PagerDuty 등을 통해 알림을 받을 수 있습니다.
- 플러그인 지원: 다양한 패널 및 데이터 소스를 추가할 수 있는 플러그인을 지원하여 기능을 확장할 수 있습니다.
- 사용자 관리 및 보안: 사용자와 팀을 관리하고, 대시보드 및 데이터를 보호할 수 있는 다양한 인증 및 권한 설정 기능을 제공됩니다.
grafana:
image: grafana/grafana
user: "1000:1000"
container_name: grafana
ports:
- 3000:3000
volumes:
- ./grafana/provisioning/:/etc/grafana/provisioning/
- ./grafana-data:/var/lib/grafana
- /etc/localtime:/etc/localtime:ro
restart: always
depends_on:
- prometheus
networks:
- prom-grafana
모니터링 구성 컨테이너 실행 및 대시보드 설정
앞서 구성한 docker-compose.yaml 파일을 사용하여 컨테이너를 기동합니다.
컨테이너 로그를 확인하여 이상유무 및 기동 상태를 점검한 이후 grafana 에서 데이터소스와 대시보드를 구성합니다.
grafana 초기 계정 정보는 admin / admin 입니다.
Home > Connections > Data sourceses > Add new data source 로 이동하여 prometheus 를 검색하고, 구성된 프로메테우스 접속 정보를 입력합니다.
이제 모니터링을 위한 대시보드를 구성합니다.
Home > Dashboards > New
Node Exporter 대시보드
Node Exporter 로부터 수집된 지표를 구성하는데 도움이 되는 대시보드는 그라파나로부터 가져올 수 있습니다.
대시보드 ID 는 1860 입니다.
Home > Dashboards > Import dashboard 로 이동 후 대시보드ID를 입력하고, 대시보드 Name 과 데이터소스를 선택하여 줍니다.
정상적으로 구성되게 된다면 아래와 같은 대시보드를 확인할 수 있습니다.
cAdvisor 대시보드
cAdvisor로부터 수집된 지표를 구성하는데 도움이 되는 대시보드는 그라파나로부터 가져올 수 있습니다.
대시보드 ID 는 13496입니다.
Home > Dashboards > Import dashboard 로 이동 후 대시보드ID를 입력하고, 대시보드 Name 과 데이터소스를 선택하여 줍니다.
정상적으로 구성되게 된다면 아래와 같은 대시보드를 확인할 수 있습니다.
방문해 주셔서 감사합니다!
정보가 도움이 되셨다면
로그인하지 않아도 누룰 수 있는
아래의 ♡(좋아요)를 꾹~ 눌러주세요 ♥♥♥
'IT > Infra Dev' 카테고리의 다른 글
NGINX 사용시 웹서비스에서 Client IP 확인을 위한 설정 (0) | 2022.05.14 |
---|