[ELK] k8s에 Elastic Stack 구축하기 (1/2)

minujana
7 min readApr 26, 2021

최근에 Elastic Search에 관하여 공부를 시작하게 됬고, 자연스럽게 Elastic Stack을 공부하게 됬다. 너무나 유명한 오픈소스 솔루션이고, 활용도가 상당하다. ELK Stack을 이용해서 재미난 프로젝트를 진행해봤고, 관련 내용을 정리해두려고 한다.

Elastic Stack 의 구성요소는 아래와 같다.

  • Elastic Search
  • Logstash
  • Kibana
  • Beats

Beats와 Logstash 의 역할은 데이터를 수집하는 에이전트로 비슷한 역할을 하지만, 기능의 다양성(Logstash > Beats)면에서 차이를 보이고 Logstash가 그만큼 Beat에 비해 리소스를 더 많이 사용한다.

나는 k8s 클러스터 위에 Elastic Stack을 구축을 하였고, Logstash 대신 Beat를 사용하여 구축하였다. Beat는 Filebeat와 Metricbeat를 사용하였다.

구축은 elastic 공식 doc를 참고하였다.
https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-quickstart.html

Elastic Operator Deploy

먼저, Elastic Search를 구축하기전에, Kubernetes에 CRD라고 많이 들어봤을 Custom Resource Definition과 ConfigMap, Namespace, Secret 등등 ELK 스택에 필요한 Operator를 먼저 배포해주자.

ECK라고 사용자들이 Elastic 스택을 Kubernetes에 편리하게 구축하고 관리할 수 있도록 Elastic 측에서 만들어 뒀다. 엘라스틱 서치 클러스터를 만들기전에 우선 해당 yaml 파일 부터 배포해주자.

#kubectl apply -f https://download.elastic.co/downloads/eck/1.5.0/all-in-one.yaml

위 과정을 하면 k8s 클러스터에 Elastic Operator 파드가 생기고, 다음과 같은 리소스들이 추가된 것을 확인할 수 있다.

Elastic Search Cluster구축

앞서서 배포한 CRD를 이용해서 Elasticsearch를 배포해보자. 공식 Docs에서 제공하는 Yaml 템플릿은 아래와 같다.

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 7.12.0
nodeSets:
- name: default
count: 1
config:
node.store.allow_mmap: false

위 처럼 배포하면 별 문제없이 배포가 된다. 다만, Elastic Search가 디플로이먼트가 아니라 Stateful Set으로 배포되고, 처음에는 파드가 생성되지 않고, 멈춰있을 것이다. 이는 PVC를 확인해보면 볼륨이 바운드되지 않아서 생기는 문제이다.

나는 앞서 사용했던 CephFS를 Default StorageClass로 설정을 해두어서 자동으로 해당 볼륨에서 바운드 되어 다음과 같이 PVC가 할당된다.

3개인 이유는 위 Yaml 에서 count를 3으로 하여 배포하였기 때문에 각 Stateful Set의 파드에 1:1로 연결되는 PVC가 1개씩 생겼다.

#kubectl get elasticsearches.elasticsearch.k8s.elastic.co
#kubectl get statefulsets
#kubectl get po

위 커맨드를 입력하여 보면, Elastic Search Cluster의 상태와 그 클러스터를 이루는 3개의 파드에 상태들을 조회할 수 있다.

Elastic Search Service Check

파드가 정상적으로 배포가 되었으면, 다음으로 Elastic Search 서비스를 확인해 본다. 클러스터가 배포되면, 기본으로 elastic 계정이 생성이 되는데, 다음과 같은 커맨드로 패스워드를 조회하자.

PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}') ; echo $PASSWORD

배포되어있는 Elastic Search 서비스를 조회하여 보면, Cluster IP로 9200포트로 서비스가 올라가있는 것을 확인할 수 있다. 해당 서비스를 NodePort로 변경하거나, 포트포워딩이나 프록시를 해주어 Elastic Search 서비스에 접근을 해보면 다음과 같다. (로드밸런서가 있으면 로드밸런서 타입으로 서비스 재정의 해주면 좋다.)

#kubectl get svcNAME                           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
quickstart-es-http NodePort 10.105.247.40 <none> 9200:30982/TCP 10d
quickstart-es-default ClusterIP None <none> 9200/TCP 10d
quickstart-es-transport ClusterIP None <none> 9300/TCP 10d

30982 노드 포트로 서비스 타입을 바꿨고, 해당 서비스에 접속을 하면 다음과 같다. 접속은 브라우저로 들어가도 되고, Curl을 보내도 된다.

url은 IP와 포트의 조합이고, 계정은 elastic, 패스워드는 위에서 확인한 것을 입력해주면 된다.

{
"name" : "quickstart-es-default-1",
"cluster_name" : "quickstart",
"cluster_uuid" : "rahFLiecRZCU63_H260Ahw",
"version" : {
"number" : "7.12.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "78722783c38caa25a70982b5b042074cde5d3b3a",
"build_date" : "2021-03-18T06:17:15.410153305Z",
"build_snapshot" : false,
"lucene_version" : "8.8.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}

위와 같은 출력을 확인하면 정상적으로 클러스터가 배포된 것이다.

다음으로 Kibana, Beat 배포와 Elastic Search와의 연동은 다음 포스팅에서 이어서 진행하도록 하겠다.

--

--