관리 메뉴

개발 여행자, 현

[Docker] Docker Compose ELK 구축 본문

백엔드

[Docker] Docker Compose ELK 구축

예스현 2023. 2. 28. 16:15
Docker Compose ELK 구축한 과정을 기록한다.

 

1. Docker-ELK Pull 받기

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

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

Kafka와 ELK를 각각 Docker compose로 구성하면 Kafka와 LogStash 연동에 문제가 있을 수 있다.

Docker network는 default bridge이며, 기본적으로 같은 네트워크로 묶인 컨테이너끼리만 통신이 가능하기 때문이다.

docker network connect, 공용 외부 네트워크 생성으로 해결하는 방법도 있었지만 한번에 compose로 구성하는 방향으로 구현하고자 한다.

 Docker-compose.yml 파일
version: '3.2'

services:
  elasticsearch:
    build:
      context: elasticsearch/
      args:
        ELK_VERSION: ${ELASTIC_VERSION}
    volumes:
      - type: bind
        source: ./elasticsearch/config/elasticsearch.yml
        target: /usr/share/elasticsearch/config/elasticsearch.yml
        read_only: true
      - type: volume
        source: elasticsearch
        target: /usr/share/elasticsearch/data
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      ES_JAVA_OPTS: "-Xmx256m -Xms256m"
      # 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](https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html)
      discovery.type: single-node
    networks:
      - kafka-elk

  logstash:
    build:
      context: logstash/
      args:
        ELK_VERSION: ${ELASTIC_VERSION}
    volumes:
      - type: bind
        source: ./logstash/config/logstash.yml
        target: /usr/share/logstash/config/logstash.yml
        read_only: true
      - type: bind
        source: ./logstash/pipeline
        target: /usr/share/logstash/pipeline
        read_only: true
    ports:
      - "5044:5044"
      - "5000:5000/tcp"
      - "5000:5000/udp"
      - "9600:9600"
    environment:
      LS_JAVA_OPTS: "-Xmx256m -Xms256m"
    networks:
      - kafka-elk
    depends_on:
      - elasticsearch

  kibana:
    build:
      context: kibana/
      args:
        ELK_VERSION: ${ELASTIC_VERSION}
    volumes:
      - type: bind
        source: ./kibana/config/kibana.yml
        target: /usr/share/kibana/config/kibana.yml
        read_only: true
    ports:
      - "5601:5601"
    networks:
      - kafka-elk
    depends_on:
      - elasticsearch

  zookeeper:
    container_name: zookeeper
    image: confluentinc/cp-zookeeper:latest
    ports:
      - "9900:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    networks:
      - kafka-elk

  kafka:
    container_name: kafka
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_CREATE_TOPICS: "test-topic:1:1"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - kafka-elk

networks:
  kafka-elk:
    driver: bridge

volumes:
  elasticsearch:

Kafka environment 설정 부분에서

KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092이처럼 설정하여 

컨테이너 내부에선 kafka:29092 외부에선 localhost:9092접속이 가능하도록 설정한다.

 

2. docker compose 실행

 

docker compose를 실행하기 위해 아래 명령어를 입력하였다.

docker compose up -d

하지만 오류가 발생했다.

"failed to solve with frontend dockerfile. v0: failed to create LLB definition: unexpected status code [mamifests 3.8]: 400 Bad Request

아래와 같이 Docker Desktop을 리셋하면 해결이 되는 문제였다.

다시 명령어를 입력하면 성공이다!

접속포트는 아래와 같다.

Elasticsearch : localhost:9200
Logstash : localhost:5000/9600
Kibana : localhost:5601
Kafka : localhost:9092
 

3. 도커 네트워크 확인

전체 도커 네트워크 목록 확인 하는 명렁어는 아래와같다.

docker network ls

특정 네트워크 확인하고자 한다면 다음과 같이 입력한다. (docker-elk_kafka-elk)

docker network inspect {network name}

 

해당 네트워크에 모든 컨테이너가 모두 포함되어 있는 것을 확인할 수 있다.

 

4. logstash.config 파일 작성

input으로 kafka의 test-topic에서 메시지를 읽어오고, output으로 elasticsearch로 보내면서 index를 설정한다.
# logstash.conf

input {
  kafka {
    bootstrap_servers => "kafka:29092"
    topics => ["test0130"]
    codec => plain
  }
}

filter {
  json {
    source => "message"
  }}

output {
   elasticsearch {
      hosts => "elasticsearch:9200"
      index => "0214test"
      user => "elastic"
      password => "HkWUvu4z9ntU07yqXzFH"
   }}

Kafka가 실행되고 있는 9092 포트에 데이터가 적재되는 것이 인식되면 9200 포트에서 실행되고 있는 Elasticsearch에 데이터를 적재하는 것이다.

 

시행착오

1) Elastic search 노드가 kill 되는 문제가 발생

: node를 최신버전으로 다이렉트로 업그레이드 할 수 없다는 에러가 발생한 것을 확인할 수 있었고 7.17.0 버전으로 업데이트 후 8.6.0 업데이트를 한 번 더 진행해 해결했다.


Reference

1. https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-users.html

 

Built-in users | Elasticsearch Guide [8.7] | Elastic

Anyone who can log in as the elastic user has direct read-only access to restricted indices, such as .security. This user also has the ability to manage security and create roles with unlimited privileges.

www.elastic.co

1. [ELK+R스택 구축하기] https://sundrystore.tistory.com/40
3. [X-Pack Security] 활설화 시 오류 https://logical-code.tistory.com/215
4. [ELK+Kafka 로그시스템] https://mygumi.tistory.com/400

5. [Docker Kafka + ELK 연동] https://tries1.github.io/spring/2021/01/17/kafka_elk.html

'백엔드' 카테고리의 다른 글

[ELK] ELK 설치  (0) 2023.02.28
[Kafka, Springboot] 스프링부트 카프카 연동하기  (0) 2023.02.28
[Kafka] 카프카란?  (0) 2023.02.28