기타/인프라 구축과정

[Infra] 8. Main 서버 FileBeats - HelloWorld Project

배발자 2023. 6. 1.
반응형

FileBeats와 관련된 메인 서버의 인프라 구축 내용을 정리하려고 한다. 

 

back, notify, story 애플리케이션 서버가 존재하고 각각은 Blue-Green 무중단 배포로 만들어지는 컨테이너가 존재한다. 이때 생성되어진 각각의 컨테이너에 생성된 로그들을 수집하여 카프카로 로그 데이터를 보내줘야한다.

 

* back은 기본적인 RestAPI를 담당하는 서버이다. 이름을 너무 대충 지었다.

 

 

back/docker-compose.blue.yaml

version: '3.7'
services:
  api:
    image: ${DOCKER_REGISTRY}/${DOCKER_APP_NAME}:${IMAGE_TAG}
    container_name: ${DOCKER_APP_NAME}-blue
    environment:
      - LANG=ko_KR.UTF-8
    ports:
      - '8081:8080'
    volumes:
      - back-logs:/var/log/app
volumes:
  back-logs:

 

back/docker-compose.green.yaml

version: '3.7'
services:
  api:
    image: ${DOCKER_REGISTRY}/${DOCKER_APP_NAME}:${IMAGE_TAG}
    container_name: ${DOCKER_APP_NAME}-green
    environment:
      - LANG=ko_KR.UTF-8
    ports:
      - '8082:8080'
    volumes:
      - back-logs:/var/log/app
volumes:
  back-logs:

 

먼저 back 컨테이너의 Blue-Green 배포전략을 활용한 docker-compose yml을 보면 blue와 green 모두 back-logs라는 이름으로 볼륨을 생성하고, 이 볼륨을 컨테이너의 /var/log/app 디렉토리에 마운트 한다.

해당 디렉토리 경로로 마운트를 하는 이유는 서버 어플리케이션의 각각의 yml 파일에 다음과 같이 설정을 해놨다.

 

logging:
  level:
    root: INFO
  file:
    name: /var/log/app/app.log

 

위와 같이 설정을 하면 해당 경로로 서버 어플리케이션에서 출력되는 로그들이 기록되어있다. 해당 기록내용들을 볼륨 설정을 통해 외부에서 접근이 가능하도록 하였다.

INFO 로깅 레벨에는 기본적으로 ERROR 로그 메세지도 포함되는데, 서비스를 수행하는 사용자들이 많을수록 로그들은 수도없이 많이 쌓이기 때문에 로깅 레벨 DEBUG와 같이 상세한 정보들은 너무 많은 로그들이 축적될 것이라고 판단하였다. 하여, INFO, ERROR 로그 정보들만 출력하기로 하였다.

 

 

도커 볼륨 목록 확인하기

docker volume ls

 

local     notify-zero-downtime-blue_notify-logs
local     notify-zero-downtime-green_notify-logs
local     story-zero-downtime-blue_story-logs
local     story-zero-downtime-green_story-logs
local     back-zero-downtime-blue_back-logs
local     back-zero-downtime-green_back-logs

 

어플리케이션 서버 3개가 볼륨 설정이 되었다면 위와 같이 6개의 볼륨 목록이 생성되어야 한다.

 

 

home/ubuntu/elk/docker-compose.yml

version: '3'
services:
  filebeat1:
    image: docker.elastic.co/beats/filebeat:7.10.1
    container_name: filebeat1
    user: root
    volumes:
      - ./filebeat.yml:/usr/share/filebeat/filebeat.yml
      - back-zero-downtime-blue_back-logs:/usr/share/filebeat/demo_logs/back-blue
      - back-zero-downtime-green_back-logs:/usr/share/filebeat/demo_logs/back-green
    networks:
      - elk_network
  filebeat2:
    image: docker.elastic.co/beats/filebeat:7.10.1
    container_name: filebeat2
    user: root
    volumes:
      - ./filebeat.yml:/usr/share/filebeat/filebeat.yml
      - notify-zero-downtime-blue_notify-logs:/usr/share/filebeat/demo_logs/notify-blue
      - notify-zero-downtime-green_notify-logs:/usr/share/filebeat/demo_logs/notify-green
    networks:
      - elk_network

  filebeat3:
    image: docker.elastic.co/beats/filebeat:7.10.1
    container_name: filebeat3
    user: root
    volumes:
      - ./filebeat.yml:/usr/share/filebeat/filebeat.yml
      - story-zero-downtime-blue_story-logs:/usr/share/filebeat/demo_logs/story-blue
      - story-zero-downtime-green_story-logs:/usr/share/filebeat/demo_logs/story-green
    networks:
      - elk_network
