개발놀이터

Docker로 Prometheus, Grafana 배포하기 본문

배포/Docker

Docker로 Prometheus, Grafana 배포하기

마늘냄새폴폴 2023. 7. 17. 16:57

실제 환경을 모니터링하는 것은 매우 중요한 것으로 알려져있습니다. 물론 항상 모니터링 하진 않겠지만 중요한 서비스를 배포해야 한다거나 버그를 고치고 난 뒤에 모니터링을 통해 실제 환경에 잘 녹아들었는지 확인해야합니다. 

 

이번 포스팅에선 실제 배포된 환경을 프로메테우스와 그라파나로 연동하여 CPU 사용량, 메모리 사용량, 디스크 사용량, HTTP 트래픽 등을 모니터링하는 환경을 구축해보도록 하겠습니다. 

 

 

모니터링 환경 구축

우리가 최종적으로 목표하는 것은 바로 아래와 같은 환경을 구축하는 것입니다. 

 

 

도커를 이용해 프로메테우스를 띄우고 그라파나도 띄운 다음 모니터링 하는 것이죠. 그리고 이것이 모두 이루어지면 나만의 모니터링 시스템을 만들 수 있습니다. 

 

 

이렇게 만들기 위해서 먼저 우리는 준비물이 필요합니다. 

 

  1. 도커 (Docker)
  2. 도커 컴포즈 (Docker-compose)

 

이렇게 두가지가 준비 되었다면 프로메테우스와 그라파나 시작해보죠!

 

1. Docker-compose 작성

먼저 Docker-compose를 작성해보도록 하겠습니다. 

 

현재 위치 : /prometheus-grafana/docker-compose.yml

version: '3.8'
services:
  prometheus:
    user: "root"
    image: prom/prometheus
    container_name: prometheus_container
    volumes:
      - ./prometheus/config:/etc/prometheus
      - ./prometheus/volume:/prometheus/data
    ports:
      - 9090:9090
    command:
      - '--web.enable-lifecycle'
      - '--config.file=/etc/prometheus/prometheus.yml'
    restart: always
    networks:
      - promnet
  grafana:
    user: "root"
    image: grafana/grafana
    container_name: grafana_container
    ports:
      - 3000:3000
    volumes:
      - ./grafana/volume:/var/lib/grafana
    restart: always
    networks:
      - promnet
networks:
  promnet:
    driver: bridge

 

yml (야믈) 파일은 오타 하나라도 나면 전부 실행이 안되기 때문에 주의해서 작성하셔야합니다. 

 

docker-compose.yml 파일에서 알 수 있듯이 volumes 속성을 통해 컨테이너 밖에 있는 우리의 AWS linux 환경과 마운트를 해줄 파일을 정해줬습니다. 이제 이 파일들을 하나씩 만들어야겠죠? 

 

2. prometheus.yml 파일 생성

프로메테우스를 실행하기 위해서는 prometheus.yml 파일이 필요합니다. 

 

현재 위치 : /prometheus-grafana/prometheus/config/prometheus.yml

global:
  scrape_interval: 15s
  scrape_timeout: 15s
  evaluation_interval: 2m
  external_labels:
    monitor: 'codelab-monitor'
  query_log_file: query_log_file.log
rule_files:
  - "rule.yml"
scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 10s
    scrape_timeout: 10s
    metrics_path: '/metrics'
    honor_labels: false
    honor_timestamps: false
    scheme: 'http'
    params:
      user-id: ['kyoungsuk3254@naver.com']
    static_configs:
      - targets: ['{본인 IP주소}:9090']
        labels:
          service: 'monitor-1'
  - job_name: 'node'
    static_configs:
      - targets: ['{본인 IP주소}:9100']

 

프로메테우스는 일종의 데이터베이스입니다. 실제 배포된 환경에 요청을 보내 배포 환경의 상태를 저장해놓고 있는 것이죠. 그리고 저장된 데이터들을 시각화하여 보여주는 것이 바로 그라파나입니다. 

 

prometheus.yml 에서 주의깊게 봐야할 점을 짚고 넘어가도록 하겠습니다. 

 

