ELK 스택 docker-compose 세팅
https://github.com/deviantony/docker-elk
---
## Default Elasticsearch configuration from Elasticsearch base image.
## https://github.com/elastic/elasticsearch/blob/main/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: trial
xpack.security.enabled: true
cluster.name
network.host
xpack.license.self_generated.type
trial
인 경우 시험용으로 X-Pack 기능을 일정 기간 동안 사용 가능하다.xpack.security.enabled
---
## Default Kibana configuration from Kibana base image.
## https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.ts
#
server.name: kibana
server.host: 0.0.0.0
elasticsearch.hosts: [ http://elasticsearch:9200 ]
monitoring.ui.container.elasticsearch.enabled: true
monitoring.ui.container.logstash.enabled: true
## X-Pack security credentials
#
elasticsearch.username: elastic
elasticsearch.password: ${KIBANA_SYSTEM_PASSWORD}
elasticsearch.hosts
monitoring.ui.container.elasticsearch.enable
monitoring.ui.container.logstash.enable
## Default Logstash configuration from Logstash base image.
## https://github.com/elastic/logstash/blob/master/docker/data/logstash/config/logstash-full.yml
#
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
## X-Pack security credentials
#
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: ${MONITORING_INTERNAL_PASSWORD}
input {
tcp {
port => 50000
}
}
## Add your filters / logstash plugins configuration here
output {
elasticsearch {
hosts => "elasticsearch:9200"
user => "elastic"
password => "${LOGSTASH_INTERNAL_PASSWORD}"
}
}
데이터를 파싱, 필드 추가/삭제
조건에 따라 데이터 변형 등의
행위가 수행가능하다.
elasticsearch:
build:
context: elk/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:
node.name: elasticsearch
ES_JAVA_OPTS: -Xms256m -Xmx256m
# 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
restart: unless-stopped
logstash:
build:
context: elk/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"
- "50000:50000/tcp"
- "50000:50000/udp"
- "9600:9600"
environment:
LS_JAVA_OPTS: -Xms256m -Xmx256m
LOGSTASH_INTERNAL_PASSWORD: ${LOGSTASH_INTERNAL_PASSWORD:-}
networks:
- elk
depends_on:
- elasticsearch
restart: unless-stopped
kibana:
build:
context: elk/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
restart: unless-stopped
Error: [config validation of [elasticsearch].username]: value of "elastic" is forbidden. This is a superuser account that cannot write to system indices that Kibana needs to function. Use a service account token instead. Learn more: https://www.elastic.co/guide/en/elasticsearch/reference/8.0/service-accounts.html
2024-03-23T14:02:10.401730675Z at ensureValidConfiguration (/usr/share/kibana/node_modules/@kbn/core-config-server-internal/src/ensure_valid_configuration.js:23:11)
ERROR: Failed to load settings file from "path.settings". Aborting... path.setting=/usr/share/logstash/config, exception=LogStash::ConfigurationError, message=>Cannot evaluate `${MONITORING_INTERNAL_PASSWORD}`. Replacement variable `MONITORING_INTERNAL_PASSWORD` is not defined in a Logstash secret store or as an Environment entry and there is no default value given.
2024-03-23T13:55:18.008385436Z [FATAL] 2024-03-23 13:55:18.003 [main] Logstash - Logstash stopped processing because of an error: (SystemExit) exit
kibana 를 띄우려고 해보았으나/.
서버 인증이 실패했다
[2024-03-23T14:37:39.103+00:00][ERROR][elasticsearch-service] Unable to retrieve version information from Elasticsearch nodes. security_exception
2024-03-23T14:37:39.103509881Z Root causes:
2024-03-23T14:37:39.103513398Z security_exception: unable to authenticate user [kibana_system] for REST request [/_nodes?filter_path=nodes.*.version%2Cnodes.*.http.publish_address%2Cnodes.*.ip]
2024-03-23T14:37:39.393682723Z [2024-03-23T14:37:39.393+00:00][INFO ][plugins.screenshotting.chromium] Browser executable: /usr/share/kibana/node_modules/@kbn/screenshotting-plugin/chromium/headless_shell-linux_x64/headless_shell
에러 메시지상으로는
Kibana 가 es 노드로부터 버전 정보를 검색해보려고 했지만,,, 실패했다는 의미이다. + 인증 실패
해당 이슈는 elk 스택에 내가 설정한 유저이름을 아직 만들어주고, 권한을 주지 않았기에 발생하는 문제로서
security_exception: unable to authenticate user [kibana_system] · Issue #863 · deviantony/docker-elk
docker compose up -d setup
명령어를 사용하여 setup 을 수행해야한다
setup:
profiles:
- setup
build:
context: elk/setup/
args:
ELASTIC_VERSION: ${ELASTIC_VERSION}
init: true
volumes:
- ./elk/setup/entrypoint.sh:/entrypoint.sh:ro,Z
- ./elk/setup/lib.sh:/lib.sh:ro,Z
- ./elk/setup/roles:/roles:ro,Z
environment:
ELASTIC_PASSWORD: ${ELASTIC_PASSWORD:-}
LOGSTASH_INTERNAL_PASSWORD: ${LOGSTASH_INTERNAL_PASSWORD:-}
KIBANA_SYSTEM_PASSWORD: ${KIBANA_SYSTEM_PASSWORD:-}
METRICBEAT_INTERNAL_PASSWORD: ${METRICBEAT_INTERNAL_PASSWORD:-}
FILEBEAT_INTERNAL_PASSWORD: ${FILEBEAT_INTERNAL_PASSWORD:-}
HEARTBEAT_INTERNAL_PASSWORD: ${HEARTBEAT_INTERNAL_PASSWORD:-}
MONITORING_INTERNAL_PASSWORD: ${MONITORING_INTERNAL_PASSWORD:-}
BEATS_SYSTEM_PASSWORD: ${BEATS_SYSTEM_PASSWORD:-}
networks:
- elk
depends_on:
- elasticsearch
profile
의 경우 Docker compose 3.4 이상에서 지원하는 프로필 기능인데, setup 으로 특정 프로필에 속한 서비스만 시작할 수 있다.build
의 경우 Docker 이미지를 빌드할 때 사용되는 설정이다.context
는 어떤 디렉터리를 이미지 빌드의 컨텍스트로 사용할 건지에 대한 내용이다. 단순히 디렉터리 위치만 기입하면된다.args
는 빌드시 사용된 인자 - 환경 변숭디ㅏ.init
시계열 데이터베이스
이다.@timestamp
이라는 필드를 사용한다.인덱스
는 비슷한 특성을 가진 데이터들의 집합이다.파티셔닝
으로 대용량의 데이터를 효율적으로 관리하기 위하여 데이터를 분할하는 기법인데, 인덱스명에 날짜를 인덱스이름-yyyy-mm-dd
← 이런 식으로 지정한다면, 파티셔닝의 한 예시로서, 이를 통해 특정 기간의 데이터만 빠르게 조회할 수 있음. output {
elasticsearch {
hosts => "elasticsearch:9200"
user => "elastic"
password => "${LOGSTASH_INTERNAL_PASSWORD}"
index => "date-index-%{+YYYY.MM.dd}"
}
}
docker-compose up -d setup
docker-compose up
implementation 'net.logstash.logback:logstash-logback-encoder:6.6'
logstash-logback-encoder
를 사용할 수 있다.<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>localhost:5044</destination> <!-- Logstash 서버 주소와 포트 -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<root level="INFO">
<appender-ref ref="LOGSTASH"/>
</root>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 콘솔 Appender 설정 -->
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>localhost:5044</destination> <!-- Logstash 서버 주소와 포트 -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<!-- Root Logger 설정 -->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="LOGSTASH"/>
</root>
</configuration>
input {
tcp {
port => 5044
codec => json_lines
}
}
## Add your filters / logstash plugins configuration here
output {
elasticsearch {
hosts => "http://localhost:9200"
index => "logstash-spring-boot-%{+YYYY.MM.dd}"
}
}
원래 Kibana 에서는 stackManagement 에
분명히 index pattern 이라는 메뉴가 있어야 하는데 안보였다
찾아보니… Create a data view | Kibana Guide [8.12] | Elastic 로 변경이 된 듯하다.
data view 를 설정하고, 거기에서 index 를 설정해주면 알맞게 데이터를 시각화 해주는 듯하다.
알고 보니 이는 xpack 이라는 라이센스가 필요한 플러그인 설정때문 이였다.
별도 라이센스가 업기에 logstash..yml 에서 xpack 관련한 부분을 전부 제거하였다.
---
## Default Logstash configuration from Logstash base image.
## https://github.com/elastic/logstash/blob/main/docker/data/logstash/config/logstash-full.yml
#
http.host: 0.0.0.0
node.name: logstash
가 되었다
인덱스가 정상적으로 es 에 올라왔기에, matching sources 에 제대로 오늘 날짜로 잡히는 모습
정상적으로 잡힌다.
대시보드로 이동한다면