킹다의 개발블로그
도커 컴포즈(docker-compose)를 이용하는 ELK 구축 본문
로컬에서 구성하는 ELK가 아닌 도커 컨테이너를 이용한 ELK + filebeat 구축이다.
여기다가 나는 오토스케일링을 사용할 것이기때문에 분산처리에 대한 로그수집도 고려할 것이다.
1. 도커 컴포즈를 이용한 ELK 구축
간편하고 빠르게 docker-compose를 통해 구축할 수 있다. (아래 깃허브 레파지토리를 이용하면 많은 설정이 필요하지 않고 구축 가능)
GitHub - ksundong/docker-elk-kor: elk-stack-korean
1. Elasticsearch(엘라스틱서치) 설정하기
1.Elasticsearch.yml 파일 수정
---
## 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: false
#xpack.monitoring.collection.enabled: false
X-Pack은 사용하지 않을 것이기 때문에 모두 주석
- Elasticsearch - Dockerfile
따로 수정할 필요 없음
ARG ELK_VERSION
# https://www.docker.elastic.co/
FROM docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}
#RUN elasticsearch-plugin install -b https://d3g5vo6xdbdb9a.cloudfront.net/downloads/elasticsearch-plugins/opendistro-alerting/opendistro_alerting-1.3.0.1.zip
# Add your elasticsearch plugins setup here
# Example: RUN elasticsearch-plugin install analysis-icu
2. Kibana(키바나) 설정하기
- kibana.yml 파일 수정하기
---
## 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.ts
#
server.name: kibana
server.host: 0.0.0.0
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
#monitoring.ui.container.elasticsearch.enabled: false
## X-Pack security credentials
마찬가지로 kibana dockerfile도 수정할 필요 없음
3. Logstash(로그스태시) 설정하기
- logstash.yml 파일 수정하기
---
## Default Logstash configuration from Logstash base image.
## https://github.com/elastic/logstash/blob/master/docker/data/logstash/config/logstash-full.yml
#
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
## X-Pack security credentials
#
xpack.monitoring.enabled: false
#xpack.monitoring.elasticsearch.username: elastic
#xpack.monitoring.elasticsearch.password: changeme
pipeline
수정!
만약 로그스태시를 이용해 파싱하거나 output을 elasticsearch로 보내고 싶지 않거나 다른 곳으로 보내고 싶을 때 사용하면 됨
input {
beats {
port => "5044"
tags => ["filebeat_tag"]
}
kafka {
bootstrap_servers => ["ip:9092"]
topics => "logTest"
group_id => "foo"
consumer_threads => 1
decorate_events => true
type => "kafka"
auto_offset_reset => "earliest"
tags => ["kafka_tag"]
codec => "json"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
}
output {
if "filebeat_tag" in [tags] {
elasticsearch {
hosts => ["elasticsearch:9200"]
codec => "json"
index => "logstash-applog-%{+YYYY.MM.dd}"
document_type => "_doc"
}
file {
path => "/usr/share/logstash/data/filebeat-log-%{+YYYY.MM.dd}.log"
}
stdout {
codec => "json"
}
}
if "kafka_tag" in [tags] {
file {
path => "/usr/share/logstash/data/log-%{+YYYY.MM.dd}.log"
}
}
}
로그스태시 conf 형식으로는 input, output으로 구성해주면 됨. filter는 필요할 때만 추가
4. docker-compose
- docker-compose.yml
version: '3.3'
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
ports:
- "5044:5044/tcp"
- "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
environment:
NODE_OPTION: "--max-old-space-size=8000"
filebeat:
build:
context: ./filebeat
volumes:
- /run/desktop/mnt/host/d/log:/data
networks:
- elk
depends_on:
- logstash
networks:
elk:
driver: bridge
volumes:
shared-storage:
elasticsearch:
docker-compose 부분은 컨테이너, 네트워크 관련해서 수정할 부분이 있으면 수정해주면 되고 없으면 그대로 실행
filebeat는 docker-elk 깃 레파지토리에는 없지만 추가적으로 작성함. 이 부분은 아래에서 설명
따로 Filebeat폴더와 그 하위에 파일비트를 도커로 올리기위한 Dockerfile
, filebeat.yml
를 생성한다.
- Dockerfile
FROM docker.elastic.co/beats/filebeat:7.12.1
COPY filebeat.yml /usr/share/filebeat/filebeat.yml
USER root
RUN mkdir /log
RUN chown -R root /usr/share/filebeat
- filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- "/data/*.log"
output.logstash:
hosts: ["192.168.0.186:5044"]
filebeat의 input을 log 형태로 가져오겠다고 지정을 한다. enable로 활성화를 해주고 path를 지정해서 어디서 가져올건지 경로를 설정해준다. (*.log 로 지정하면 어떤 이름이든 log파일이면 다 가져오게 된다.)
하지만 이러한 구조는 분산환경에서 문제가 발생한다.
웹 서버를 쿠버네티스로 올릴 경우 로그 수집을 로컬에 저장하게되면, pod가 생성되고 사라지면서 로그가 날라가게 된다. 이런 경우를 위해 docker-compose에 filebeat를 추가했고 volumes을 이용해 마운트할 경로를 지정하고, filebeat가 로그를 수집할 곳을 작성해준다.
networks 필드를 정의해서 elk와 연결될 수 있도록 설정해준다. filebeat 다음 순서는 logstash이기 때문에 depends_on 을 정의하고 logstash 작성.
build:
context: ./filebeat
volumes:
- /run/desktop/mnt/host/d/log:/data
networks:
- elk
depends_on:
- logstash
아래는 내가 이해하려고 그려본 아키텍쳐....? ㅎㅎ
'03. 서버 > elk' 카테고리의 다른 글
Elastic APM 사용해보기 (0) | 2021.08.11 |
---|