https://dungdung-developer.tistory.com/10
[Docker] ELK 스택을 Docker로 실행하기 - 1
제가 실무에서 ELK를 실행시키는 것에 어려움이 있었기에 게시글로 준비해 봤습니다. 한 번 이해하고 설정해 놓으면 복잡하게 설정하지 않아도 쉽게 로그를 수집할 수 있기 때문에 직접 실행해
dungdung-developer.tistory.com
전 게시글에서는 프로젝트의 폴더와 필요한 파일을 확인했습니다. 이번 게시글에서는 직접 elasticsearch/kibana/logstash의 설정파일을 작성하겠습니다.
시작하기 전에 제가 참고한 github 링크입니다.
https://github.com/elastic/elasticsearch/blob/main/distribution/docker/src/docker/config/elasticsearch.yml
https://github.com/FantasticFiasco/serilog-sinks-http-sample-elastic-stack
GitHub - FantasticFiasco/serilog-sinks-http-sample-elastic-stack: Sample application of Serilog.Sinks.Http sending log events to
Sample application of Serilog.Sinks.Http sending log events to Elastic Stack. - FantasticFiasco/serilog-sinks-http-sample-elastic-stack
github.com
[ elasticsearch/kibana/Logstash 설정파일 작성 ]
- .env
elasticsearch, logstash, kibana의 버전을 저장할 .env파일을 생성 후 아래 내용을 입력하고 저장합니다.
해당 환경변수는 docker-compose.yml과 각 ELK의 Dockerfile에서 사용합니다.
ELK_VERSION=7.17.0
1-1. elasticsearch.yml
기본적으로 설정을 적어줍니다. 아래 링크는 elastic의 오픈소스입니다.
https://github.com/elastic/elasticsearch/blob/main/distribution/docker/src/docker/config/elasticsearch.yml
elasticsearch/distribution/docker/src/docker/config/elasticsearch.yml at main · elastic/elasticsearch
Free and Open, Distributed, RESTful Search Engine. Contribute to elastic/elasticsearch development by creating an account on GitHub.
github.com
클러스터 이름은 "docker-cluster"로 설정하고 Elasticsearch가 모든 IP에 대해서 수신 대기하게 설정합니다. 만약 특정 IP에 대해서만 수신 대기하기를 원한다면 0.0.0.0을 변경해 주세요.
추가로 elacticsearch의 클러스터에 대해 자세히 알기 원한다면 공식 홈페이지를 참고해 주세요.
cluster.name: "docker-cluster"
network.host: 0.0.0.0
1-2. elasticsearch\Dockerfile
우선 최상단에 ARG를 사용해서 Dockerfile 내에서 사용할 빌드 타임 변수( ELK_VERSION )를 정의합니다.
그 후 FROM에서 elastic에서 제공하는 elasticsearch 이미지의 경로와 버전을 정의해 줍니다.
elastic에서 제공하는 도커 이미지는 https://www.docker.elastic.co/ 에서 찾아볼 수 있습니다.
ARG ELK_VERSION
FROM docker.elastic.co/elasticsearch/elasticsearch:${ELK_VERSION}
2-1. kibana.yml
kibana도 name을 정의하고 모든 IP에 대해서 수신 대기하게 설정합니다.
elasticsearch.hosts에서는 kibana가 연결할 elasticsearch의 클러스터 호스트 주소를 설정하는데 다른 노드가 있다면 배열에 추가할 수 있습니다. elasticsearch의 기본 port는 9200입니다.
monitoring.ui.container.elasticsearch.enabled는 Kibana Monitoring UI에서 Elasticsearch 클러스터 모니터링을 가능하게 하는 설정입니다. true로 설정하겠습니다.
server.name: kibana
server.host: 0.0.0.0
elasticsearch.hosts: ["http://elasticsearch:9200"]
monitoring.ui.container.elasticsearch.enabled: true
2-2. kibana\Dockerfile
kibana의 docker 이미지 경로를 설정해 줍니다.
ARG ELK_VERSION
FROM docker.elastic.co/kibana/kibana:${ELK_VERSION}
3-1. logstash.yml
ELK를 간단하게 설명하면 'logstash가 로그를 수집해서 elasticsearch가 인덱싱 하고 kibana가 웹으로 보여준다.'인데 여기서 logstash는 '어떻게 로그를 수집하여 어디로 보낼 것 인가?'에 대한 설정이 필요합니다. 해당 역할은 pipeline의 logstash.conf가 해줍니다.
* input: 어디서 데이터를 받을 것인지 정의합니다. 저는 beats 플러그인을 사용하여 file 데이터를 받겠습니다.
* filter: 원하는 데이터타입과 형태를 처리합니다.
message의 format을 정하지 않고 json데이터를 통으로 넘기는 등 여러 플러그인을 사용하여 필터를 할 수 있습니다. 저는 로그를 저장할 때 windows에서는 특정 포맷으로 file로 저장시키고 ubuntu와 같은 linux에서는 특정 포맷 없이 json으로 만들어 file로 저장합니다.
file로 저장시키는 이유는 네트워크로 프로그램에서 logstash로 로그 데이터를 전송하게 되면 만약 네트워크 오류가 발생했을 때 로그를 잃어버리기 때문입니다. 그래서 filebeat라는 프로그램을 사용해서 프로그램에서 남긴 file을 logstash로 전송시킵니다.
*output: if문을 통해서 조건을 걸어 원하는 elasticsearch의 인덱스에 데이터를 전달할 수 있는데 예를 들어 if "web" in [log][file][path]이라는 구문을 사용하면 input으로 들어온 경로에 "web"이라는 단어가 있을 경우 if문 아래의 필터를 적용합니다.
저는 간단하게 id가 web인 데이터를 elasticsearch의 "logstash-%{+YYYY.MM.dd}"인덱스로 보내겠습니다.
(security설정을 하였다면 여기서 user, password를 입력해 주면 됩니다.)
input {
beats {
port => 31311
}
}
filter {
grok {
match => {
"message" => "%{TIMESTAMP_ISO8601:timestamp} \[%{WORD:level}\] %{HOSTNAME:hostname} %{WORD:category} %{GREEDYDATA:message}"
}
}
}
output {
if [id] == "web" {
elasticsearch {
hosts => "elasticsearch:9200"
ecs_compatibility => disabled
index => "logstash-%{+YYYY.MM.dd}"
}
}
else {
elasticsearch {
hosts => "elasticsearch:9200"
ecs_compatibility => disabled
index => "logs-%{+YYYY.MM.dd}"
}
}
}
3-2. logstash\Dockerfile
ARG ELK_VERSION
FROM docker.elastic.co/logstash/logstash:${ELK_VERSION}
3-3. logstash.conf
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]
저는 log 시스템에 접근할 수 있는 ip를 제한하고 로그를 남기는 프로그램이 외부에 노출되어있지 않기 때문에 user설정과 ip 설정을 넘겼지만 직접 자신의 프로그램에 적용할 때에는 보안적인 고민이 필요할 겁니다. 저의 게시물은 간단한 가이드일 뿐 꼭 공식 홈페이지를 살펴보길 권장드립니다.
이제 위 설정대로 docker-compose.yml를 작성하고 up을 시키면됩니다.
'Docker' 카테고리의 다른 글
[Docker] ELK 스택을 Docker로 실행하기 - 1 (0) | 2023.12.13 |
---|