개요
최근 운영 중인 리눅스 서버들을 모니터링 하기 위해서 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 아키텍처 및 흐름
출처: 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 스택이 구축되고,
어떠한 흐름으로 진행되는지 정리해본 구성도라고 보면 될 것 같다.
아키텍처 구조는 다음과 같다.
- 로그 파일들을 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은 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
설정 파일로는 yml
과 conf
파일 총 두 개가 있다.
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. 설치
- debian 계열 기준
- https://www.elastic.co/kr/downloads/beats/filebeat
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"]
2-3. filebeat 실행
sudo filebeat -e -c /etc/filebeat/filebeat.yml -d "publish"
3. 로그 확인
3-1. kibana 접속
http://<kibana_서버IP>:5601
접속
3-2. index 설정
Management -> Stack Management 접속
kibana -> Data view 접속
Create data view 설정
위에서 설정
1-4 Logstash 설정 업데이트에서 설정했던 것처럼
logstash-날짜형식
으로 데이터가 잡히고 있음.
해당 인덱스가 잡히도록 패턴을 logstash-*
으로 설정해주었음.
3-3. 로그 확인하기
Analytics의 Discover 접속
날짜 등의 필터를 걸어서 로그를 확인할 수 있게 되었다!