volumes:
  back-zero-downtime-green_back-logs:
    external: true
  back-zero-downtime-blue_back-logs:
    external: true
  notify-zero-downtime-green_notify-logs:
    external: true
  notify-zero-downtime-blue_notify-logs:
    external: true
  story-zero-downtime-green_story-logs:
    external: true
  story-zero-downtime-blue_story-logs:
    external: true

networks:
  elk_network:
    driver: bridge

 

해당 Docker Compose 파일은 3개의 서비스를 정의하고 있다

  • 각 서비스는 **docker.elastic.co/beats/filebeat:7.10.1**라는 이미지를 기반으로 하며, container_name 지시자를 통해 각 컨테이너에 filebeat1, filebeat2, filebeat3라는 이름을 부여한다.
  • 각 서비스는 여러 볼륨을 마운트한다. 모든 서비스는 ./filebeat.yml 파일을 컨테이너 내의 /usr/share/filebeat/filebeat.yml 위치에 마운트한다. 이외에도, 서비스마다 고유한 로그 파일들을 각기 다른 위치에 마운트한다.
  • 각 서비스는 **elk_network**라는 네트워크에 연결한다.
  • 볼륨 섹션에서는 각 로그 파일 볼륨이 외부 볼륨임을 선언하여 Docker는 해당 볼륨들이 이미 존재함을 가정하고, 필요한 경우 해당 볼륨들을 사용하게 된다. 
  • 마지막으로, **elk_network**라는 네트워크를 만들고, 이 네트워크의 드라이버를 'bridge'로 설정한다. 이는 Docker 컨테이너들이 서로 통신할 수 있도록 하는 기본 네트워크 타입이다.

 

home/ubuntu/elk/filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/share/filebeat/demo_logs/back-blue/*.log
    - /usr/share/filebeat/demo_logs/back-green/*.log
    - /usr/share/filebeat/demo_logs/notify-blue/*.log
    - /usr/share/filebeat/demo_logs/notify-green/*.log
    - /usr/share/filebeat/demo_logs/story-blue/*.log
    - /usr/share/filebeat/demo_logs/story-green/*.log

  include_lines: ['.*INFO.*', '.*ERROR.*']

output.kafka:
  enabled: true
  hosts: ["서버 도메인 주소:29092"]
  topic: 'logs'
  version: '2'

 

이 설정은 Filebeat의 동작을 지시하는 filebeat.yml 파일이다. 이 파일은 log 수집, 필터링, 그리고 전송에 대한 설정을 담고 있다.

 

  • filebeat.inputs: 로그 파일들의 위치를 지정한다. **type**은 수집할 로그의 종류를 나타내며, 여기서는 'log'를 사용하여 일반 로그 파일을 수집하도록 설정. **paths**는 수집할 로그 파일들의 경로를 나타낸다.
  • include_lines: 이 설정은 로그 메시지를 필터링하는 데 사용되며, '.*INFO.*'' .*ERROR.*' 정규 표현식을 사용하여 'INFO'나 'ERROR'를 포함하는 로그 메시지만 수집한다.
  • output.kafka: 이 설정은 수집된 로그를 어디로 전송할지 결정. **hosts**는 Kafka 서버의 주소를 나타내며, **topic**은 메시지를 전송할 Kafka 토픽을 나타낸다. **version**은 사용하는 Kafka의 버전을 나타낸다. 

즉, 이 설정은 특정 경로의 로그 파일들에서 'INFO'나 'ERROR' 수준의 로그 메시지를 수집하여, Kafka의 'logs' 토픽으로 전송하도록 Filebeat를 구성한다.

반응형

댓글