앞서, 1번 포스팅에 이어 k8s위에 Elastic Stack을 구축하는 방법에 대한 포스팅을 계속해서 진행할 것이다. Elastic Stack 중 Kibana와 Beat을 배포하는 방법을 이번 포스팅에서 정리하겠다.

Kibana Deploy

앞선 포스팅과 마찬가지로 공식 문서를 참고하면서 진행을 하였고, Kibana를 배포하는 과정도 공식 문서에 나와있는 대로 진행을 하였다.

apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: quickstart
spec:
version: 7.12.1
count: 1
elasticsearchRef:
name: quickstart

이전에 Elastic Search를 배포하기 전에 Elastic Operator를 배포하였었다. 그 과정에서 Kibana라는 CRD가 이미 클러스터에 반영이 되었기 때문에 위 처럼 yaml 파일에 kibana라는 인스턴스를 사용할 수 있다. 하단의 Ref 하위의 name 부분은 Elastic Search 클러스터의 name으로 넣어주면 된다.

위와 같이 작성하고 배포하면 아래와 같은 커맨드로 상태를 확인할 수 있다.

[root@node1 ELK]# kubectl get kibanas.kibana.k8s.elastic.co 
NAME HEALTH NODES VERSION AGE
quickstart green 3 7.12.0 20d

나는 count를 3으로 하였기 때문에 Nodes가 3인 상태이고, Kibana는 Elastic Search와는 다르게 Deployment로 배포된다. 또한, kibana 인스턴스를 배포하면 kibana에 대한 서비스가 하나 생기는데 해당 서비스 역시 NodePort나 로드밸런서로 재정의 해주어서 사용하도록 하자.(kube-proxy로 해도 무방하나 불편하다.)

[root@node1 ELK]# kubectl get svc 
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
quickstart-kb-http NodePort 10.98.175.63 <none> 5601:31259/TCP 20d

위와 같은 이름의 kb-http 서비스를 발견할 수 있을텐데 해당 url로 들어가면 다음과 같은 창이 보인다. ID/PASSWD 는 Elastic Search의 것과 동일하다.

계정정보를 입력하고 로그인하면 위와 같은 화면이 나오면 정상적으로 배포가 완료된 것이라고 할 수 있다.

이 상태로는 Elastic Search와 Kibana만 연동이 되어진 상태이고, 현재까지는 Logstash나 Beats가 없기 때문에 Elastic Search에는 어떤 정보도 저장이 되어 있지 않다. 따라서 Kibana가 UI로 표출해줄 데이터도 없다.

Beats Deploy

Beats에는 Filebeat와 Metricbeat로 두가지로 크게 구분이 된다. AuditBeat라는 Security 관련된 로그를 수집하는 Beat도 있으나 잘 모르겠다….

  • FileBeat : 말그대로 서버에 존재하는 Log file 수집하는 Beat
  • MetricBeat : 서버에 존재하는 자원 정보를 수집하는 Beat

키바나 웹에서 위와 같이 Add data 탭으로 가면 Beat로 수집할 수 있는 정보들이 쭉 나오는데, Logs탭의 모듈은 FileBeat가 Metrics탭의 모듈은 MetricBeat가 그리고 Security탭은 AuditBeat가 수행한다.

원하는 모듈을 선택해보면 가이드도 제공하고 있다. 나도 해당 가이드를 참고하여 구글링과 병행하면서 배포를 진행하였다.

Filebeat Deploy

먼저 FileBeat의 배포를 진행해보면, 위의 모듈 중에서 특별히 선택할 만한 모듈이 없어서 기본적인 서버의 log만 수집하도록 FileBeat를 배포할 예정이다.

#curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.12.0-x86_64.rpm 
#sudo rpm -vi filebeat-7.12.0-x86_64.rpm

filebeat 패키지를 다운받고 패키지를 설치하자! 위 과정을 포함해서 FileBeat의 배포 과정은 Logs탭의 아무 모듈이나 들어가서 Module을 Enable하는 과정만 빼면 된다.

