이번엔 ELK 사용해보도록 하겠습니다.
기본적인 Flow는 아래 이미지와 같습니다.
FileBeat는 로그를 가져올 서버에 설치를 한 후에 Logstash 에 로그를 전달,
그리고 Logstash에서 ElasticSearch에 로그 전송 후,
Kibana에서 시각화
하는 형식으로 구성하였습니다.
ELK 및 filebeat 설치 방법은 아래를 참조해주세요
2024.09.13 - [Monitoring] - filebeat 설치 해보기
filebeat 설치 해보기
현재 제가 사용하는 OS는 ubuntu 22.04 입니다.apt 패키지 매니저를 사용해서 설치해보도록 하겠습니다.1. Public Signing Key 다운로드 공식 홈페이지에는 아래와 같이 나와있지만, # wget -qO - https://artifac
ksh-cloud.tistory.com
2024.09.11 - [Monitoring] - Docker 사용하여 ELK 설치 (Elasticsearch, Logstash, Kibana)
Docker 사용하여 ELK 설치 (Elasticsearch, Logstash, Kibana)
이번엔 ELK 설치를 해보겠습니다. 먼저 Elasticsearch를 설치해보겠습니다.Elasticsearch 설치먼저 elasticsearch 이미지를 받아주겠습니다.# docker pull docker.elastic.co/elasticsearch/elasticsearch:8.15.1 그리고 docker
ksh-cloud.tistory.com
FileBeat 설정
filebeat는 logstash로 보내줄 로그의 경로와 logstash의 IP, Port 등을 지정해줍니다.
filebeat.yml 내용
=======================
filebeat.inputs:
- type: log
enabled: true
paths:
- <원하는 로그 파일의 위치 지정>
- ex) /opt/tomcat/logs/catalina.out
fields:
server_name: "<서버 호스트명>" # logstash에서 서버 호스트명 으로 index를 필터 해줄 때 사용
fields_under_root: true
output.logstash:
hosts: ["<logstash의 IP>:5044"] # 보내줄 logstash의 IP와 포트 정의
=======================
설정 변경 이후 filebeat 서비스 재시작
# systemctl restart filebeat
LogStash 설정
logstash에서 설정 할 것은,
로그를 전달 받을 Port 번호 정의, filter, elasticsearch 주소 등을 정의 해줍니다.
logstash.conf 내용
=======================
input {
beats {
port => 5044 # 앞서 filebeat에서 정의 해둔 포트
}
}
filter {
if [server_name] == "<filebeat에서 적은 서버의 호스트명>" {
mutate { add_field => { "[@metadata][target_index]" => "<filebeat에서 적은 서버의 호스트명>" } }
}
else if [server_name] == "<filebeat에서 적은 서버의 호스트명>" {
mutate { add_field => { "[@metadata][target_index]" => "<filebeat에서 적은 서버의 호스트명>" } }
}
}
output {
stdout { codec => rubydebug }
elasticsearch {
hosts => ["http://<elasticsearch IP>:9200"]
index => "%{[@metadata][target_index]}"
user => "elastic"
password => "<elastic ID에 대한 Password>"
}
}
=======================
각각 다른 서버에서 보내오는 log들을 filter에서 조건을 걸어,
호스트명 별로 index를 구성하도록 하였습니다.
설정 변경 이후 logstash 서비스 재시작 (저 같은 경우 docker로 구성하였기 때문에 컨테이너 재시작)
# docker restart logstash
ElasticSearch 설정
elasticsearch.yml 내용
=======================
# Elasticsearh 클러스터의 이름을 정의
cluster.name: "docker-cluster"
# ElasticSearch에 접속 할 수 있는 IP 대역 정의
network.host: 0.0.0.0
# ElasticSearch의 보안 기능 활성화 [인증(로그인), 권한 관리, 데이터 암호화 등]
xpack.security.enabled: true
# 새로운 Elasticsearch 노드를 클러스터에 자동으로 추가할 때, 보안 기능이 활성화된 상태에서의 간편한 등록(enrollment)을 지원
xpack.security.enrollment.enabled: true
# HTTP API 통신에 대한 SSL/TLS 암호화를 설정하는 부분
# 저는 테스트 용으로 구현한 것이라서 false로 하였습니다.
xpack.security.http.ssl:
enabled: false
keystore.path: certs/http.p12
# Elasticsearch 노드 간 통신을 암호화하는 설정
xpack.security.transport.ssl:
enabled: true
verification_mode: certificate
keystore.path: certs/transport.p12
truststore.path: certs/transport.p12
# Create a new cluster with the current node only
# Additional nodes can still join the cluster later
#cluster.initial_master_nodes: ["91baf6f3c744"]
# Elasticsearch를 단일 노드 모드로 실행하기 위한 설정
# 따라서 위의 cluster.initial_master_nodes 값을 주석 처리 해주었습니다.
discovery.type: single-node
=======================
설정 변경 이후 elasticsearch 서비스 재시작 (저 같은 경우 docker로 구성하였기 때문에 컨테이너 재시작)
# docker restart elasticsearch
그리고 Kibana와 ElasticSearch를 연결하기 위해 kibana_admin 이름의 계정과 해당 계정에 들어갈 role을 생성 해줍니다.
먼저 role을 생성 해줍니다.
# curl -X PUT "http://<elasticsearch의 IP>:9200/_security/role/kibana_admin" \
-H "Content-Type: application/json" \
-u elastic:<elastic의 Password> \
-d '{
"cluster": ["monitor", "manage_kibana"],
"indices": [
{
"names": ["*"],
"privileges": ["view_index_metadata", "read"]
}
]
}'
이제 계정 생성을 해보겠습니다.
# curl -X POST "http://<elasticsearch의 IP>:9200/_security/user/kibana_admin" \
-H "Content-Type: application/json" \
-u elastic:<elastic의 Password> \
-d '{
"password" : "<kibana_admin의 Password 정의>",
"roles" : [ "kibana_admin" ],
"full_name" : "Kibana Admin",
"email" : "example@example.com"
}'
Kibana 설정
kibana.yml 내용
=======================
# Kibana에 접속 할 수 있는 IP 대역 정의
server.host: "0.0.0.0"
# Kibana 서버가 종료될 때 대기하는 시간 정의
server.shutdownTimeout: "5s"
# elasticsearch와 연결하기 위해 IP와 포트 입력
elasticsearch.hosts: [ "http://<ElasticSearch의 IP>:9200" ]
# elasticsearch와 연결하기 위해 위에서 생성한 kibana_admin 계정 입력
# "elastic" ID로 로그인하면 에러 나옴
elasticsearch.username: "kibana_admin"
elasticsearch.password: "<kibana_admin의 Password>"
# Kibana에서 모니터링 UI를 활성화하여 Elasticsearch의 상태를 모니터링할 수 있도록 하는 설정
monitoring.ui.container.elasticsearch.enabled: true
=======================
결과 확인
우선 kibana에 접속해줍니다.
그리고 Stack Management에 가서 index가 정상적으로 생성이 되었나 확인 해줍니다.
이상 입니다.
'Monitoring' 카테고리의 다른 글
telegraf <-> Prometheus <-> Grafana 연결하여 모니터링 해보기 (0) | 2024.11.21 |
---|---|
Prometheus - Grafana 설치 (Helm 차트) (0) | 2024.11.15 |
filebeat 설치 해보기 (0) | 2024.09.13 |
Docker 사용하여 ELK 설치 (Elasticsearch, Logstash, Kibana) (2) | 2024.09.11 |