본문 바로가기
Observability/Logs

[ELK] Kubernetes 환경에서 Elasticsearch / Kibana 설치

by dev_ss 2024. 2. 21.

최근에는 많은 회사들이 Elastic Stack으로 데이터 파이프라인을 구축하여 다양한 분야에서 활용한다.

 

https://ssnotebook.tistory.com/entry/ELK-Elasticsearch

 

[ELK] Elasticsearch

1. 엘라스틱 서치(Elasticsearch) : 아파치 루씬(Apache Lucene)을 기반으로 Java로 개발된 엘라스틱 서치는 분산형 RESTful 검색 및 분석 엔진으로 Elastic 재단에서 개발한 엘라스틱 스택(Elastic Stack)의 핵심적

ssnotebook.tistory.com

 

여기서 필수적으로 이용이 되는 Elasticsearch(데이터 저장) / Kibana(시각화 대시보드)를 쿠버네티스 Pod 환경에서 이미지 기반으로 구동하는 예시를 알아볼 것이다.

 

1. Elasticsearch

 

ELK Stack에서는 저장소 역할을 하는 엘라스틱서치의 설치가 선행된다.

 

Elastic 사의 타 플랫폼들은 대부분 엘라스틱서치에 종속적이고, 초기 실행이 되었을 때

엘라스틱서치와 통신을 체크하기 때문에 엘라스틱 서치가 없다면 에러를 발생한다.

 

엘라스틱서치는 멀티 노드를 기반으로 고가용성을 위하여 클러스터 구축도 가능 하지만,

해당 글에는 단일 노드로 구축할 것이다.

 

# 엘라스틱서치 yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
  labels:
    app: elasticsearch
spec:
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: elastic/elasticsearch:7.17.2
        env:
        - name: discovery.type
          value: single-node
        - name: ELASTIC_PASSWORD
          value: "elasticstack"
        - name: xpack.security.enabled
          value: "true"
        - name: xpack.security.transport.ssl.enabled
          value: "true"
        - name: ES_JAVA_OPTS
          value: "-Xms500m -Xmx1000m"
        ports:
        - containerPort: 9200
        - containerPort: 9300
        volumeMounts:
        - name: elastic-data
          mountPath: /usr/share/elasticsearch/data
      volumes:
      - name: elastic-data
        emptyDir:
          sizeLimit: 5Gi
---
# Kibana 또는 타 플랫폼에서 사용할 서비스

apiVersion: v1
kind: Service
metadata:
  labels:
    app: elasticsearch
  name: elasticsearch-master
spec:
  ports:
  - name: elasticsearch
    port: 9200
    protocol: TCP
    targetPort: 9200
  - name: elisticsearch-ssl
    port: 9300
    protocol: TCP
    targetPort: 9300
  selector:
    app: elasticsearch
  type: ClusterIP

 

위 예시로 쿠버네티스 환경에서 엘라스틱서치(7.17.2 버전)의 Statefulset과 서비스를 생성한다.

 

아래는 간략한 yaml의 설명이다.

  • Default User : elastic
  • 설정한 Password : elasticstack
  • ES_JAVA_OPTS : JVM Memory 설정
  • 엘라스틱서치 내 데이터에 영속성을 부여 :  volumeMounts와 volumes을 수정(emptyDir 부분)
  • HTTP/HTTPS를 이용하는 포트를 각각 서비스 포트로 매핑

 

[엘라스틱서치 Statefulset 생성 후 상태]

 

 

 

파드의 실행을 확인했다면 하위 컨테이너 내부 명령어를 이용하여 정상적으로 동작하는지 확인할 수 있다.

# 컨테이너 내부에서 서버에 GET 요청을 수행
kubectl exec -it elasticsearch-0 -- curl localhost:9200 --user elastic:elasticstack

 

 

아래는 파드가 정상적으로 실행되었을 때의 응답이다.

[설치 완료됐을 때 응답 사진]

 

데이터 저장소를 설치하였다면, 다음으로 시각화 대시보드인 Kibana의 Pod를 Statefulset을 통하여 생성할 것이다.

 


2. Kibana

 

키바나는 엘라스틱 서치에 저장된 데이터를 시각화하여 사용자에게 Log, Metric 등의 수집된 데이터를 수월하게 확인할 수 있게 해주는 플랫폼이다.

 

아래 yaml을 통하여 기 생성된 엘라스틱 서치를 이용하는 키바나의 Statefulset을 생성할 수 있다.

# 키바나 yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: kibana
  labels:
    app: kibana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kibana
  template:
    metadata:
      labels:
        app: kibana
    spec:
      containers:
      - name: kibana
        image: elastic/kibana:7.17.2
        env:
        - name: ELASTICSEARCH_HOSTS
          value: "http://elasticsearch-master:9200"
        - name: discovery.type
          value: single-node
        - name: ELASTICSEARCH_USERNAME
          value: "elastic"
        - name: ELASTICSEARCH_PASSWORD
          value: "elasticstack"
        ports:
        - containerPort: 5601
---
# 외부 접속용 NodePort

apiVersion: v1
kind: Service
metadata:
  labels:
    app: kibana
  name: kibana
spec:
  ports:
  - name: kibana
    nodePort: 30000
    port: 5601
    protocol: TCP
    targetPort: 5601
  selector:
    app: kibana
  type: NodePort

 

 

위 yaml을 이용하여 정상적으로 Statefulset을 생성하고, 조금 기다리면 아래와 같은 결과를 볼 수 있다.

 

[키바나 정상 실행 상태]

 

Pod가 정상으로 생성된 것을 확인하고, 생성한 노드 포트 서비스로 접속하면 아래와 같이 로그인 창이 나온다.

(엘라스틱서치의 Xpack에서 security를 활성화하여 로그인 기능을 이용하였음)

 

 

여기서 기존의 엘라스틱서치를 생성하며 이용했던

 

Username : elastic

Password : elasticstack

 

을 입력하여 로그인을 성공하고, Explore on my own을 택하면, 키바나를 정상적으로 실행하고

엘라스틱 서치와 연동에 성공한 것이다.

 

[로그인 후 키바나 홈페이지]

 

이와 같은 작업을 통하여 엘라스틱서치와 키바나를 yaml을 이용해서 손쉽게 파드를 생성하고 연동시키는 작업을 해보았다.

 

다음은 추가로 Fluent-Bit을 통하여 어플리케이션의 로그를 엘라스틱서치에 적재하고 키바나를 통하여 확인하는 작업을 해볼 것이다.

 

 

 

반응형