개요
바로 이전 게시글에서 ELK + Filebeat로 로그 관리 시스템 구축을 진행했었다.
개인용 서버에서 무거운 ELK 스택을 쓸 이유가 굳이 있을까? 라는 생각이 들었다.
그리고 ELK 스택은 무엇보다 러닝 커브가 좀 있다.
노드 설정이나 logstash의 파이프 라이닝 등의 여러 가지 복잡한 설정들로 인해 시스템 구축이 그리 쉬운 편은 아닌 것 같다.
그렇게 해서 찾게된 것이 Grafana
, Promtail
, Loki
이다.
이번 포스팅에서는 grafana, promtail, loki를 사용해 로그 시스템을 구축해보려고 한다.
Promtail
Promtail은 로컬 로그의 내용을 grafana loki 또는 grafana cloud로 전송하는 에이전트이다.
일반적으로 모니터링해야 하는 모든 머신에 배포된다.
Promtail이 타겟(특정 파일)을 바라보고 있고, promtail 내의 레이블(label) 설정이 올바르게 되었다면 해당 파일을 읽기 시작한다.
promtail은 파일을 일괄적으로 읽고 충분한 데이터를 읽었을 경우(설정한 timeout
, memory
를 기준으로 판단) flush가 일어나 Loki로 로그가 적재된다.
또한, promtail은 다음의 API 엔드포인트를 통해 접근 가능하다.
GET /ready
promtail이 정상적으로 구동되며 target을 하나 이상 바라보고 있을 경우 200
으로 응답한다.
GET /metrics
prometheus로 전송할 수 있는 promtail의 메트릭 정보를 담고 있으며, 어떤 메트릭 정보가 노출되는지는 https://grafana.com/docs/loki/latest/operations/meta-monitoring/에서 확인 가능하다.
Loki
로키는 Grafana lab에서 만든 오픈소스 프로젝트이다.
수평 확장이 가능하며 가용성이 높은 여러 테넌트(사용자 그룹)를 지원하는 로그 집계 시스템이다.
자원을 굉장히 효율적으로 사용하며 운영이 비교적 쉽게 설계되어 있다.
또한, Elasticsearch와는 다르게 log의 컨텐츠를 인덱싱 하지는 않고, 로그 시스템의 레이블(label)을 설정하여 로그 집계가 가능하다.
시스템 아키텍처
아키텍처 구조는 다음과 같다.- 로그 파일들을 Promtail에서 읽어와 Loki로 전송
- Loki에서 로그들을 수집 및 저장하고 Grafana로 전송
- Grafana에서 로그들을 시각화
설치하기
Grafana
와,Loki
는 모니터링 서버에 Docker로 배포된다.Promtail
은 클라이언트 서버 또는 PC에 설치된다.
먼저, 프로젝트 디렉토리를 생성해주자.
mkdir -p docker-log/loki/config
[Docker] Grafana, Loki 설치
- Grafana: https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/
- Loki: https://grafana.com/docs/loki/latest/setup/install/docker/
도커 컴포즈 작성
docker-log
하위에 docker-compose.yaml
파일의 내용을 아래와 같이 작성해주자.
networks:
log-net:
driver: bridge
external: false
volumes:
grafana-data: {}
services:
grafana:
image: grafana/grafana
container_name: grafana
restart: always
volumes:
- type: volume
source: grafana-data
target: /var/lib/grafana
ports:
- "3000:3000"
networks:
- log-net
loki:
image: grafana/loki
container_name: loki
restart: always
volumes:
- type: bind
source: ./loki/config/local-config.yml
target: /etc/loki/local-config.yml
ports:
- "3100:3100"
networks:
- log-net
설정 파일 업데이트
- ./loki/config/local-config.yml
auth_enabled: false
server:
http_listen_port: 3100 // 서버 리스닝 포트 설정
common:
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper // 인덱스 저장소 유형
object_store: filesystem // 객체 저장소 유형
schema: v11
index:
prefix: index_
period: 24h // 인덱스 파일 생성 주기
ruler:
alertmanager_url: http://localhost:9093
[Client] Promtail 설치
- 이번 실습에서는 Docker로 Promtail을 띄울 것임.
- 클라이언트 환경에 도커가 설치되어 있어야 함.
클라이언트에서 docker-promtail
이라는 디렉토리를 생성해주자.
mkdir -p docker-promtail
1. 도커로 설치하는 경우
https://grafana.com/docs/loki/latest/send-data/promtail/installation/
2. APT or RPM 패키지 매니저로 설치하는 경우
https://grafana.com/docs/loki/latest/setup/install/local/#install-using-apt-or-rpm-package-manager
도커 컴포즈 작성
docker-compose.yaml
파일을 아래와 같이 작성
services:
promtail:
image: grafana/promtail:latest
container_name: promtail
restart: always
volumes:
- type: bind
source: /var/log # 원하는 로그 경로를 명시
target: /mnt/logs
- type: bind
source: promtail-config.yml
target: /etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
promtail
의 경우 외부 접속을 허용하지 않을 것이기 때문에 port
속성은 따로 명시하지 않았음.
설정 파일 업데이트
- ./promtail-config.yml
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://모니터링서버IP:3100/loki/api/v1/push #모니터링 서버 IP
scrape_configs:
- job_name: [job name]
static_configs:
- targets:
- localhost # 로그를 수집할 곳
labels:
job: [label name]
__path__: [log 파일 경로]
clients
의 url은 Promtail이 로그 데이터를 전송할 Loki 서버의 주소를 기입해주면 된다.
또한, 나는 하나의 Job만 등록시켰지만 에러 로그 별로 로그 백업을 하고 있다면 에러 로그별로 job을 여러개 등록시킬 수도 있다.
그리고 __path__
의 경우에는 도커 컴포즈 작성에서 작성했었던 타겟 경로의 /mnt/logs
로 잡아줘야 한다.
(호스트 /var/log
디렉토리의 파일들이 컨테이너의 /mnt/logs
로 바인드 되니까.)
그라파나에서 로그 확인하기
Connections - Data sources로 들어가서 Add data source를 클릭하자.
loki를 찾아서 선택해주고
로키 서버의 url을 입력한 후 Save & Test
를 클릭하자.
대시보드에 연결하면 아래와 같이 로그 확인이 가능하다.