Docker log를 fluentd로 수집한 후 ElasticSearch에 적재해 Kibana를 활용하기 위한 환경구축 과정
사용 서버
OS: Ubuntu 20.04
1. EFK를 운용할 새로운 서버 - 서버 1대에 ELK를 전부 설치해 관리할 계획
2. Dokcer로 운영되고 있는 API서버
서버 아키텍처
EFK(Elasticsearch, Fluentd, Kibana) 부분 서버 1번
Docker Containers 부분 서버 2번
먼저 로그를 쌓을 Docker container는 이미 활용되고 있다고 가정하고 EFK 를 설치할 서버에 Docker를 설치한다.
- EFK를 운용할 새로운 서버
$ sudo apt-get update
$ sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
https://docs.docker.com/engine/install/ubuntu/
해당 글 참고
Docker가 설치가 잘 되었는지 확인하는 명령어
sudo docker run hello-world
설치가 잘 되었다면 자신이 관리하기 편한 폴더에 파일을 생성한다.
vi docker-compose.yml
해당 파일에 밑의 내용을 복사한 후 저장
version: "3"
services:
fluentd:
build: ./fluentd
volumes:
- ./fluentd/conf:/fluentd/etc
links:
- "elasticsearch"
ports:
- "24224:24224"
- "24224:24224/udp"
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.13.1
container_name: elasticsearch
environment:
- "discovery.type=single-node"
expose:
- "9200"
ports:
- "9200:9200"
kibana:
image: docker.elastic.co/kibana/kibana:7.13.1
links:
- "elasticsearch"
ports:
- "5601:5601"
당연히 docker-compose.yml 파일에 적혀있는 포트들에는 포트포워딩을 해줘야한다.
해당 위치에서 폴더를 생성한다.
mkdir fluentd
cd fluentd
mkdir conf
fluentd 도커 이미지를 받아올 파일을 생성하고 저장하자
vi Dockerfile
FROM fluent/fluentd:v1.12.0-debian-1.0
USER root
RUN gem uninstall -I elasticsearch && gem install elasticsearch -v 7.17.0
RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-document", "--version", "5.0.3"]
USER fluent
아까 만들어둔 conf 파일 안에 fluent.conf 파일을 생성해 설정을 해준다.
vi conf/fluent.conf
<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>
그 후 docker-compose.yml 파일이 있는 폴더로 이동해서
docker-compose up --detach
후 세개 다 잘 켜졌는지 확인하는 명령어로 확인해준다.
docker ps
해당 명령어를 입력했을 때 세개의 컨테이너가 모두 보여야한다.
그리고 본인이 원래 운영하던 docker 컨테이너가 있는 서버의 docker-compose.yml파일을 수정해줘야한다.
우리 서비스같은 경우에는 해당 코드를 yml 파일 안의 Dokcer로 운영되고 있는 API서버 이미지 밑에 추가해줬다.
logging:
driver: "fluentd"
options:
fluentd-address: '방금 EFK 설정한 서버 ip':24224
tag: logging
docker-compose.yml 파일을 수정했으면 docker를 restart 시켜줘야해서 해당 명령어를 입력해준다.
docker-compose up --build -d
그러면 이제 설정이 완료되었다.
docker의 log가 쌓이는지 확인하려면
해당 주소로 접속하면 ui가 나온다.
http://EFK를 운용할 새로운 서버ip:5601
홈 화면에서 동그라미쳐져있는 부분을 누르면
해당 화면이 나오는데
맨 밑으로 내려서 Stack Management -> Kibana(Index Patterns) -> Create index pattern 클릭
index-name 이라고 되어있는 부분에 이글을 따라왔다면
fluentd-*
라고 입력하고 next step 후 생성해준다.
그리고 메뉴에서 Analytics -> Discover에 들어가면 로그가 쌓인 화면을 볼 수 있다.
다음 글은 이제 로그가 쌓이는걸 확인했으니, 우리 서비스에서 필요한 로그만 필터링해서 쌓고, 쿼리까지 구현해봐야겠다
'Server' 카테고리의 다른 글
WebRTC란? (1) | 2022.08.09 |
---|---|
웹서버, WAS 선정기준 (0) | 2022.08.09 |
시스템 로그 수집 툴 - Fluented vs LogStash (0) | 2022.08.03 |
클라우드 서비스 - AWS 를 선택한 이유 (0) | 2022.07.18 |
AWS EC2- CloudWatch, Slack 연동 CPU, Memory 사용량 모니터링 (0) | 2022.06.20 |
댓글