Elastic Stack 및 Docker Compose 시작하기: 제1부

blog-thumb-charts-laptop.png

Elastic Stack이 수년에 걸쳐 성장하고 기능 세트가 증가함에 따라 로컬에서 개념 증명(POC)을 시작하거나 시도하는 것이 복잡해졌습니다. Elastic Cloud는 여전히 Elastic을 시작하는 가장 빠르고 쉬운 방법이지만, 로컬 개발 및 테스트에 대한 수요는 여전히 대단히 많습니다. 개발자로서 Elastic은 적은 노력으로 결과를 얻을 수 있는 빠른 설정과 빠른 개발에 매력을 느낍니다. Docker만큼 빠른 설정과 POC를 자랑하는 것은 없습니다. Elastic은 사용자가 즐겁게 로컬을 활용할 수 있도록 하기 위해 전체 Elastic Stack 구축을 시작하는 데 집중할 것입니다. 

2부로 구성된 이 시리즈 중 1부에서는 즉시 개발을 시작할 수 있는 Elasticsearch, Logstash, Kibana 및 Beats(ELK-B)로 구성된 표준 Elastic Stack의 구성 요소를 구성하는 방법을 살펴보겠습니다.

2부에서는 기본 구성을 강화하고 APM, 에이전트, Fleet, 통합, Enterprise Search 등 진화하는 스택을 강화하는 다양한 기능을 추가하겠습니다. 또한 개발 및 POC 목적을 위해 새로운 로컬 환경에서 이러한 기능을 계측하는 방법도 살펴볼 것입니다.

이전에 이런 작업을 해보신 적이 있는 분들은 TL;DR에 오신 것을 환영합니다. 리포지토리로 가서 파일을 가져오세요.

전제 조건으로, Docker Desktop 또는 Docker EngineDocker-Compose를 설치하고 구성해야 합니다. 이 튜토리얼에서는 Docker Desktop을 사용합니다.

이 Docker 컨테이너에서는 주로 Elasticsearch와 Kibana를 중점적으로 다루게 됩니다. 그러나 몇 가지 수집 기본 사항을 위해 Filebeat 및 Logstash뿐만 아니라 일부 클러스터 인사이트를 제공하기 위해 Metricbeat를 활용할 것입니다.

파일 구조

먼저 파일 구조의 개요를 정의하는 것부터 시작하겠습니다.

├── .env

├── docker-compose.yml

├── filebeat.yml

├── logstash.conf

└── metricbeat.yml

처음에는 간단하게 설명하겠습니다. Elasticsearch와 Kibana는 docker-compose 파일에서 시작할 수 있지만 Filebeat, Metricbeat 및 Logstash는 모두 yml 파일에서 추가 구성이 필요합니다. 

환경 파일

다음으로 .env 파일을 통해 docker-compose에 전달할 변수를 정의하겠습니다. 이러한 매개변수는 포트, 메모리 제한, 구성 요소 버전 등을 설정하는 데 도움이 됩니다.

.env

# Project namespace (defaults to the current folder name if not set)
#COMPOSE_PROJECT_NAME=myproject


# Password for the 'elastic' user (at least 6 characters)
ELASTIC_PASSWORD=changeme


# Password for the 'kibana_system' user (at least 6 characters)
KIBANA_PASSWORD=changeme


# Version of Elastic products
STACK_VERSION=8.7.1


# Set the cluster name
CLUSTER_NAME=docker-cluster


# Set to 'basic' or 'trial' to automatically start the 30-day trial
LICENSE=basic
#LICENSE=trial


# Port to expose Elasticsearch HTTP API to the host
ES_PORT=9200


# Port to expose Kibana to the host
KIBANA_PORT=5601


# Increase or decrease based on the available host memory (in bytes)
ES_MEM_LIMIT=1073741824
KB_MEM_LIMIT=1073741824
LS_MEM_LIMIT=1073741824


# SAMPLE Predefined Key only to be used in POC environments
ENCRYPTION_KEY=c34d38b3a14956121ff2170e5030b471551370178f43e5626eec58b04a30fae2