프로메테우스가 실제 배포 환경에 요청을 보내게 될 주기입니다. 그리고 배포 환경의 정보를 로그 파일을 통해 저장하겠다는 의미입니다. 

 

프로메테우스는 특별한 규칙에 근거하여 돌아갑니다. 추후에 rule.yml 파일을 작성할 예정입니다. 

 

프로메테우스가 어떤 환경을 타겟으로 할 것인지 정하는 부분입니다. 9090포트는 프로메테우스 자신을 뜻하구요, 9100은 후에 다운받을 node-exporter에 해당합니다. 

 

node-exporter는 다운받을 때 추가적으로 더 설명해드리도록 하겠습니다. 

 

3. rule.yml 작성

현재 위치 : /prometheus-grafana/prometheus/config/rule.yml

groups:
  - name: example
    rules:
      - alert: InstanceDown
        expr: up == 0
        for: 5m
        labels:
          severity: page
        annotations:
          summary: "Instance {{ $labels.instance }} down"
          description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
      - alert: APIHighRequestLatency
        expr: api_http_request_latencies_second{quantile="0.5"} > 1
        for: 10m
        annotations:
          summary: "High request latency on {{ $labels.instance }}"
          description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"

rule.yml은 어떤 상황에선 어떤 행동을 취해라 라고 가이드라인을 정해주는 것입니다. 

 

인스턴스가 내려가면 어떤 메세지를 띄워줘라, API 요청이 너무 길어지면 어떤 메세지를 띄워줘라 같은 내용이 담겨있습니다. 

 

4. Docker 실행

Docker-compose를 실행해주면?

 

$ docker-compose -f ./docker-compose.yml up -d

완료후 컨테이너가 잘 떴는지 확인해봅시다. 

 

$ docker ps

 

포트까지 떠야 정상입니다! 포트가 안뜨고 status에 Restarting이라고 뜬다면 오타가 났다는 얘기입니다. 

 

그리고 이제 프로메테우스에 들어가봅시다. 

 

들어와서 status에 target을 클릭합니다. 

 

처음엔 이부분이 Down으로 되어있을 겁니다. 이제 node-exporter를 다운받아줘야죠

 

5. node-exporter 다운 받기

우선 node-exporter가 뭔지 간단하게 짚고 넘어가도록 하겠습니다. 

 

node-exporter는 CPU, 메모리, 디스크, I/O, 네트워크 등 시스템에 대한 데이터를 보아주는 프로메테우스 exporter 중 하나입니다. 

 

node-exporter의 존재 의의는 하드웨어나 OS 시스템의 메트릭을 모니터링하기 위함입니다. 즉, 쉽게 말하면 모니터링하기 위한 프로메테우스가 가진 도구라는 것입니다. 

 

node-exporter를 다운받고 실행까지 시켜보겠습니다. 

 

$ wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz

$ tar xvfz node_exporter-1.3.1.linux-amd64.tar.gz

$ cd node_exporter-1.3.1.linux-amd64

$ nohup ./node_exporter > node_exporter.log 2>&1 &

 

이렇게 node-exporter를 백그라운드로 실행하면 완료됩니다. 

 

여기서 한 가지 의문이 들 수 있습니다. 왜 nohup을 사용해서 백그라운드로 쓰지? 도커로 띄우면 안되는건가? 

 

맞습니다. 도커로 node-exporter를 띄우게 되면 node-exporter가 내부적으로 컨테이너를 격리시키려고 하기 때문에 도커로 띄우면 골치아파진다고 하니 그냥 백그라운드로 실행하시는게 좋습니다. 

 

다시 프로메테우스 status > targets 로 이동했을 때 Up이라고 떠있는 것을 확인할 수 있을 것 입니다. 

 

이제 모니터링 툴을 사용해야겠죠? 포스팅이 길어져서 그라파나 사용법은 다음 포스팅에서 진행하도록 하겠습니다. 

 

https://coding-review.tistory.com/437

 

그라파나 시작하기

https://coding-review.tistory.com/436 Docker로 Prometheus, Grafana 배포하기 실제 환경을 모니터링하는 것은 매우 중요한 것으로 알려져있습니다. 물론 항상 모니터링 하진 않겠지만 중요한 서비스를 배포해야

coding-review.tistory.com