관리 메뉴

IT.FARMER

docker 를 이용한 gafana, promethous 사용법 (docker compose) 본문

모티터링도구

docker 를 이용한 gafana, promethous 사용법 (docker compose)

아이티.파머 2023. 4. 27. 23:06
반응형

docker 를 이용한 gafana, promethous 사용법 (docker compose)

grafana-prometheusr-compose.yaml 파일

 

version: '3'
services:
  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: always
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
      - ./grafana/provisioning/:/etc/grafana/provisioning/
    environment:
      - GF_SERVER_ROOT_URL=http://localhost:3000
      - GF_SECURITY_ADMIN_PASSWORD=admin
    depends_on:
      - prometheus

  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/config:/etc/prometheus/
      - prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'

volumes:
  grafana-data:
  prometheus-data

services 에 각각 설정된 valumes은 서비스 내(서비스레벨)에서만 사용하는 볼륨을 정의한것이고 services level 과 같은 레벨에 설정된 volumes은 전역(global) 으로 정의된 것으로 여러 서비스에서 공유해서 사용 할수있는 볼룸을 정의하는 곳이다. 즉 서비스 밖의 ‘volumes’ 에서 정의된 볼륨은 다른 service 에서 참조 할 수있으며, 모든서비스에서 공유 할 수있다.

Grafana 는 설정 파일을 보면 대충 이해할수있다. 하지만 Prometheus 서비스를 보면 조금 생소한 부분이 있는데 command 부분이다. 이영역은 컨테이너가 시작될때의 실행할 명령을 저의 하는 곳이다.

위의 커멘드를보면 두가지의 옵션을 실행하게 되는것을 확인 할 수있다.

--config.file : 프로메테우스 서버가 사용할 설정파일의 경로 지정

--storage.tsdb.path : 프로메테우스서버가 수집한 데이터를 저장할 경로 지정

즉 프로메테우스 컨테이너가 실행되며 실제 쉘커멘드를 날릴때 command 에 정의해둔 옵션을 전달하여 컨테이너가 시작될때 참조 하는 부분이다. 져기서 오해하면 안되는게 /etc/promethues/prometheus.yml 은 절대 경로이지만 실제 위치는 docker 를 실행한 위치에서 참고가 되야 한다. 이유는 volumes 에서 볼륨링크를 ./prometheus 로 설정했기 때문이다.

그림으로 보면 이렇다.

command의 설정은 정대경로로 표기되어 있으나 결국엔 volumes 에 호스트로 연결된 경로이기때문에 실제 prometheus,yml 을 참조 하는 공간은 <host Machine docker shell 실행 패스>/ 링크

즉 !! 다음과 같이 되는것이다.

mezzo@aerepodb-12-97:~/docker$ pwd
/home/mezzo/docker   <-- docker compose 를 실행하는 경로 

mezzo@aerepodb-12-97:~/docker$ ls -al
drwxrwxr-x 4 mezzo mezzo 4096 Apr 19 16:40 .
drwxr-xr-x 7 mezzo mezzo 4096 Apr 19 16:40 ..
drwxr-xr-x 3 root  root  4096 Apr 19 14:02 **grafana**
-rw-rw-r-- 1 mezzo mezzo  299 Apr 19 14:00 grafana-docker-compose.yaml
-rw-rw-r-- 1 mezzo mezzo  780 Apr 19 14:04 grafana-promethous-compose.yaml
drwxr-xr-x 3 root  root  4096 Apr 19 14:02 **prometheus**
-rw-rw-r-- 1 mezzo mezzo   64 Apr 19 14:30 readme.md

**prometheus-data**폴더도 미리 생성해 두어야 한다.

mezzo@aerepodb-12-97:~/docker$ mkdir prometheus-data
mezzo@aerepodb-12-97:~/docker$ ls -al
total 32
drwxrwxr-x 5 mezzo mezzo 4096 Apr 19 16:43 .
drwxr-xr-x 7 mezzo mezzo 4096 Apr 19 16:40 ..
drwxr-xr-x 3 root  root  4096 Apr 19 14:02 grafana
-rw-rw-r-- 1 mezzo mezzo  299 Apr 19 14:00 grafana-docker-compose.yaml
-rw-rw-r-- 1 mezzo mezzo  780 Apr 19 14:04 grafana-promethous-compose.yaml
drwxr-xr-x 3 root  root  4096 Apr 19 14:02 prometheus
drwxrwxr-x 2 mezzo mezzo 4096 Apr 19 16:43 **prometheus-data**
-rw-rw-r-- 1 mezzo mezzo   64 Apr 19 14:30 readme.md
mezzo@aerepodb-12-97:~/docker$

