본문 바로가기
프로그래밍/devops

[ELK+R스택 구축하기] docker로 ELK 구성하여 Spring Boot 로그 쌓기 (2)

by 뜨끔쓰 2022. 7. 11.
728x90
728x90

안녕하세요.

 

Docker로 ELK 구성하여 Spring Boot 로그 쌓기 두번째 글입니다.

 

이글에서는 Docker-Compose를 이용하여 ELKR을 구동시켜보도록 하겠습니다!

 

자세한 설명보다는 코드로 보는게 훨씬 도움이 많이 될 것 같아 촤르르륵 적어 보도록 할께요.

 

일단 Docker랑 Docker-Compose는 설치했으니 컨테이너 설정파일을 만들어봅시다~

 

제가 사용한 컨테이너는 이거에요.

 

https://github.com/deviantony/docker-elk

 

GitHub - deviantony/docker-elk: The Elastic stack (ELK) powered by Docker and Compose.

The Elastic stack (ELK) powered by Docker and Compose. - GitHub - deviantony/docker-elk: The Elastic stack (ELK) powered by Docker and Compose.

github.com

 

서버에서 pull 받아서 사용하시거나 아니면 다운로드 받아서 VS CODE나 텍스트 에디터로 설정파일들을 수정해봅시다.

 

저는 우분투 UI 환경을 이용하여 직접 다운로드 받아서 docker-test/docker-elk 폴더를 생성하여 다운 받았습니다.

아니면 아래처럼 직접 git clone으로 받으셔도 됩니다!

 

git clone https://github.com/deviantony/docker-elk.git

 

폴더 구조를 보시면 elasticsearch, kibana, logstash가 보일꺼에요 순서가 EKL(??) 되버렸지만 어쨋든 ELK입니다!

 

이제 저희가 직접 적으로 사용할 파일은 docker-compose.yml 이 파일이 중요합니다. 텍스트 에디터로 열어봅시다.

 

파일을 열어보시면 대충 이렇게 길게 블라블라 작성되어 있을꺼에요. 여기서 수정해야할 부분들은 거의 없습니다! 하지만 저희는 Redis를 사용할 것이기 때문에 Redis를 service에 추가해주도록합시다.

 

version: '3.7'

services:
  # 굴러다니는 이미지중 하나를 추가하였습니다. networks도 동일하게 설정!
  redis:
    image: redis:alpine
    networks:
      - elk
    ports:
      - "6379:6379"


  # The 'setup' service runs a one-off script which initializes the
  # 'logstash_internal' and 'kibana_system' users inside Elasticsearch with the
  # values of the passwords defined in the '.env' file.
  #
  # This task is only performed during the *initial* startup of the stack. On all
  # subsequent runs, the service simply returns immediately, without performing
  # any modification to existing users.
  setup:
    build:
      context: setup/
      args:
        ELASTIC_VERSION: ${ELASTIC_VERSION}
    init: true
    volumes:
      - setup:/state:Z
    environment:
      ELASTIC_PASSWORD: ${ELASTIC_PASSWORD:-}
      LOGSTASH_INTERNAL_PASSWORD: ${LOGSTASH_INTERNAL_PASSWORD:-}
      KIBANA_SYSTEM_PASSWORD: ${KIBANA_SYSTEM_PASSWORD:-}
    networks:
      - elk
    depends_on:
      - elasticsearch

  elasticsearch:
    build:
      context: elasticsearch/
      args:
        ELASTIC_VERSION: ${ELASTIC_VERSION}
    volumes:
      - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro,z
      - elasticsearch:/usr/share/elasticsearch/data:z
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      ES_JAVA_OPTS: -Xms512m -Xmx512m
      # Bootstrap password.
      # Used to initialize the keystore during the initial startup of
      # Elasticsearch. Ignored on subsequent runs.
      ELASTIC_PASSWORD: ${ELASTIC_PASSWORD:-}
      # Use single node discovery in order to disable production mode and avoid bootstrap checks.
      # see: https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
      discovery.type: single-node
    networks:
      - elk

  logstash:
    build:
      context: logstash/
      args:
        ELASTIC_VERSION: ${ELASTIC_VERSION}
    volumes:
      - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro,Z
      - ./logstash/pipeline:/usr/share/logstash/pipeline:ro,Z
    ports:
      - "5044:5044"
      - "5000:5000/tcp"
      - "5000:5000/udp"
      - "9600:9600"
    environment:
      LS_JAVA_OPTS: -Xms256m -Xmx256m
      LOGSTASH_INTERNAL_PASSWORD: ${LOGSTASH_INTERNAL_PASSWORD:-}
    networks:
      - elk
    depends_on:
      - elasticsearch

  kibana:
    build:
      context: kibana/
      args:
        ELASTIC_VERSION: ${ELASTIC_VERSION}
    volumes:
      - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml:ro,Z
    ports:
      - "5601:5601"
    environment:
      KIBANA_SYSTEM_PASSWORD: ${KIBANA_SYSTEM_PASSWORD:-}
    networks:
      - elk
    depends_on:
      - elasticsearch

