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 설치 및 적용을 하는 것만 적어둔다.
'검색엔진 > Elasticsearch' 카테고리의 다른 글
Elasticsearch APM 적용기.. (0) | 2022.08.10 |
---|---|
Docker ELK Stack 설치 오류 (0) | 2022.02.21 |
Comment