ELK란 Elasticsearch, Logstash, Kibana를 말한다. ELK는 log 분석을 하기 위해 세계적으로 사용하는 인기있는 log 관리 platform 중 하나다. ELK 중 Logstash는 input source으로부터 logging data나 다른 event들을 추출한다. Logstash는 그 event들을 처리하고 그 data들을 Elasticsearch에 저장한다.
Kibana는 Elasticsearch의 log에 access하는 시각화 Tool이다. 그리고 user에게 선 그래프, 바 그래프, 파이 차트 등의 형태로 보여준다.
Logstash는 log가 쌓여있는 모든 원격 source로부터 데이터를 수집하고, Elasticsearch로 push한다.
Elasticsearch는 수집된 data의 database 역할을 한다.
Kibana는 Elasticsearch로부터 그 data를 사용해 사용자에게 바 그래프, 파이 차트, 히트맵과 같은 형태로 표현한다.
Directory 구조와 config 파일들은 다음과 같다. 해당 Directory는 아래 경로에서 받을 수 있다.
https://github.com/jeongseok912/ELK
하지만 지금 다른 directory 및 file은 살펴보지 않고, docker-elk
디렉토리 구조에 대해 살펴본다.
어떻게 동작할지 정의하고 사용하는 Directory와 File은 다음과 같다.
docker-elk : ELK config 파일 및 Docker 관련 설정 Directory
├── elasticsearch : Elasticsearch config 파일 및 Docker Image 설정 directory
│ ├── config
│ │ └── elasticsearch.yml : Elasticsearch config 파일
│ └── Dockerfile : Elasticsearch Docker Image를 빌드하기 위한 파일
├── kibana : Kibana config 파일 및 Docker Image 설정 Directory
│ ├── config
│ │ └── kibana.yml` : Kibana config 파일
│ └── Dockerfile : Kibana Docker Image를 빌드하기 위한 파일
├── logstash : Logstash config 파일, pipeline, data, Docker Image 설정 Directory
│ ├── config
│ │ └── logstash.yml : Logstash config 파일
│ ├── input_data : Logstash로 추출 및 처리할 입력 데이터 Directory
│ ├── pipeline : Logstash pipeline들을 정의하는 Directory
│ │ └── logstash.conf : Pipeline 정의 File
│ └── Dockerfile : Logstash Docker Image를 빌드하기 위한 파일
└── docker-compose.yml : ELK Docker Image를 빌드하고, container 설정을 정의하는 File
## Default Elasticsearch configuration from Elasticsearch base image.
## https://github.com/elastic/elasticsearch/blob/master/distribution/docker/src/docker/config/elasticsearch.yml
#
cluster.name: "docker-cluster"
network.host: 0.0.0.0
## X-Pack settings
## see https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-xpack.html
#
xpack.license.self_generated.type: trial
xpack.security.enabled: true
xpack.monitoring.collection.enabled: true
ARG ELK_VERSION
# https://www.docker.elastic.co/
FROM docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}
# Add your elasticsearch plugins setup here
# Example: RUN elasticsearch-plugin install analysis-icu
## Default Kibana configuration from Kibana base image.
## https://github.com/elastic/kibana/blob/master/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.js
#
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true
## X-Pack security credentials
#
elasticsearch.username: elastic
elasticsearch.password: changeme
ARG ELK_VERSION
# https://www.docker.elastic.co/
FROM docker.elastic.co/kibana/kibana:${ELK_VERSION}
# Add your kibana plugins setup here
# Example: RUN kibana-plugin install <name|url>
## Default Logstash configuration from Logstash base image.
## https://github.com/elastic/logstash/blob/master/docker/data/logstash/config/logstash-full.yml
#
http.host: "0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
## X-Pack security credentials
#
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: changeme
input {
tcp {
port => 5000
}
file {
path => "/usr/share/logstash/input_data/covid-19-all.csv"
start_position => "beginning"
sincedb_path => "NUL"
}
}
filter {
csv {
separator => ","
columns => ["Region","Province","Latitude","Longitude","Confirmed","Recovered","Deaths","Date"]
}
date {
match => ["Date", "YYYY-MM-dd"]
target => "Date"
}
mutate {
convert => {"Confirmed" => "float"}
convert => {"Recovered" => "float"}
convert => {"Deaths" => "float"}
convert => {"Longitude" => "float"}
convert => {"Latitude" => "float"}
}
mutate {
rename => {
"Longitude" => "[location][lon]"
"Latitude" => "[location][lat]"
}
}
}
output {
elasticsearch {
hosts => "elasticsearch:9200"
user => "elastic"
password => "changeme"
index => "covid-19-all-%{+dd.MM.YYYY}"
}
stdout {codec => json_lines}
}
ARG ELK_VERSION
# https://www.docker.elastic.co/
FROM docker.elastic.co/logstash/logstash:${ELK_VERSION}
# Add your logstash plugins setup here
# Example: RUN logstash-plugin install logstash-filter-json
version: '3.2'
services:
elasticsearch:
build:
context: elasticsearch/
args:
ELK_VERSION: $ELK_VERSION
volumes:
- type: bind
source: ./elasticsearch/config/elasticsearch.yml
target: /usr/share/elasticsearch/config/elasticsearch.yml
read_only: true
- type: volume
source: elasticsearch
target: /usr/share/elasticsearch/data
ports:
- "9200:9200"
- "9300:9300"
environment:
ES_JAVA_OPTS: "-Xmx256m -Xms256m"
ELASTIC_PASSWORD: changeme
# Use single node discovery in order to disable production mode and avoid bootstrap checks
# see https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
discovery.type: single-node
networks:
- elk
logstash:
build:
context: logstash/
args:
ELK_VERSION: $ELK_VERSION
volumes:
- type: bind
source: ./logstash/config/logstash.yml
target: /usr/share/logstash/config/logstash.yml
read_only: true
- type: bind
source: ./logstash/pipeline
target: /usr/share/logstash/pipeline
read_only: true
- type: bind
source: ./logstash/input_data
target: /usr/share/logstash/input_data
ports:
- "5000:5000/tcp"
- "5000:5000/udp"
- "9600:9600"
environment:
LS_JAVA_OPTS: "-Xmx256m -Xms256m"
networks:
- elk
depends_on:
- elasticsearch
kibana:
build:
context: kibana/
args:
ELK_VERSION: $ELK_VERSION
volumes:
- type: bind
source: ./kibana/config/kibana.yml
target: /usr/share/kibana/config/kibana.yml
read_only: true
ports:
- "5601:5601"
networks:
- elk
depends_on:
- elasticsearch
networks:
elk:
driver: bridge
volumes:
elasticsearch:
docker-compose.yml
파일이 있는 docker-elk
Directory에서 아래 명령어 실행
docker-compose up --build
# or
docker-compose up -d --build
-d
옵션을 쓰면 elasticsearch, logstash, kibana container가 구동되다가 중단되는 경우의 container 에러를 찾기 어렵다.--build
이미지를 문제없이 한 번 빌드했다면 굳이 이 옵션을 추가할 필요는 없다. docker ps
명령으로 container 정상 동작 확인
각 서비스가 docker-compose
명령으로 실행 후 아래와 같이 3개 container가 구동되어야 하지만 config 파일 등의 설정을 잘못하면 중간에 container가 종료되기도 한다.
인터넷 브라우저에서 localhost:9200
로 이동
계정은 config 파일을 바꾸지 않았다면 아래와 같다.
사용자 이름 : elastic
암호 : changeme
정상적으로 구동되면 다음과 같은 화면을 볼 수 있다.
Logstash pipeline을 통해 추출한 데이터를 확인한다는 것은 결국 Elasticsearch에 데이터가 잘 저장되어 있는지 확인하는 작업이다.
localhost:9200/_cat/indices
로 이동한다.
logstash.conf
파일 정의에 보면 path => "/usr/share/logstash/input_data/covid-19-all.csv"
를 통해 covid-19-all.csv
파일을 가져오고, index => "covid-19-all-%{+dd.MM.YYYY}"
를 통해 Elasticsearch에 뒤에 날짜를 붙인 이름으로 index를 생성하였다.
Elasticsearch에 데이터가 저장된 걸 확인할 수 있다(노란색 마킹)
localhost:9200/[index 이름]
으로 이동하면 어떻게 저장되었는지 index의 상세 정보를 확인할 수 있다.
http://localhost:5601
로 이동하여 Log in을 해준다.
계정은 config 파일을 변경하지 않으면 위에서 보았던 계정과 동일하다.
Username : elastic
Password : changeme
왼쪽 네비게이션에서 [Management] - [Index Management]에 들어가면 CSV에서 추출한 데이터로 저장한 index가 보이는 걸 확인할 수 있다.
감사합니다 많은 도움이 되었습니다~!