모든 비밀번호와 샘플 키에 대한 자리 표시자 단어 'changeme'는 데모 목적으로만 사용됩니다. 로컬 POC 요구 사항에 대해서도 변경해야 합니다. 

여기에서 볼 수 있듯이 Elasticsearch와 Kibana에 각각 포트 9200과 5601을 지정합니다. 추가 기능을 테스트하기 위해 여기에서 '기본' 라이선스 유형을 '체험판' 라이선스 유형으로 변경할 수도 있습니다.

docker-compose.yml 파일의 각 서비스(컨테이너)에 전달하기 위해 여기에서는 'STACK_VERSION' 환경 변수를 사용합니다. Docker를 사용할 때, :latest 태그 등을 사용하는 대신 버전 번호를 하드 코딩하도록 선택하는 것이 환경에 대해 바람직한 제어를 유지하는 좋은 방법입니다. Elastic Stack 구성 요소의 경우 :latest 태그가 지원되지 않으며 이미지를 가져오려면 버전 번호가 필요합니다.

설정 및 Elasticsearch 노드

시작할 때 자주 직면하게 되는 첫 번째 문제 중 하나는 보안 구성입니다. 8.0부터는 기본적으로 보안이 활성화되어 있습니다. 따라서 인증서를 설정하기 위해 "설정" 노드를 활용하여 인증서 CA가 올바르게 설정되었는지 확인해야 합니다. 보안을 활성화하는 것은 권장되는 방법이며 POC 환경에서도 비활성화해서는 안 됩니다.

docker-compose.yml(‘setup’ 컨테이너)

version: "3.8"


volumes:
 certs:
   driver: local
 esdata01:
   driver: local
 kibanadata:
   driver: local
 metricbeatdata01:
   driver: local
 filebeatdata01:
   driver: local
 logstashdata01:
   driver: local


networks:
 default:
   name: elastic
   external: false


services:
 setup:
   image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
   volumes:
     - certs:/usr/share/elasticsearch/config/certs
   user: "0"
   command: >
     bash -c '
       if [ x${ELASTIC_PASSWORD} == x ]; then
         echo "Set the ELASTIC_PASSWORD environment variable in the .env file";
         exit 1;
       elif [ x${KIBANA_PASSWORD} == x ]; then
         echo "Set the KIBANA_PASSWORD environment variable in the .env file";
         exit 1;
       fi;
       if [ ! -f config/certs/ca.zip ]; then
         echo "Creating CA";
         bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip;
         unzip config/certs/ca.zip -d config/certs;
       fi;
       if [ ! -f config/certs/certs.zip ]; then
         echo "Creating certs";
         echo -ne \
         "instances:\n"\
         "  - name: es01\n"\
         "    dns:\n"\
         "      - es01\n"\
         "      - localhost\n"\
         "    ip:\n"\
         "      - 127.0.0.1\n"\
         "  - name: kibana\n"\
         "    dns:\n"\
         "      - kibana\n"\
         "      - localhost\n"\
         "    ip:\n"\
         "      - 127.0.0.1\n"\
         > config/certs/instances.yml;
         bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key;
         unzip config/certs/certs.zip -d config/certs;
       fi;
       echo "Setting file permissions"
       chown -R root:root config/certs;
       find . -type d -exec chmod 750 \{\} \;;
       find . -type f -exec chmod 640 \{\} \;;
       echo "Waiting for Elasticsearch availability";
       until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done;
       echo "Setting kibana_system password";
       until curl -s -X POST --cacert config/certs/ca/ca.crt -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done;
       echo "All done!";
     '
   healthcheck:
     test: ["CMD-SHELL", "[ -f config/certs/es01/es01.crt ]"]
     interval: 1s
     timeout: 5s
     retries: 120

docker-compose.yml 상단에서 Compose 버전을 설정한 다음, 다양한 컨테이너 전체에서 사용할 볼륨과 기본 네트워킹 구성을 설정합니다.