networks:
  elk:
    driver: bridge

volumes:
  setup:
  elasticsearch:

그 외의 부분은 입맛대로 수정하면 될 것 같습니다! 저기 ${} 이런식으로 변수 설정이 되어있는데요 이건 폴더의 .env 파일을 열어보면 값을 확인하실 수 있습니다.

 

.env 파일

ELASTIC_VERSION=8.3.2

## Passwords for stack users
#

# User 'elastic' (built-in)
#
# Superuser role, full access to cluster management and data indices.
# https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-users.html
ELASTIC_PASSWORD='changeme'

# User 'logstash_internal' (custom)
#
# The user Logstash uses to connect and send data to Elasticsearch.
# https://www.elastic.co/guide/en/logstash/current/ls-security.html
LOGSTASH_INTERNAL_PASSWORD='changeme'

# User 'kibana_system' (built-in)
#
# The user Kibana uses to connect and communicate with Elasticsearch.
# https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-users.html
KIBANA_SYSTEM_PASSWORD='changeme'

열어보시면 이렇게 기본 password는 changeme로 설정되어 있습니다. 일단 이부분도 그대로 진행하고 나중에 변경하면 됩니다.

 

그리고 이제 저희는 basic 버전을 사용할 것이기 때문에 elasticsearch/conf 폴더의 elasticsearch.yml 파일을 열어 수정합시다. (default trial로 되어 있을꺼에요!)

---
## 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/security-settings.html
#
xpack.license.self_generated.type: basic
xpack.security.enabled: true

 

Redis를 이용하여 Log를 쌓을 것이기 때문에 logstash의 pipeline도 수정해줘야합니다. 

logstash/pipeline/logstash.conf 파일을 열어 아래처럼 수정합시다.

input {
	redis {
    		host => "redis"
	    	port => 6379
    		codec => "json"
    		data_type => "list"
    		key => "logstash"
  	}
}


## Add your filters / logstash plugins configuration here

output {
	elasticsearch {
		hosts => "elasticsearch:9200"
		index => "%{type}-%{+YYYY.MM.dd}"
		user => "logstash_internal"
		password => "${LOGSTASH_INTERNAL_PASSWORD}"
	}
}

 

 

그럼 이제 콘솔에서 docker-compose.yml이 있는 경로에서 아래 명령어를 입력해줍니다.

 

sudo docker-compose build && docker-compose up -d

그럼 아래처럼 좌르르륵 뜨면서 ELKR이 실행되는것을 확인 하실 수 있습니다.

setup은 초기 셋팅을 해주는 것 같습니다.

 

그다음 시간이 조금 지난뒤에 http://호스트IP:5601 로 접속하면 아래처럼 로그인 화면이 뜬다면 성공입니다!

Kibana UI 접속화면

여기서 Username과 Password에 각각 elastic / changeme 를 입력하여 로그인 해봅시다!

그럼 이제 Welcome하고 저희를 반겨줄겁니다.

 

Explore on my own을 클릭해서 들어가보도록 합시다! 이제 redis에 쌓이는 로그를 logstash가 수집하여 elastic에 보내줘야 하는데 현재 security가 적용되어 있기 때문에 권한을 주어야합니다!

 

아래처럼 왼쪽 메뉴에서 Management => Stack Management를 클릭합시다.

 

그다음 Security => Roles를 클릭하면 아래처럼 logstash_internal 계정이 보일꺼에요 클릭!

 

클릭하면 해당 Roles의 부여된 권한 정보 및 Kibana UI에 메뉴 접근정보등을 설정 하실 수 있는 페이지가 나옵니다.

여기서 중요한 부분은 Indices부분인데요 나중에 Springboot에서 설정한 색인명을 추가해주면 log가 쌓이게 됩니다.

지금은 일단 저희는 나중에 appapi-local, appapi-prod, appapi-test 이런식으로 쌓을 예정이기 떄문에 appapi-*를 추가해줍시다.

 

 

이렇게 기본적인 ELKR 설치 및 실행은 끝이 났습니다. 다음글에서는 이제 SpringBoot에서 logback과 연동하여 log를 ELK스택으로 보내는 것을 해보도록합시다.

 

감사합니다.

 

 

728x90
반응형

댓글