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

해당 폴더를 확인해보면 ELK의 구성요소가 전부 포함되어 있는 것을 확인할 수 있다.

해당 파일들에 대해서 간략하게 설명하자면 다음과 같다.

파일명 경로 설명
.env / 환경변수 정의
비밀번호 설정 시 6자 이상이어야 함.
logstash.yml logstash/config/ 이 파일에는 로그 수집, 필터링, 출력 관련 설정을 포함하여 Logstash의 동작 방식 조정이 가능
logstash.conf logstash/pipeline/ 로그 수집 및 처리에 대한 세부 정보 정의
elasticsearch.yml elasticsearch/config/ 클러스터 이름, 노드 이름, 인덱스 설정, 보안 설정 등 다양한 설정이 포함됨.
kibana.yml kibana/config/ kibana가 Elasticsearch와 어떻게 연결될 지를 정의함.
Elasticsearch의 호스트 URL, 인증 정보, kibana의 기본 설정 등이 포함됨.

1-1. 환경변수 설정 (.env)

연관된 컨테이너들에서 사용되는 환경 변수를 설정해주어야 한다.

.env 파일을 열어보면 다음과 같은 변수들에 기본 값들이 설정되어 있을거다.

여기서 패스워드 관련 변수들에 있는 기본 값들을 지우고 원하는 값으로 변경해주면 된다.

ELASTIC_VERSION=9.0.0

## Passwords for stack users
#

# User 'elastic' (built-in)
#
# Superuser role, full access to cluster management and data indices.
# https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-users.html
ELASTIC_PASSWORD='changeme'
...

1-2. Elasticsearch 설정 업데이트

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

---
cluster.name: docker-cluster
network.host: 0.0.0.0
xpack.security.enabled: true
X-pack Elastic Stack의 기능을 확장하여 보안, 모니터링, 경고, 보고서 등의 관리 기능을 제공하는 모듈

X-pack은 ELK에서 제공하는 유료 라이센스라서 주석 처리를 해주어야 했었지만

Elastic Search 7.2 버전 이상부터 X-pack을 무료로 제공하고 있기 때문에 X-pack 사용을 권장한다.

라이센스 관련 정보


1-3. Kibana 설정 업데이트

kibana는 username, password 외에는 수정할 게 딱히 없다.


참고로 Alerting과 같은 기능을 사용하려면 xpack.security.encryptionKey 키를 등록해줘야 한다.

만약 encryptionKey를 사용할거라면 다음 작업을 참고하면 된다.


1. 안전하고 예측 불가능한 암호화 키 생성하기 (최소 32바이트 길이의 키)

openssl rand -hex 16 # 32자리 16진수 문자열 생성 (32바이트)
# 또는
openssl rand -base64 32 # 더 긴 Base64 문자열 생성 (32바이트 랜덤 데이터)

2. 생성된 키 값을 복사하여 kibana/config/kibana.yml 파일의 다음 부분에 복사해주면 된다.

xpack.security.encryptionKey: <생성된 암호화 키 값>

참고

  • xpack.security.encryptionKey:: 세션 데이터를 암호화하는데 사용하는 키를 설정한다. 이 키는 32자 이상이어야 함.
  • xpack.encryptedSavedObjects.encryptionKey: 암호화된 저장 객체를 암호화하는 데 사용하는 키를 설정한다.
  • xpack.reporting.encryptionKey: 보고서 생성 기능을 암호화하는 데 사용하는 키를 설정한다


1-4. Logstash 설정 업데이트

logstash 설정 파일로는 ymlconf 파일 총 두 개가 있다.

yml은 기본 설정이 되어있기 때문에 따로 수정할 내용이 없다.


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...