또한 클러스터 노드를 지정하기 위해 bash 매직을 사용하여 “setup”이라는 라벨이 붙은 컨테이너를 실행하고 있는 것을 볼 수 있습니다. 이를 통해 CA 인증서 및 노드 인증서를 생성하기 위해 yml 형식으로 서버 이름을 전달하여 elasticsearch-certutil을 호출할 수 있습니다. 스택에 Elasticsearch 노드를 두 개 이상 갖고 싶다면 여기에서 인증서 생성을 허용하는 서버 이름을 추가합니다.

참고: 향후 포스팅에서는, 키 저장소를 사용하여 비밀을 유지하는 권장 방법을 채택할 예정이지만 지금은 이를 통해 클러스터를 시작하고 실행할 수 있습니다.

이 설정 컨테이너는 먼저 시작되고 ES01 컨테이너가 온라인 상태가 될 때까지 기다린 다음 환경 변수를 사용하여 클러스터에 원하는 비밀번호를 설정합니다. 또한 다른 모든 컨테이너가 인증서에 액세스할 수 있도록 모든 인증서를 “certs” 볼륨에 저장하고 있습니다.

설정 컨테이너는 ES01 컨테이너에 종속되므로 두 구성을 모두 시작할 수 있도록 다음 구성을 간략하게 살펴보겠습니다.

docker-compose.yml('es01' 컨테이너)

 es01:
   depends_on:
     setup:
       condition: service_healthy
   image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
   labels:
     co.elastic.logs/module: elasticsearch
   volumes:
     - certs:/usr/share/elasticsearch/config/certs
     - esdata01:/usr/share/elasticsearch/data
   ports:
     - ${ES_PORT}:9200
   environment:
     - node.name=es01
     - cluster.name=${CLUSTER_NAME}
     - discovery.type=single-node
     - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
     - bootstrap.memory_lock=true
     - xpack.security.enabled=true
     - xpack.security.http.ssl.enabled=true
     - xpack.security.http.ssl.key=certs/es01/es01.key
     - xpack.security.http.ssl.certificate=certs/es01/es01.crt
     - xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
     - xpack.security.transport.ssl.enabled=true
     - xpack.security.transport.ssl.key=certs/es01/es01.key
     - xpack.security.transport.ssl.certificate=certs/es01/es01.crt
     - xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
     - xpack.security.transport.ssl.verification_mode=certificate
     - xpack.license.self_generated.type=${LICENSE}
   mem_limit: ${ES_MEM_LIMIT}
   ulimits:
     memlock:
       soft: -1
       hard: -1
   healthcheck:
     test:
       [
         "CMD-SHELL",
         "curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
       ]
     interval: 10s
     timeout: 10s
     retries: 120

이것이 우리가 테스트에 사용하는 Elasticsearch의 단일 노드 클러스터입니다.

생성된 CA 인증서와 노드 인증서를 사용하게 됩니다. 

또한 -esdata01:/usr/share/elasticsearch/data를 지정하여 컨테이너 외부 볼륨에 Elasticsearch 데이터를 저장하고 있음을 알 수 있습니다. 이에 대한 두 가지 주요 이유는 성능과 데이터 지속성입니다. 컨테이너 내부에 데이터 디렉터리를 남겨두면 Elasticsearch 노드의 성능이 크게 저하될 뿐만 아니라 docker-compose 파일 내에서 컨테이너 구성을 변경해야 할 때마다 데이터가 손실됩니다.

두 구성이 모두 준비되면 첫 번째 `docker-compose up` 명령을 수행할 수 있습니다.

Docker Compose 팁

Docker Compose를 처음 사용하거나 몇 가지 명령을 기억한 지 오래되었다면, 이 작업에 대해 알아야 할 주요 명령어를 빠르게 검토해 보겠습니다.

이 모든 명령은 docker-compose.yml 파일이 있는 동일한 폴더에 있는 터미널에서 실행하는 것이 좋습니다. 내 예시 폴더:

해당 명령을 살펴보겠습니다.

이제 'docker-compose up'을 실행해 보겠습니다.

