킹다의 개발블로그

도커 컴포즈(docker-compose)를 이용하는 ELK 구축 본문

03. 서버/elk

도커 컴포즈(docker-compose)를 이용하는 ELK 구축

킹다킹 2021. 8. 11. 14:59
반응형

로컬에서 구성하는 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은 사용하지 않을 것이기 때문에 모두 주석

  1. 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(키바나) 설정하기

  1. 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(로그스태시) 설정하기

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

  1. 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 를 생성한다.

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