Docker EFK Stack 설치 및 적용
728x90

EFK stack을 Docker로 띄워보겠다.

아직 docker 도 잘 모르고 compose 작성 법도 잘 몰라 블로그를 돌아다니며 이것저것 적용시켜보며 만든 efk 이다.

OS : Window 10
Version : elasticsearch 7.15.0 , kibana 7.15.0, fluentd 0.12-debian

tool : vs code

폴더 생성

ek-compose라는 폴더를 만들어준다. 해당 파일의 경로로 이동하여 docker-compose.yml 파일을 생성 후 작성해준다.

ek-compose 구조

일단 폴더만 생성 해놓는다.

docker-compose 시 필요한 파일 작성

docker-compose.yml

version: '2' # version 별로 넣을 수 있는 옵션? 이 다른거 같다. docker-compose 사이트에서 버전별로 어떤게 쓰이는지 찾아보는게 좋다.
services:   # 실제 docker-compose로 올릴 이미지들
  fluentd: 
    build: ./fluentd  # 아까 폴더 구조에서 본 flunetd 폴더에 있는 Dockerfile을 보고 빌드
    container_name: fluentd # container-name 을 설정
    volumes: # container의 폴더와 로컬의 폴더를 이어줌.
      - ./fluentd/conf:/fluentd/etc
      - ./fluentd/var/log/tmp:/var/log/tmp   # fluentd에서 pos_file의 경로를 이렇게 정해줌.
    links: # elasticsearch와의 링크
      - "es01"
    depends_on: # elasticsearch가 켜지면 같이 켜짐.
      - es01
    ports:  # port 설정
      - "24224:24224"
      - "24224:24224/udp"
    networks:  # elasticsearch, kibana, fluentd를 한 네트워크 안에다가 넣어줘야지 컨테이너끼리 통신이 가능하다.
      - elastic

  es01: # elasticsearch  이름을 es01로 해뒀다.
    image: docker.elastic.co/elasticsearch/elasticsearch:7.15.0 # elasticsearch로만 해두면 오류나기때문에 이렇게 해뒀다.
    container_name: es01 #container name
    environment: # 환경설정(?) container 내부 config
      - node.name=es01 # node 이름 설정
      - "discovery.type=single-node" # single-node로 설정
      - "bootstrap.memory_lock=true" # memory lock
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m" # 두 수치가 같지 않으면 error남.
    volumes: 
      - type: bind
        source: "./elasticsearch/config/elasticsearch.yml" # elasticsearch의 config 파일이다. 원본은 local에서 작성하고 
        target: /usr/share/elasticsearch/config/elasticsearch.yml #target폴더인 container 내부 폴더에다가 넣어주는 역할
        read_only: true
    ulimits:
      memlock:
        soft: -1
        hard: -1
    expose:
      - "9200"
    ports: # port
      - "9200:9200"
    networks: # 한 네트워크 안에 묶어줌.
      - elastic

  kibana: 
    container_name: kibana
    image: docker.elastic.co/kibana/kibana:7.15.0 # elastic과 버전을 동일하게 해줬다. 버전 마다 호환되는 elasticsearch의 버전이 다르므로 elastic과 버전 숫자를 맞춰주었다.
    volumes: 
      - type: bind
        source: "./kibana/config/kibana.yml"
        target: /usr/share/kibana/config/kibana.yml
        read_only: true
    ports:
      - 5601:5601
    # Elasticsearch Start Dependency
    depends_on:
      - es01
    links: # link
      - "es01"
    networks:
      - elastic

networks: # 네트워크 설정
  elastic:
    driver: bridge

elasticsearch/config/elasticsearch.yml

처음 설정하는 거라서 보안 설정 등은 false로 했다.

## 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: true

kibana/config/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.js
#
server.name: kibana
server.host: 0.0.0.0
elasticsearch.hosts: ["http://es01:9200"]   # elastic의 service 명을 넣었다. (container명을 넣어야 하는지는 잘....)
xpack.monitoring.ui.container.elasticsearch.enabled: true

Dockerfile

Dockerfile을 생성할 때 이름에 주의 DockerFile인줄 알고 했다가 D를 제외한 글자는 소문자인 걸 모르고 했다가 에러만 났었다.

# fluentd/Dockerfile
FROM fluent/fluentd:v0.12-debian
RUN fluent-gem install elasticsearch -v 7.5  # fluentd 내부의 elasticsearch 
RUN fluent-gem install elasticsearch-transport -v 7.5.0
RUN fluent-gem install fluent-plugin-elasticsearch -v 1.13.0 --no-rdoc --no-ri # fluentd에서 elastic으로 output 할 수 있게 해주는 plugin

/fluentd/conf/fluentd.conf

# fluentd/conf/fluent.conf
# <source>
#  @type forward
#  port 24224
#  bind 0.0.0.0
# </source>
<source>
  @type tail
  @log_level warn
  format json # test할 때 json 형태로 넣어야된다. 아니면 무시당함.
  path /var/log/%Y-%m-%d.log # fluentd가 tail할 경로
  pos_file /var/log/tmp/log_file.pos # 어디까지 읽었는지 저장하는 경로
  tag log.test # tag 명
</source>
<match *.**>
  @type copy
  <store>
    @type elasticsearch
    host es01 # 아까 kibana.yml 작성 때 elasticsearch의 host를 정해줬는데 동일하게 설정
    port 9200
    logstash_format true
    logstash_prefix fluentd # elastic으로 들어갈 때 인덱스명 제일 앞에 넣을 이름 -> fluentd-20220517 이렇게
    logstash_dateformat %Y%m%d # fluentd- 뒤에 들어간다.
    include_tag_key true
    type_name access_log
    tag_key @log_name
    flush_interval 1s # 1초에 한번씩 elastic으로 flush
  </store>
  <store>
    @type stdout
  </store>
</match>

이제 설정이 끝났으면 명령어를 통해서 컨테이너를 띄우면 된다.

명령어

docker-compose.yml 파일이 있는 디렉토리로 cd 를 통해 진입 후

docker-compose up --build

좀 기다리다가 에러 없으면 성공이다.

이제 연동 되었는지 확인

localhost:9200, localhost:5601 이 잘 뜨는 지 확인하면 된다.

Test

fluentd 컨테이너 접속

docker exec -it fluentd /bin/bash

fluentd.conf에서 작성했던 tail의 path 경로로 들어간다.

cd /var/log

나는 echo로 메시지를 넣어볼 예정이다.

echo '{"test":"testmessage"}' | tee -a /var/log/2022-05-17.log

fluentd.conf에서 source 부분에서 작성했던 path의 경로에 2022-05-17.log가 생성이 되고 {"test":"testmessage"}가 들어간다.

이렇게 되면 elasticsearch에 log가 적재 되었다.

이제 localhost:5601로 가서

이 경로로 가면 index pattern을 만들 수 있는데 거기에 이제 

 

오른쪽 부분에 fluentd-20220517로 나와 있는 것을 볼 수 있다. 

 

그러면 pattern을 생성할때의 name은 fluentd-*로 하면된다.

 

이제 왼쪽 상단의 삼선을 눌러서 Analytics에서 Dashboard로 가서 view를 생성하면

 

나온 것을 확인 할 수 있다. 

 

 

 

아직 search하는 법이나 기타 설정들은 더 공부해봐야 알 것같다. 지금은 docker 에 EFK 설치 및 적용을 하는 것만 적어둔다.

728x90

'검색엔진 > Elasticsearch' 카테고리의 다른 글

Elasticsearch APM 적용기..  (0) 2022.08.10
Docker ELK Stack 설치 오류  (0) 2022.02.21