이 시점에서 구문이 정확하면 Docker는 모든 이미지를 다운로드하고 docker-compose.yml 파일에 나열된 환경을 구축하기 시작합니다. 이 작업은 인터넷 속도에 따라 몇 분 정도 걸릴 수 있습니다. Docker Desktop 외부에서 이미지를 보려면, 언제든지 공식 Elastic Docker Hub에서 찾아보실 수 있습니다.

잘못된 가상 메모리 구성 문제 해결

Elasticsearch 노드를 처음 시작할 때 많은 사용자가 가상 메모리 구성에서 더 이상 진행하지 못하고 다음과 같은 오류 메시지를 받습니다.

{"@timestamp":"2023-04-14T13:16:22.148Z", "log.level":"ERROR", "message":"node validation exception\n[1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.\nbootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]", "ecs.version": "1.2.0","service.name":"ES_ECS","event.dataset":"elasticsearch.server","process.thread.name":"main","log.logger":"org.elasticsearch.bootstrap.Elasticsearch","elasticsearch.node.name":"es01","elasticsearch.cluster.name":"docker-cluster"}

여기서 핵심 내용은 최대 가상 메모리 영역 vm.max_map_count [65530]이 너무 낮습니다. 최소한 [262144]로 늘리세요입니다.

결국 컨테이너가 호스팅되는 위치에서 sysctl -w vm.max_map_count=262144 명령을 실행해야 합니다.

Mac의 경우, Mac용 Docker에 대한 이 지침을 확인하세요. Docker Desktop에 대한 지침을 따르세요. Linux 사용자의 경우, 이 지침을 참조하세요. Windows 사용자는 Docker Desktop이 있는 경우 다음 지침을 시도해 보세요. 하지만 Docker Desktop과 함께 WSLv2를 사용하는 경우, 여기를 살펴보세요.

완료되면, Docker Desktop을 재부팅하고 docker-compose up 명령을 다시 시도할 수 있습니다.

인증서 및 비밀번호 생성이 완료되면 설정 컨테이너가 의도적으로 종료된다는 점을 기억하세요.

지금까지 잘 진행되었지만, 테스트해 보겠습니다. 

명령을 사용하여 es01-1 컨테이너에서 ca.crt 를 복사할 수 있습니다. 컨테이너 집합의 이름은 docker-compose.yml이 실행되는 폴더를 기반으로 한다는 점을 기억하세요. 예를 들어, 내 디렉터리는 "elasticstack_docker"이므로 위 스크린샷을 기준으로 내 명령은 다음과 같습니다.

docker cp

elasticstack_docker-es01-1:/usr/share/elasticsearch/config/certs/ca/ca.crt /kr/tmp/.

인증서가 다운로드되면 curl 명령을 실행하여 Elasticsearch 노드를 쿼리합니다.

curl --cacert /kr/tmp/ca.crt -u elastic:changeme https://localhost:9200

성공!

localhost:9200을 사용하여 Elasticsearch에 액세스하고 있습니다. 이는 docker-compose.ymlports 섹션을 통해 지정된 포트 덕분입니다. 이 설정은 컨테이너의 포트를 호스트의 포트에 매핑하고 트래픽이 시스템을 통과하여 해당 포트가 지정된 Docker 컨테이너로 전달되도록 허용합니다.

Kibana

Kibana 구성의 경우, 이전의 인증서 출력을 활용합니다. 또한 위의 Elasticsearch 노드가 올바르게 실행되고 있는지 확인할 때까지 이 노드가 시작되지 않도록 지정합니다.

docker-compose.yml('kibana' 컨테이너)

kibana:
   depends_on:
     es01:
       condition: service_healthy
   image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
   labels:
     co.elastic.logs/module: kibana
   volumes:
     - certs:/usr/share/kibana/config/certs
     - kibanadata:/usr/share/kibana/data
   ports:
     - ${KIBANA_PORT}:5601
   environment:
     - SERVERNAME=kibana
     - ELASTICSEARCH_HOSTS=https://es01:9200
     - ELASTICSEARCH_USERNAME=kibana_system
     - ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
     - ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt
     - XPACK_SECURITY_ENCRYPTIONKEY=${ENCRYPTION_KEY}
     - XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY=${ENCRYPTION_KEY}
     - XPACK_REPORTING_ENCRYPTIONKEY=${ENCRYPTION_KEY}
   mem_limit: ${KB_MEM_LIMIT}
   healthcheck:
     test:
       [
         "CMD-SHELL",
         "curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'",
       ]
     interval: 10s
     timeout: 10s
     retries: 120

