EFK Stack 구축 using Docker compose

Elasticsearch + Fluentd + Kibana 조합을 EFK Stack이라 부른다.

참고로 Elasticsearch + logstash + Kibana 조합은 ELK Stack 이다.

Fluentd : 오픈소스 log collector
Elasticsearch : Lucene 기반 분산 검색 엔진이며 JSON 형태로 문서를 저장한다. (schema free)
Kibana : 데이터 시각화를 위한 오픈소스
cs

간편하게 설치하기 위해서 Docker를 이용하였다.

해당 구축 방식은 실무에 적용하기에 다소 부족하니 테스트 용도로만 사용해야 한다.

난 Spring Data Elasticsearch 를 테스트 하기 위해 구축했다.



1.

먼저 Docker와 Docker compose를 설치한다.

설치 방법은 예전에 포스팅한 글이 있어 링크로 대체한다.

http://lng1982.tistory.com/268



2.

docker-compose.yml 작성한다.

apache webserver, fluentd, elasticsearch, kibana 4개의 Docker 컨테이너 설정이 포함된다.


여기서 중요한 것은 elasticsearch 메모리 설정이다.

로컬 서버의 메모리 자원이 넉넉하지 않아 256m 로 설정 후 구동했는데 아래와 같은 오류 메세지가 출력되었다.

kibana_elasticsearch_1 exited with code 137
cs

137 코드가 무엇을 의미하는지 찾아보니 Out of memory 에러가 발생한 케이스였다.

그래서 1024로 설정했는데 동일한 문제가 발생하여 1.5G 정도 할당하였다.


또한 networks 설정도 중요하다.

기본적으로 Docker 컨테이너들 간에는 서로 통신을 할 수 없다.

이를 위해서 하나의 네트워크로 묶어주는 설정이 필요하다.

난 이 부분 설정을 빠트려서 Unable to connect to Elasticsearch at http://elasticsearch:9200 오류가 발생했었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
version: '2'
services:
  web:
    image: httpd:2.4
    mem_limit: 256m
    networks:
      - default
      - internal
    ports:
      - "80:80"
    links:
      - fluentd
    logging:
      driver: "fluentd"
      options:
        fluentd-address: localhost:24224
        tag: httpd.access
 
  fluentd:
    build: ./fluentd
    mem_limit: 128m
    networks:
      - default
      - internal
    volumes:
      - ./fluentd/conf:/fluentd/etc
    links:
      - "elasticsearch"
    ports:
      - "24224:24224"
      - "24224:24224/udp"
 
  elasticsearch:
    image: elasticsearch:5.5
    mem_limit: 1536m
    networks:
      - default
      - internal
    expose:
      - 9200
    ports:
      - "9200:9200"
      - "9300:9300"
 
  kibana:
    image: kibana:5.5
    mem_limit: 128m
    networks:
      - default
      - internal
    links:
      - "elasticsearch"
    ports:
      - "5601:5601"
 
networks:
  internal:
    driver: bridge
cs



3.

fluentd Docker 파일 준비

docker-compose.yml 파일이 존재하는 디렉토리에 fluentd/Dockerfile을 생성한다.

Dockerfile에는 다음의 정보가 추가된다.

FROM fluent/fluentd:v0.12
RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-rdoc", "--no-ri", "--version", "1.9.2"]
cs



4.

fluentd 설정 준비

docker-compose.yml 파일이 존재하는 디렉토리에 fluentd/conf/fluent.conf 파일을 생성한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>
 
<match *.**>
  @type copy
  <store>
    @type elasticsearch
    host elasticsearch
    port 9200
    logstash_format true
    logstash_prefix fluentd
    logstash_dateformat %Y%m%d
    include_tag_key true
    type_name access_log
    tag_key @log_name
    flush_interval 1s
  </store>
  <store>
    @type stdout
  </store>
</match>
cs



5.

Docker 구동

docker-compose.yml 파일이 존재하는 위치로 이동 후 다음의 명령어 실행

# docker-compose up &
cs

구동이 완료된 후 # docker ps 명령어를 통해 총 4개의 컨테이너가 동작됨을 알 수 있다.



6.

kibana 대쉬보드 접속

http://localhost:5601/ 로 이동하면 configure an index pattern 화면이 보인다.

index name or pattern 에 fluentd-* 를 입력한 후 "Create" 버튼을 누른다.

실제 로그가 제대로 수집되고 시각화 되는지를 확인하기 위해서 아파치 웹 서버의 루트 페이지에 접속해 보자.

http://localhost 페이지에 여러번 요청을 보낸 후 kibana 대쉬보드의 좌측 Discover 메뉴를 클릭하자.

데이터가 안 나오면 Time Range 설정이 과거로 되어 있기 때문일 수 있다.

오른쪽 상단에 있는 시계 버튼을 클릭해서 현재 날짜로 설정 후 다시 확인해 보면 된다.



여기까지가 Docker compose를 이용한 설치 방법이다.

Docker가 없었다면 4개의 오픈 소스를 모두 설치하고 셋팅하는 수고로움이 필요했을 것이다.



[참고]

https://docs.fluentd.org/v0.12/articles/docker-logging-efk-compose

https://bobcares.com/blog/error-137-docker/

https://docs.docker.com/engine/userguide/networking/

'서버' 카테고리의 다른 글

[Elasticsearch] 클러스터 구성  (2) 2017.11.30
[Elasticsearch] 용어 정리  (0) 2017.11.29
Apache2 설치 (Ubuntu 16.04)  (0) 2017.09.15
[ElasticSearch] 윈도우 설치 및 기본 동작 이해  (4) 2017.08.31
Google App Engine 환경에 Spring Boot 배포하기  (0) 2017.08.09
kubernetes 정리  (2) 2017.01.12
Kubernetes 설치  (6) 2017.01.12
Docker 정리  (2) 2017.01.04