Profile picture

[Docker] ELK + Filebeat로 로그 관리 시스템 구축

JaehyoJJAng2024년 03월 10일

개요

최근 운영 중인 리눅스 서버들을 모니터링 하기 위해서 Prometheus와 Grafana를 통해 각 서버들의 메트릭을 수집하고 시각화를 해봤었다.
(Prometheus의 node-exporter로 서버 모니터링하기)


이번에는 각 서버들의 로그 수집을 위해 Elastic Stack(elastic search + logstash + kibana) + Filebeat로 로그 관리 시스템을 구축해보려고 한다.

로그 서버를 구축하는 이유는 다음과 같다.

  • 각 서버들로부터 수집한 로그를 분석해 서버에 오류나 문제가 발생한 것이 있는지
  • 더 견고한 운영 환경을 만들기 위해

ELK Stack ?

ELK는 분석 및 저장 기능을 담당하는 ElasticSearch,

수집 기능을 하는 Logstash,

이를 시각화하는 도구인 Kibana의 앞 글자만 딴 단어이다.

  • Elasticsearch: JSON 기반의 분산현 오픈소스 검색 및 분석 엔진.
    • Logstash를 통해 수신된 데이터를 저장소에 저장하는 역할을 담당.
    • 데이터를 중심부에 저장하여 예상되는 항목을 검색하고 예상치 못한 항목을 밝혀낼 수 있음.
  • Logstash: 여러 소스에서 동시에 데이터를 수집하여 변환하고, Elasticsearch와 같은 "stash"로 전송하는 서버사이드 데이터 처리 파이프라인을 의미함.
    • 수집할 로그를 선정해서 지정된 대상 서버(ElasticSearch)에 인덱싱하여 전송하는 역할을 담당함.
  • Kibana: Elasticsearch에서 색인된 데이터를 검색하여 시각화하며, 막대 차트, 원형 차트, 표, 히스토그램, 지도 등을 생성하여 데이터를 분석할 수 있도록 해줌.

그리고 약자(ELK)에는 없지만 ELK 스택을 구현하기 위해서는 Beats라는 도구도 필요하다.

Beats는 단일 목적의 데이터 수집기인 오픈 소스 플랫폼이다.

  • Filebeat
    • 경량화된 설계로 작동. 시스템 자원을 적게 사용하여 데이터를 수집하므로 성능상의 이점 존재
    • 수집한 로그 데이터를 Elasticsearch 또는 Logstash와 같은 저장소로 실시간 전송함.
    • 중앙 집중화된 로그 시스템에서 로그 데이터를 효과적으로 처리할 수 있는 장점이 있음

ELK 아키텍처 및 흐름

image
출처: guru99.com


ELK 다음과 같은 흐름을 가진다.

  • 1. 데이터 원천에 beats가 붙어서 데이터를 수집함.
  • 2. beats가 수집한 데이터를 logstash에서 적절하게 처리한 뒤 ES로 전송함.
    • Ex. GMT 형식의 timestamp 값을 KST로 변환하는 등.
  • 3. ES는 이 데이터를 인덱싱하여 저장함.
  • 4. ES와 연결된 Kibana UI에서 해당 데이터 조회 가능.

그렇다면 ELK는 어떤 환경에서 사용해야 적합한가?

MSA 기반 애플리케이션에서 발생하는 로그 관리용

MSA에는 여러 대의 분산된 마이크로 서버가 돌아가고 있기 때문에,

한 서버에서 장애가 발생할 경우 다른 마이크로 서비스로 장애가 쉽게 전파된다.


이 에러가 다시 다른 마이크로 서비스로 전파되고, 또 전파되고 ..

이렇게 되면 에러가 어디서, 왜 발생했는지 추적하기가 어려워진다.

그래서 이러한 에러 추적 및 모니터링을 위해 각 마이크로 서버의 로그를 한데(중앙집중) 모아서 관리해야 할 환경이라면

ELK 스택을 도입하는 걸 적극적으로 고민해봐야 한다.


일반적인 로그 관리용

MSA가 아닌 모놀레틱 아키텍쳐 시스템에서라도 기본적인 로그 데이터를 수집하기 위해 ELK 스택을 사용해볼 수 있다.

마찬가지로 시스템에서 발생하는 로그를 저장해 추후 에러 발생 시 관련된 에러 로그를 쉽게 추적할 수 있으니까.