`environment` 섹션에서 ELASTICSEARCH_HOSTS=https://es01:9200을 지정하고 있음을 확인하세요. 컨테이너를 지정할 수 있습니다. Docker 기본 네트워킹을 활용하고 있으므로 ES01 Elasticsearch 컨테이너의 이름을 여기에 지정합니다. docker-compose.yml 파일 시작 부분에 지정된 “elastic” 네트워크를 사용하는 모든 컨테이너는 다른 컨테이너 이름을 올바르게 확인하고 서로 통신할 수 있습니다.

Kibana를 로드하고 액세스할 수 있는지 살펴보겠습니다.

컨테이너는 녹색입니다. 이제 http://localhost:5601에 접속할 수 있습니다.

지정된 사용자 이름과 비밀번호를 사용하여 빠르게 로그인하면 새로운 Kibana 인스턴스로 바로 연결됩니다. 잘 되었습니다!

Metricbeat

이제 Kibana와 Elasticsearch가 실행되어 통신하고 있으므로 상황을 계속 감시하는 데 도움이 되도록 Metricbeat를 구성해 보겠습니다. 이를 위해서는 docker-compose 파일과 독립형 metricbeat.yml 파일의 구성이 모두 필요합니다.

참고: Logstash, Filebeat 및 Metricbeat의 경우 구성 파일은 바인드 마운트를 사용합니다. 파일에 대한 바인드 마운트는 호스트 시스템에 있는 것과 동일한 권한과 소유권을 컨테이너 내에서 유지합니다. 컨테이너 사용자가 파일을 읽을 수 있고 이상적으로는 쓸 수 없도록 권한을 설정해야 합니다. 그렇지 않으면 컨테이너에서 오류가 발생합니다. 호스트에서 쓰기 권한을 제거하면 충분할 수 있습니다.

docker-compose.yml('metricbeat01' 컨테이너)

 metricbeat01:
   depends_on:
     es01:
       condition: service_healthy
     kibana:
       condition: service_healthy
   image: docker.elastic.co/beats/metricbeat:${STACK_VERSION}
   user: root
   volumes:
     - certs:/usr/share/metricbeat/certs
     - metricbeatdata01:/usr/share/metricbeat/data
     - "./metricbeat.yml:/usr/share/metricbeat/metricbeat.yml:ro"
     - "/var/run/docker.sock:/var/run/docker.sock:ro"
     - "/sys/fs/cgroup:/hostfs/sys/fs/cgroup:ro"
     - "/proc:/hostfs/proc:ro"
     - "/:/hostfs:ro"
   environment:
     - ELASTIC_USER=elastic
     - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
     - ELASTIC_HOSTS=https://es01:9200
     - KIBANA_HOSTS=http://kibana:5601
     - LOGSTASH_HOSTS=http://logstash01:9600

여기에서는 프로세스, 파일 시스템, Docker 데몬에 관한 호스트 정보를 읽기 전용 방식으로 Metricbeat 컨테이너에 노출합니다. 이를 통해 Metricbeat는 Elasticsearch로 보낼 데이터를 수집할 수 있습니다.

metricbeat.yml

