오랜만에 블로그 포스팅 및 업무 관련 사용한 툴들 기록하기
시작
최근에 시작한 프로젝트에서 맡은 역할이 백엔드(기능개발 + 운영 + 관리)다..
백엔드 기능을 구현하면서 세션같은 재밌는(?)것도 공부했고, 적용도 했는데 이런건 다음에 올려야겠다.
먼저, 가장 최근에 구현한 프로메테우스 + 그라파나 도구로 실시간 리소스 데이터 수집 + 시각화를 진행했다.
간단하게, Prometheus는 애플리케이션이나 시스템의 다양한 메트릭을 수집하는 오픈소스이며, Grafana는 Prometheus와 연동해서 수집한 메트릭을 이용해 실시간 대시보드를 구축하는 도구이다.
여기서, 메트릭은 서비스, 성능, 상태등 지표를 낼 수 있는 값들을 측정할 수 있다.
메트릭 이름, 메트릭 측정된 타임스탬프(시간), 측정된 메트릭 값의 정보로 구성된다.
아키텍처를 보면 Prometheus server는 타겟으로부터 Pull 형식으로 데이터를 주기적으로 가져오고, HDD/SSD에 임시로저장하고, PromQL을 통해 Grafana 같은 시각화툴과 연동되며, 특정 메트릭에 대해서 알람을 보낼수 있게 되어있다.
Docker 와 Docker-compose를 이용해서 Prometheus와 Grafana를 배포했다. ( Docker, Docker-compose는 설치되어 있다고 가정)
Docker-compose를 이용해 배포를 진행하기에 필요한건, prometheus.yml 과 docker-compose.yml 파일이다.
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['node_exporter:9100']
- job_name: 'cadvisor
static_configs:
- targets: ['cadvisor:8080']
- 위는 prometheus.yml 파일
- 전체적으로 메트릭 수집 간격은 15초
- 데이터 수집 대상과 대상의 위치(?)가 정의되어 있다.
- 호스트 시스템 메트릭 -> node_exporter
- docker 내부 메트릭 -> cadvisor
- 모두 기본 포트로 설정해두었다.
version: '3'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml # prometheus 설정 파일 매핑
ports:
- "9090:9090" # Prometheus의 기본 포트
restart: always
deploy:
resources:
limits:
cpus: "0.2"
memory: 256M
cpuset: "3" # CPU 4번 사용
node_exporter:
image: prom/node-exporter:latest
container_name: node_exporter
ports:
- "9100:9100" # Node Exporter의 기본 포트
restart: always
deploy:
resources:
limits:
cpus: "0.1"
memory: 64M
cpuset: "3"
cadvisor:
image: gcr.io/cadvisor/cadvisor
container_name: cadvisor
ports:
- "8080:8080" # cAdvisor의 기본 포트
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
restart: always
deploy:
resources:
limits:
cpus: "0.2"
memory: 128M
cpuset: "3"
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "8084:3000" # Grafana의 내부 포트를 외부 포트 8084로 매핑
restart: always
volumes:
- grafana-storage:/var/lib/grafana
deploy:
resources:
limits:
cpus: "0.5"
memory: 256M
cpuset: "3"
volumes:
grafana-storage:
- 위는 dockercompose.yml 파일
- 우선, prometheus.yml 파일 매핑시키기
- 모든 도커 이미지에 대해, resource 제한을 걸어두기( 최소한의 자원만 할당하고 싶었기 때문에..)
- 기본적으로 모든 도구들 기본 포트 사용 -> Grafana는 외부 포트 8084로 매핑하고, ALB를 통해 8084 포트만 뚫기
관리하기 편하게(?) 컨테이너를 이용하여 진행했다.
- docker-compose up -d 를 이용해서 EC2에 올리게되면 위의 yml 파일에 세팅한 컨테이너 이름으로 띄워지게 된다.
- web ui에서의 갱신시간을 짧게하면, CPU 사용률이 요동치는 걸 볼 수 있다.
- cadvisor를 통해 수집한 메트릭
- 도커 컨테이너의 각 cpu, memory, I/O 관련된 메트릭을 실시간으로 볼 수 있다.
- 위 패널은 아래의 대시보드를 import 하였다
- Docker-cAdvisor | Grafana Labs
- node_exporter를 통해 수집한 메트릭
- EC2의 cpu, memory, I/O, Network traffic 등 다양한 메트릭을 실시간으로 볼 수 있다.
- 위 패널은 아래의 대시보드를 import 하였다
- Node Exporter Full | Grafana Labs
끝
실제로, EC2에 올리기전엔 설치형으로 진행해 보았다만, 서비스 같은경우(web1, web2) 도커 컨테이너로 부하 분산하고, ALB로 로드밸런싱 설정하면서, 도커를 이용하는게 편해서, EC2의 경우 docker-compose로 현재 이용중에 있다.
- 이제 여기에 추가해야하는게, Prometheus가 수집한 메트릭은 일정기간(세팅X -> 15일)만 임시보관을 하는데, 이 데이터를 저장하는 툴을 이용해 저장하는게 1차 목표다.
- 툴 이름은 타노스.......
- 다음엔 세션관련해서 예제랑 올려보겠다.
PromQL는 지금도 잘 모르겠다.
댓글