Monitoring

ELK 연결 구성 (filebeat 포함)

황동리 2024. 9. 24. 16:17
반응형

이번엔 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' 카테고리의 다른 글

filebeat 설치 해보기  (0) 2024.09.13
Docker 사용하여 ELK 설치 (Elasticsearch, Logstash, Kibana)  (2) 2024.09.11