#vi /etc/filebeat/filebeat.yml=========filebeat input===================
enabled: true -> (false이면 true로 바꿔줌)
paths:
- /var/log/*.log (수집할 경로 및 로그 확장자)
.......output.elasticsearch:
hosts: ["<es_url>"]
username: "elastic"
password: "<password>"
setup.kibana:
host: "<kibana_url>"

패키지가 설치된 디렉토리에 filebeat.yml 파일을 열어서 Filebeat Input 설정을 하고, Output 정보를 앞서 구축한 각자의 Elastic Search 클러스터 정보에 맞게 입력하자. 포트까지 입력해주어야한다.
ex) https://192.168.178.160:31259

#filebeat setup
#systemctl start filebeat.service

filebeat를 위와 같이 셋업시키고, 서비스를 시작하면 로그 수집이 시작된다. 수집이 되고 있는지는 Elastic Search에 접속하여 확인을 해볼 수 있다. 키바나를 통해서 확인을 하여도 무방하다.

https://[elastic search url]:[port]/_cat/indices

위 url을 접속하여 filebeat라는 인덱스가 추가되었는지 확인하고, 새로고침 하면서 해당 인덱스로 입력되는 데이터가 계속 유입되고 있는지 확인하자

Kibana 웹에서 Index Patterns으로 filebeat-* 를 등록하고, Discover 탭 혹은 Logs 탭을 확인하여 수집되는 로그를 확인할 수 있다.

Discover / Logs 탭

MetricBeat Deploy

다음으로 MetricBeat를 배포다. MetricBeat는 시스템의 자원과 현재 Elastic Stack이 구성되어있는 Kubernetes의 자원을 수집하도록 배포를 진행할 것이다.

FileBeat와 마찬가지로 Add Data 메뉴에서 Metric 탭에 Kubernetes Metric을 선택해주자. 그리고 아래와 같이 패키지를 다운 받는다.

#curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.12.0-x86_64.rpm 
#sudo rpm -vi metricbeat-7.12.0-x86_64.rpm

이번에도 동일하게 output 정보를 기입하여 주자

#vi /etc/metricbeat/metricbeat.yml
output.elasticsearch:
hosts: ["<es_url>"]
username: "elastic"
password: "<password>"
setup.kibana:
host: "<kibana_url>"

이번에는 Kubernetes 모듈을 사용할 것이므로 해당 모듈을 활성화 시켜주자

#sudo metricbeat modules enable kubernetes

modules.d 디렉토리안에 kubernetes.yml 파일에서 수집할 정보를 기입하고 다음과 같이 커맨드로

#metricbeat setup
#systemctl start metricbeat.service

를 진행하면 안된다. 안되더라,,, 로그를 계속해서 확인해보니 kubelet을 통해서 수집해오는 정보는 kubelet token이 있어야하고 관련 인증서도 필요한데 해당 디렉토리가 Pod 속에 존재하다보니, 찾을 수 없다는 로그가 계속 나온다.

따라서 metric beat의 kubernetes 모듈의 경우는 특수하게 metricbeat.service로 올리지 않고, Kubernetes에 Daemon Set으로 배포해주도록 많은 사람들이 사용하고 있다.

해당 yaml 파일을 아래의 git에서 받아오자
https://github.com/elastic/beats/blob/master/deploy/kubernetes/metricbeat-kubernetes.yaml

Kubernetes에 Beat에 대한 CRD도 역시 이미 정의가 되어있기 때문에 이를 활용하여 Metric Beat를 구축하면 된다.

env:        
- name: ELASTICSEARCH_HOST
value: elasticsearch
- name: ELASTICSEARCH_PORT
value: "9200"
- name: ELASTICSEARCH_USERNAME
value: elastic
- name: ELASTICSEARCH_PASSWORD
value: changeme

위 부분을 HOST에는 Elasticsearch의 URL을 넣어주고 Port엔 Port 그리고, ID/PASSWD를 기입해준다. 추가적으로 yaml에 내용을 검색해보면, 114번 라인을 확인하여 ssl.verification_mode: “none” 이 추가되어있는지 확인해보자. 해당 내용이 없으면 추가해주자

#kubectl apply -f metricbeat-kubernetes.yaml

위 yaml 파일을 적용하면, Filebeat와 마찬가지로 Elastic Search에 인덱스가 추가되었고, Kibana에서도 추가된 것을 확인할 수 있다.

Discover / Metric 탭

배포가 잘 되었으면, 위 처럼 수집되고 있는 Metric을 확인할 수 있다.

추가적으로 MetricBeat에 MySQL의 쿼리를 수집해오거나 하는 등의 테스트도 진행해보았는데, 잘 되고 이 부분은 Add Data에 나와있는 것처럼 MySQL 모듈을 Metricbeat.service로 올려서 진행해보았다.

해당 부분에 대해선 따로 또 포스팅을 정리해서 올리도록 하겠다.

--

--