docker 에서 자동생성된 폴더는 root:root 권한으로 되어 있고, 직접 생성한 폴더는 $USER:$USER 로 권한이 생긴다. 이유는 docker는 보안상 root 로 실행되기 때문이다.

폴더는 미리 생성해 두는게 좋다.

이제 컨테이너 실행시 참조할 promethous.yml 파일을 다운로드 받고 node agent가 설치된 서버들을 등록해준다.

wget https://raw.githubusercontent.com/prometheus/prometheus/main/documentation/examples/prometheus.yml

mezzo@aerepodb-12-97:~/docker/prometheus/config$ pwd
/home/mezzo/docker/prometheus/config
mezzo@aerepodb-12-97:~/docker/prometheus/config$ ls -al
total 12
drwxr-xr-x 2 root root 4096 Apr 19 16:05 .
drwxr-xr-x 3 root root 4096 Apr 19 14:02 ..
-rw-r--r-- 1 root root 1102 Apr 19 14:40 prometheus.yml
mezzo@aerepodb-12-97:~/docker/prometheus/config$ vim prometheus.yml

# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090","192.168.12.89:9100","192,168.12.90:9100","192.168.12.91:9100","192.168.12.92:9100","192.168.12.93:9100","192.168.12.94:9100","192.168.12.95:9100","192.168.12.96:9100"]

["localhost:9090"] 은 프로메테우스가 설치된 서버이고, 나머지는 에이전트가 설치된 서버이다.

실행방법

docker compose -f grafana-promethous-compose.yml up --build -d 

# 서비스 확인 
mezzo@aerepodb-12-97:~/docker/prometheus/config$ docker ps
CONTAINER ID   IMAGE                                                                     COMMAND                  CREATED       STATUS       PORTS                                       NAMES
5430ecb2520e   grafana/grafana:latest                                                    "/run.sh"                3 hours ago   Up 2 hours   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   grafana
551fc78e24e0   prom/prometheus:latest                                                    "/bin/prometheus --c…"   3 hours ago   Up 2 hours   0.0.0.0:9090->9090/tcp, :::9090->9090/tcp   prometheus

이렇게 서버시스가 올라간뒤에 서버에 접속하여 설치된 그라파나 서버와 프로메테우스 서버를 확인 할수있다.

  • http://:3000

접속시 비밀번호는 yml 파일에 입력했던 admin/admin 을 사용하고 첫로그인 할때 비밀번호를 변경한다.

  • http://:9090

우린 아직 에이전트를 설치 하지 않았지만, 필자는 모니터링 하려는 서버에 이미 에이전트를 설치해 두었기때문에 타겟의 목록이 보인다. 처음 설치하면 리스트는 비어있다.

이제 실제 서버 시스템을 모니터링 하기 위해서는 프로메테우스 에이전트(promethous agent)와 노드익스포터(node exporter) 를 설치하고 설정을 해야 한다.

다음으로 각서버마다 노드 익스포터를 설치하고, 프로테우스 서버의 설정파일을 변경하는 방법을 알아보겠다.

  1. node expoter 설치하기 위한 yml 파일을 만든다.

node-expoter-compose.yaml

version: '3'
services:
  node_exporter:
    image: prom/node-exporter
    ports:
      - "9100:9100"
    command:
      - '--path.rootfs=/host'

  prometheus_agent:
    image: prom/node-exporter
    volumes:
      - /:/host:ro
    command:
      - '--path.rootfs=/host'
      - '--collector.textfile.directory=/etc/prometheus/textfile_collector'
  1. 다음명령어를 실행하여 생성한 yaml 파일을 서비스 한다.
dockler-compose -f **node-expoter-compose.yaml -d --build up