metricbeat.config.modules:
 path: ${path.config}/modules.d/*.yml
 reload.enabled: false


metricbeat.modules:
- module: elasticsearch
 xpack.enabled: true
 period: 10s
 hosts: ${ELASTIC_HOSTS}
 ssl.certificate_authorities: "certs/ca/ca.crt"
 ssl.certificate: "certs/es01/es01.crt"
 ssl.key: "certs/es01/es01.key"
 username: ${ELASTIC_USER}
 password: ${ELASTIC_PASSWORD}
 ssl.enabled: true


- module: logstash
 xpack.enabled: true
 period: 10s
 hosts: ${LOGSTASH_HOSTS}


- module: kibana
 metricsets:
   - stats
 period: 10s
 hosts: ${KIBANA_HOSTS}
 username: ${ELASTIC_USER}
 password: ${ELASTIC_PASSWORD}
 xpack.enabled: true


- module: docker
 metricsets:
   - "container"
   - "cpu"
   - "diskio"
   - "healthcheck"
   - "info"
   #- "image"
   - "memory"
   - "network"
 hosts: ["unix:///var/run/docker.sock"]
 period: 10s
 enabled: true


processors:
 - add_host_metadata: ~
 - add_docker_metadata: ~


output.elasticsearch:
 hosts: ${ELASTIC_HOSTS}
 username: ${ELASTIC_USER}
 password: ${ELASTIC_PASSWORD}
 ssl:
   certificate: "certs/es01/es01.crt"
   certificate_authorities: "certs/ca/ca.crt"
   key: "certs/es01/es01.key"

Metricbeat는 시작하기 전에 ES01 및 Kibana 노드가 정상인지에 따라 달라집니다. 여기서 주목할만한 구성은 metricbeat.yml 파일에 있습니다. Elasticsearch, Kibana, Logstash 및 Docker를 포함하여 메트릭 수집을 위한 4개의 모듈을 활성화했습니다. 즉, Metricbeat가 작동 중인지 확인한 후 Kibana로 이동하여 “스택 모니터링”으로 이동하여 상황이 어떻게 보이는지 확인할 수 있습니다.

기본 규칙을 설정하는 것을 잊지 마세요!

Metricbeat는 /var/run/docker.sock를 통해 컨테이너의 호스트를 모니터링하도록 구성되어 있습니다. Elastic Observability를 확인하면 여러분의 호스트에서 들어오는 메트릭을 볼 수 있습니다.

Filebeat

이제 클러스터가 안정적이고 Metricbeat로 모니터링되었으므로 로그 수집을 위해 Filebeat를 살펴보겠습니다. 여기에서 Filebeat는 두 가지 방법으로 활용됩니다.

docker-compose.yml('filebeat01' 컨테이너)

 filebeat01:
   depends_on:
     es01:
       condition: service_healthy
   image: docker.elastic.co/beats/filebeat:${STACK_VERSION}
   user: root
   volumes:
     - certs:/usr/share/filebeat/certs
     - filebeatdata01:/usr/share/filebeat/data
     - "./filebeat_ingest_data/:/usr/share/filebeat/ingest_data/"
     - "./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro"
     - "/var/lib/docker/containers:/var/lib/docker/containers:ro"
     - "/var/run/docker.sock:/var/run/docker.sock:ro"
   environment:
     - ELASTIC_USER=elastic
     - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
     - ELASTIC_HOSTS=https://es01:9200
     - KIBANA_HOSTS=http://kibana:5601
     - LOGSTASH_HOSTS=http://logstash01:9600

filebeat.yml

filebeat.inputs:
- type: filestream
 id: default-filestream
 paths:
   - ingest_data/*.log


filebeat.autodiscover:
 providers:
   - type: docker
     hints.enabled: true


processors:
- add_docker_metadata: ~


setup.kibana:
 host: ${KIBANA_HOSTS}
 username: ${ELASTIC_USER}
 password: ${ELASTIC_PASSWORD}


output.elasticsearch:
 hosts: ${ELASTIC_HOSTS}
 username: ${ELASTIC_USER}
 password: ${ELASTIC_PASSWORD}
 ssl.enabled: true
 ssl.certificate_authorities: "certs/ca/ca.crt"

먼저 'filebeat_ingest_data' 폴더를 컨테이너에 매핑하도록 바인드 마운트를 설정합니다. 호스트에 이 폴더가 없으면 컨테이너가 회전할 때 생성됩니다. 사용자 정의 로그에 대해 Elastic Observability 내의 로그 스트림 뷰어를 테스트하려는 경우 .log 확장자를 /filebeat_ingest_data/로 확장하면 로그가 기본 Filebeat Datastream으로 읽혀집니다.

이 외에도 /var/lib/docker/containers/var/run에도 매핑합니다. /kr/docker.sock 이는 filebeat.autodiscover 섹션 및 과 결합됩니다. 힌트 기반 자동 검색을 사용하면 Filebeat가 모든 컨테이너에 대한 로그를 가져올 수 있습니다. 이러한 로그는 위에서 언급한 로그 스트림 뷰어에서도 찾을 수 있습니다.

Logstash

생명을 불어넣을 마지막 컨테이너는 바로 Logstash입니다.

docker-compose.yml('logstash01' 컨테이너)

 logstash01:
   depends_on:
     es01:
       condition: service_healthy
     kibana:
       condition: service_healthy
   image: docker.elastic.co/logstash/logstash:${STACK_VERSION}
   labels:
     co.elastic.logs/module: logstash
   user: root
   volumes:
     - certs:/usr/share/logstash/certs
     - logstashdata01:/usr/share/logstash/data
     - "./logstash_ingest_data/:/usr/share/logstash/ingest_data/"
     - "./logstash.conf:/usr/share/logstash/pipeline/logstash.conf:ro"
   environment:
     - xpack.monitoring.enabled=false
     - ELASTIC_USER=elastic
     - ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
     - ELASTIC_HOSTS=https://es01:9200

logstash.conf

input {
 file {
   #https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html
   #default is TAIL which assumes more data will come into the file.
   #change to mode => "read" if the file is a compelte file.  by default, the file will be removed once reading is complete -- backup your files if you need them.
   mode => "tail"
   path => "/usr/share/logstash/ingest_data/*"
 }
}


filter {
}


output {
 elasticsearch {
   index => "logstash-%{+YYYY.MM.dd}"
   hosts=> "${ELASTIC_HOSTS}"
   user=> "${ELASTIC_USER}"
   password=> "${ELASTIC_PASSWORD}"
   cacert=> "certs/ca/ca.crt"
 }
}

Logstash 구성은 Filebeat 구성과 매우 유사합니다. 이번에도 바인드 마운트를 사용하고 호스트의 /logstash_ingest_data/ 폴더를 Logstash 컨테이너에 매핑합니다. 여기에서 다양한 입력 플러그인필터 플러그인 중 일부를 logstash.yml 파일을 수정하여 테스트해 볼 수 있습니다. 그런 다음 데이터를 /logstash_ingest_data/ 폴더에 놓습니다. logstash.yml 파일을 수정한 후 Logstash 컨테이너를 다시 시작해야 할 수도 있습니다.

참고로 Logstash 출력 인덱스 이름은 "logstash-%{+YYYY.MM.dd}"입니다. 데이터를 보려면 아래와 같이 'logstash-*' 패턴에 대한 데이터 보기를 생성해야 합니다.

이제 Filebeat와 Logstash가 모두 실행되고 있는 상태에서 클러스터 모니터링으로 다시 이동하면 Logstash가 모니터링되는 것을 볼 수 있을 뿐만 아니라 Elasticsearch 로그에 대한 일부 메트릭과 링크도 볼 수 있습니다.

결론

이 시리즈의 제1부에서는 스택의 기초로 모니터링과 수집을 갖춘 전체 활성 클러스터를 다루었습니다. 이는 Elastic 생태계의 일부 기능을 테스트하기 위한 로컬 놀이터 역할을 할 것입니다.

더 자세히 알아볼 준비가 되셨나요? 제2부를 확인하세요! 우리는 APM 서버, Elastic Agents, Elastic Integrations 및 Elastic Search와 같은 추가 기능을 설정하는 것과 함께 이 기반을 최적화하는 데 주력합니다. 또한 이러한 부분 중 일부를 계측할 수 있는 애플리케이션을 배포하고 테스트합니다.

여기에서 논의된 모든 파일은 GitHub에서 Filebeat 및 Logstash용으로 수집할 샘플 데이터와 함께 사용할 수 있습니다.

Elastic Stack 소개 보기