Profile picture

[Docker] Loki,Grafana,Promtail로 로그 관리 시스템 구축

JaehyoJJAng2024년 03월 11일

개요

바로 이전 게시글에서 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)을 설정하여 로그 집계가 가능하다.


시스템 아키텍처

image description 아키텍처 구조는 다음과 같다.
  • 로그 파일들을 Promtail에서 읽어와 Loki로 전송
  • Loki에서 로그들을 수집 및 저장하고 Grafana로 전송
  • Grafana에서 로그들을 시각화

설치하기

  • Grafana와, Loki는 모니터링 서버에 Docker로 배포된다.
  • Promtail은 클라이언트 서버 또는 PC에 설치된다.

먼저, 프로젝트 디렉토리를 생성해주자.

mkdir -p docker-log/loki/config

[Docker] Grafana, Loki 설치


도커 컴포즈 작성

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 파일 경로]

image
clients의 url은 Promtail이 로그 데이터를 전송할 Loki 서버의 주소를 기입해주면 된다.

또한, 나는 하나의 Job만 등록시켰지만 에러 로그 별로 로그 백업을 하고 있다면 에러 로그별로 job을 여러개 등록시킬 수도 있다.

그리고 __path__의 경우에는 도커 컴포즈 작성에서 작성했었던 타겟 경로의 /mnt/logs로 잡아줘야 한다.
(호스트 /var/log 디렉토리의 파일들이 컨테이너의 /mnt/logs로 바인드 되니까.)


그라파나에서 로그 확인하기

Connections - Data sources로 들어가서 Add data source를 클릭하자.
image


loki를 찾아서 선택해주고
image


로키 서버의 url을 입력한 후 Save & Test를 클릭하자.
image


대시보드에 연결하면 아래와 같이 로그 확인이 가능하다.
image


Loading script...