또한 슬랙과 같은 서드파티 툴과 함께 사용되어서 알림을 동반한 모니터링도 가능하다.


하지만 관리해야하는 서버 대수가 많지 않은 환경에서는 ELK 스택을 도입하는 것은 오버 스펙이 아닐까하는 생각이 든다.


쉘 스크립트를 사용해서 서버 로그를 남기거나,

에러 발생에 대한 경우에는 슬랙이나 텔레그램과 같은 메신저가 제공하는 API를 사용해서

프로그램 내에 알림 기능을 구현하는게 가능하기 때문이다.


시스템 아키텍처

아래 사진은 이번 실습에서 어떠한 구조로 ELK 스택이 구축되고,

어떠한 흐름으로 진행되는지 정리해본 구성도라고 보면 될 것 같다.

image

아키텍처 구조는 다음과 같다.

  • 로그 파일들을 Filebeat에서 읽어와 logstash로 전송
  • logstash는 수집한 로그를 필터링해 Elasticsearch로 전송
  • kibana에서 이를 시각화 처리

ELK Stack 구축하기

1. Docker로 ELK 띄우기

소스코드 clone

아래 명령을 실행해 해당 레포지토리를 clone 해주자.

git clone https://github.com/deviantony/docker-elk

이제 현재 경로에 docker-elk 라는 디렉토리가 생성 되었을거다. 해당 경로로 이동해주자.

cd docker-elk

1-1. 환경변수 설정

.env 파일을 열어서

  • ELASTIC_PASSWORD
  • LOGSTASH_INTERNAL_PASSWORD
  • KIBANA_SYSTEM_PASSWORD

위 환경 변수의 값을 수정해주자.(초기값: changeme)


1-2. Elasticsearch 설정 업데이트

elasticsearch/config/elasticsearch.yml 파일을 아래와 같이 수정

---
cluster.name: docker-cluster
network.host: 0.0.0.0
xpack.security.enabled: false

1-3. Kibana 설정 업데이트

kibana/config/kibana.yml 파일의 33번째줄부터 마지막 줄(xpack 관련) 모두 삭제 또는 주석
image


1-4. Logstash 설정 업데이트

logstash/pipeline/logstash.conf 파일을 아래와 같이 수정

input {
    beats {
        port => 5044
    }
}

output {
    elasticsearch {
        hosts => "http://elasticsearch:9200"
        user => "elastic"
        password => "${LOGSTASH_INTERNAL_PASSWORD}"
        index => "logstash-%{+YYYY.MM.dd}"
      }
}

1-5. 컨테이너 실행

docker-compose up -d --build
docker-compose up setup

2. Filebeat 설정

2-1. 설치


1. Download and install the Public Signing Key

curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-keyring.gpg

2. You may need to install the apt-transport-https package on Debian before proceeding

sudo apt-get install apt-transport-https

3. Save the repository definition to /etc/apt/sources.list.d/elastic-8.x.list

echo "deb [signed-by=/usr/share/keyrings/elastic-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list

4. Run apt-get update, and the repository is ready for use. For example, you can install Filebeat by running

sudo apt-get update && sudo apt-get install filebeat

5. To configure Filebeat to start automatically during boot, run

sudo systemctl enable filebeat

2-2. 설정 업데이트

/etc/filebeat/filebeat.yml 파일을 아래와 같이 수정

filebeat.inputs:
  - type: log
    paths:
      - {각자 환경에 맞는 로그 경로}/*.log
output.logstash:
  hosts: ["<logstash 서버 IP>:5044"]

image


2-3. filebeat 실행

sudo filebeat -e -c /etc/filebeat/filebeat.yml -d "publish"

3. 로그 확인

3-1. kibana 접속

http://<kibana_서버IP>:5601 접속
image


3-2. index 설정

Management -> Stack Management 접속
image


kibana -> Data view 접속


Create data view 설정
image
image
위에서 설정image 1-4 Logstash 설정 업데이트에서 설정했던 것처럼 logstash-날짜형식으로 데이터가 잡히고 있음.

해당 인덱스가 잡히도록 패턴을 logstash-*으로 설정해주었음.


3-3. 로그 확인하기

Analytics의 Discover 접속
image


날짜 등의 필터를 걸어서 로그를 확인할 수 있게 되었다!
image


Loading script...