프로메테우스와 그라파나의 컨테이너를 생성해야하는 상황이다. 이를 위해 각각의 Dockerfile을 생성하여 컨테이너를 만들 수도 있지만 docker-compose.yml 파일을 통해 모든 서비스를 한꺼번에 정의해보았다.
docker-compose는 yaml 형식을 사용하여 설정 파일을 만들 수 있다. 여러개의 컨테이너로부터 이루어진 서비스를 구축, 실행하는 순서를 자동으로 하여 관리를 간단하게 하는 것으로, 여러개의 컨테이너 설정 내용을 하나의 yaml 파일에 모아서 사용한다. compose 파일을 준비해서 커맨드를 1번 실행하는 것만으로 그 파일로부터 설정을 읽어들여 모든 컨테이너 서비스를 실행시킬 수 있다.
✅ 프로메테우스 설치
먼저 root 권한으로 실행 중인지 확인한다.
$ sudo su -
$ id -u # 0이 출력되어야 한다.
먼저 설치 디렉토리를 적당한 곳에 생성한다
mkdir prometheus-grafana
cd prometheus-grafana
Docker를 실행하기 위해 docker-compose.yml 파일을 생성한다.
prometheus-grafana/docker-compose.yml
version: '3.7' # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
prometheus:
user: "0"
image: prom/prometheus
container_name: prometheus
volumes:
- ./prometheus/config:/mnt/user/appdata/prometheus/etc/prometheus
- ./prometheus/volume:/mnt/user/appdata/prometheus/data
ports:
- 9090:9090 # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
command: # web.enalbe-lifecycle은 api 재시작없이 설정파일들을 reload 할 수 있게 해줌
- '--web.enable-lifecycle'
- '--config.file=/mnt/user/appdata/prometheus/etc/prometheus/prometheus.yml'
restart: always
networks:
- promnet
networks:
promnet:
driver: bridge
- Prometheus DockerHub image
- Prometheus의 저장 디렉토리는 ./prometheus/volume으로 지정하였다.
- Prometheus의 설정 디렉토리는 ./prometheus/config으로 지정하였다.
Prometheus 관련 설정 파일이 위치할 디렉토리를 생성한다.
mkdir prometheus
mkdir prometheus/config
/prometheus/config 디렉토리 안에는 설정 파일(prometheus.yml, rule.yml)을 생성한다.
prometheus-grafana/prometheus/config/prometheus.yml
global:
scrape_interval: 15s # scrap target의 기본 interval을 15초로 변경 / default = 1m
scrape_timeout: 15s # scrap request 가 timeout 나는 길이 / default = 10s
evaluation_interval: 2m # rule 을 얼마나 빈번하게 검증하는지 / default = 1m
# Attach these labels to any time series or alerts when communicating with
# external systems (federation, remote storage, Alertmanager).
external_labels:
monitor: 'codelab-monitor' # 기본적으로 붙여줄 라벨
query_log_file: query_log_file.log # prometheus의 쿼리 로그들을 기록, 없으면 기록안함
# 규칙을 로딩하고 'evaluation_interval' 설정에 따라 정기적으로 평가한다.
rule_files:
- "rule.yml" # 파일 위치는 prometheus.yml 이 있는 곳과 동일 위치
- "rule2.yml" # 여러개 가능
# 매트릭을 수집할 엔드포인드로 여기선 Prometheus 서버 자신을 가리킨다.
scrape_configs:
# 이 설정에서 수집한 타임시리즈에 `job=<job_name>`으로 잡의 이름을 설정한다.
# metrics_path의 기본 경로는 '/metrics'이고 scheme의 기본값은 `http`다
- job_name: 'monitoring-item' # job_name 은 모든 scrap 내에서 고유해야함
scrape_interval: 10s # global에서 default 값을 정의해주었기 떄문에 안써도됨
scrape_timeout: 10s # global에서 default 값을 정의해주었기 떄문에 안써도됨
metrics_path: '/asdf' # 옵션 - prometheus가 metrics를 얻기위해 참조하는 URI를 변경할 수 있음 | default = /metrics
honor_labels: false # 옵션 - 라벨 충동이 있을경우 라벨을 변경할지설정(false일 경우 라벨 안바뀜) | default = false
honor_timestamps: false # 옵션 - honor_labels이 참일 경우, metrics timestamp가 노출됨(true일 경우) | default = false
scheme: 'http' # 옵션 - request를 보낼 scheme 설정 | default = http
params: # 옵션 - request요청 보낼 떄의 param
user-id: ['myemail@email.com']
# 그 외에도 authorization 설정
# service discovery 설정(sd)
# 실제 scrap 하는 타겟에 관한 설정
static_configs:
- targets: ['localhost:9090', 'localhost:9100', 'localhost:80'] ## prometheus, node-exporter, cadvisor
labels: # 옵션 - scrap 해서 가져올 metrics 들 전부에게 붙여줄 라벨
service : 'monitor-1'
# relabel_config - 스크랩되기 전의 label들을 수정
# metric_relabel_configs - 가져오는 대상들의 레이블들을 동적으로 다시작성하는 설정(drop, replace, labeldrop)
prometheus-grafana/prometheus/config/rule.yml
groups:
- name: example # 파일 내에서 unique 해야함
rules:
# Alert for any instance that is unreachable for >5 minutes.
- 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 for any instance that has a median request latency >1s.
- 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)"
/prometheus 디렉토리의 권한을 docker에서 수정할 수 있도록 변경한다.
sudo chmod -R 777 ./prometheus
최종 파일을 다 생성하면 아래와 같은 구조가 된다.
.
├── docker-compose.yml
└── prometheus
└── config
├── prometheus.yml
└── rule.yml
✅ Grafana
rafana는 데이터 시각화, 모니터링 및 분석을 위한 오픈소스 플랫폼이다.
docker-compose.yml에서 services:아래 Grafana 설정 내용을 추가한다.
docker-compose.yml
grafana:
image: grafana/grafana
container_name: grafana
# user: "$GRA_UID:$GRA_GID"
ports:
- 3000:3000 # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
volumes:
- ./grafana/volume:/var/lib/grafana
restart: always
networks:
- promnet
Grafana DockerHub Image
https://hub.docker.com/r/grafana/grafana
여기서 Grafana의 저장 디렉토리는 ./grafana/volume로 지정하였다.
✅ Docker 실행
도커 이미지을 생성하고, 컨테이너의 시작을 한꺼번에 처리하는 명령어를 실행시킨다.
docker compose up -d
컨테이너를 중지하려면 다음 명령을 실행한다.
docker compose stop
컨테이너를 다시 시작하려면 다음 명령을 실행한다.
docker compose start
docker-compose 파일 변경 후 재시작하려면 다음 명령을 실행한다.
docker-compose up --build --force-recreate -d
실행한 후에는 아래과 같은 volume 디렉토리가 생기는 것을 볼 수 있다.
.
├── docker-compose.yml
├── grafana
│ └── volume
│ ├── grafana.db
│ ├── grafana.db-journal
│ └── plugins
└── prometheus
├── config
│ ├── prometheus.yml
│ ├── query_log_file.log
│ └── rule.yml
└── volume
└── data
├── chunks_head
├── lock
├── queries.active
└── wal
└── 00000000
마지막으로 실행되는 ec2의 보안그룹 중 3000번 포트와 9090 포트를 오픈시켜주어야 접속할 수 있다.
✅ 접속 실행
Prometheus
→ http://localhost:9090
Grafana
→ http://localhost:3000
기본 계정 ID/PW: admin/admin
참고
https://forums.unraid.net/topic/119128-prometheus-errors/
https://docs.docker.com/engine/install/linux-postinstall/
https://www.devkuma.com/docs/prometheus/docker-compose-install/
'DEVELOP > AWS' 카테고리의 다른 글
AWS | EKS mariadb 구축하기 (0) | 2023.07.20 |
---|---|
AWS | helm chart 이용해 grafana, prometheus, alertmanager 설치하기, slack alarm 설정 (0) | 2023.07.20 |
AWS | EKS, ECR (0) | 2023.06.16 |
KUBERNETES | GCP에서 쿠버네티스 사용해보기 (0) | 2023.06.08 |
KUBERNETES | Taint, Toleration, Drain, Cordon, Daemonset 실습 (0) | 2023.06.08 |