CONTAINER ID   IMAGE                                                                     COMMAND                  CREATED          STATUS          PORTS                                       NAMES
4e18379a9ddb   prom/node-exporter                                                        "/bin/node_exporter …"   52 minutes ago   Up 52 minutes   9100/tcp                                    docker_prometheus_agent_1
6566be83ff0a   prom/node-exporter                                                        "/bin/node_exporter …"   52 minutes ago   Up 52 minutes   0.0.0.0:9100->9100/tcp, :::9100->9100/tcp   docker_node_exporter_1
e5ac41a0f164   grafana/grafana:latest                                                    "/run.sh"                53 minutes ago   Up 53 minutes   0.0.0.0:3000->3000/tcp, :::3000->3000/tcp   grafana
c00b755a63bc   prom/prometheus:latest                                                    "/bin/prometheus --c…"   53 minutes ago   Up 53 minutes   0.0.0.0:9090->9090/tcp, :::9090->9090/tcp   prometheus**
  1. 서버가 동작되는것을 확인해보자
  • http://:9100/metrics

해당 서버에 접속하게 되면 promethous server 에서 폴링해서 가져갈 내용을 node_exporter(server:9001) 서버의 9100 포트를 통해 metrics 를 제공하는 것을 확인 해볼수있다.

이렇게 하고나면 프로메테우스에서 해당서버의 9001 포트를 통해 데이터를 가져올수있게된다. 그럼 이제 promethous 서버에서 설정을 조금 변경하여 타겟서버의 데이터를 폴링할수있도록 설정을 변경하자.

최초 작성했던 grafana-prometheusr-compose.yaml 파일을 보면 ./pormethous/config 경로에 promethous.yml 파일이 존재하는것을 알수있다. 해당 파일을 열어 target 정보에 내가 수집 하려는 서버의 즉! 방금 에이전트를 설치한 서버 정보를 추가한다.

vim prometheus.yml

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9090",**"192.168.12.89:9100"**]

다다

docker-compse 로 수정된 config 로 재시작한다.

docker-compose -f **grafana-prometheusr-compose.yaml up -d**

새로운 설정을 읽어서 구동이 되었으면 앞서 보았던 promethous server로 접속 한다. (http://:9100/targets)

위와 같이 활성화된 상태로 192.168.12.89 번을 polling 하는 것을 확인 할 수있다.

그럼 이제 Grafana 에서 Propethous 지표를 보기 위해 promethous server plug-in 을 그라파나에 설치한다.

  1. grafana , promethous plug in 설치
  2. configuration > add new data source

3. prothoumes 선택

4.프로메테우스 서버가 설치된 정보 입력

  • url : promethous server 가 설치 된 서버의 url 및 port 입력

이제 grafana 에 promethous 플러그인까지 설치 되었으며, 그라파에에 대쉬보드를 만들어 수집된 matrics 지표를 확인해보자 .

직접 데시보드를 꾸밀수있지만. 기존에 잘 말들어둔 양식들이 있음으로 해당 사이트에 접속하여 괜찮은 데시보드를 임포트 하자 .

Node Exporter Full | Grafana Labs

copy id to clipboard 나 download json 을 눌러 데이터를 복사한다. 필자는 id 로 했다.

복사한 아이디를 넣어주고 change 를 눌러주면 데이터가 생성된다. 필자는 똑같은 내용이 이미 있기때문에 데시보드가 이미 있다고 나왔다.

이렇게 임포트를 완료하고 데시보드에서 방금 생성한 Node Exporter Full 데시보드를 선택하면 다음과 같은 화면을 확인 할 수있다.

우측 상단의 시간타임을 조정 하여 확인 하고 싶은 시간대의 데이터를 확인 할수도 있고, 그래프내에 특정 부분을 드레그하여 해당 시간대의 리소스 정보를 확인 할 수 있다. 여러대의 호스트에 설치 하였다면 호스트 정보를 변경해가며 정보를 확인 할 수있다.

다음엔 Loki 와 promtail 을 사용하여 분산코디네이터 로그 수집과 grafana에서 수집된 로그를 확인 하는 방법을 알아보자.

최종적으로 구성된 그림은 다음과 같다

모니터링해야할 호스트가 늘어나면 위에 에이전트 설치 과정을 따라주고 promethous.config.yml 파일의 targets 에 호스트 아피를 추가하며 늘려주면 된다.

반응형