최근에는 많은 회사들이 Elastic Stack으로 데이터 파이프라인을 구축하여 다양한 분야에서 활용한다.
https://ssnotebook.tistory.com/entry/ELK-Elasticsearch
여기서 필수적으로 이용이 되는 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를 이용하는 포트를 각각 서비스 포트로 매핑
파드의 실행을 확인했다면 하위 컨테이너 내부 명령어를 이용하여 정상적으로 동작하는지 확인할 수 있다.
# 컨테이너 내부에서 서버에 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을 통하여 어플리케이션의 로그를 엘라스틱서치에 적재하고 키바나를 통하여 확인하는 작업을 해볼 것이다.
'Observability > Logs' 카테고리의 다른 글
[Elastic APM] APM Index 날짜 별 관리 (0) | 2024.06.04 |
---|---|
[ELK/EFK] 로그 수집 - Filebeat / Logstash / Fluentd / Fluent-bit (0) | 2024.03.20 |
[ELK] Elasticsearch (0) | 2024.01.14 |
[Fluent-Bit] Too many open files (0) | 2023.11.30 |
[ELK] Logstash - Postgresql 연결 실패 (Docker Network) (0) | 2023.02.24 |