1. 준비 과정
- 데이터 영속성을 보장하기 위해 영구 볼륨 (PersistentVolume)생성
- ElasticSearch 애플리케이션 배포를 위한 스테이트풀셋 생성
- ElasticSearch 파드를 외부로 노출하기 위한 Service(쿠버네티스의 서비스) 생성
- curlImage로 기본 파드를 띄우고 Elastic Search 의 서비스 확인
2. Statefulset 이용해 ElasticSearch 배포
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: sf-es
namespace: work
spec:
replicas: 2
serviceName: "my-es"
selector:
matchLabels:
app: sf-es
volumeClaimTemplates:
- metadata:
name: vol-es-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: gp3
resources:
requests:
storage: 1Gi
template:
metadata:
labels:
app: sf-es
spec:
containers:
- name: sf-es
image: docker.elastic.co/elasticsearch/elasticsearch:7.8.0
env:
- name: discovery.type
value: "single-node" # Elasticsearch 노드 타입 설정
- name: cluster.name
value: my-es # Elasticsearch 클러스터 이름 설정
- name: network.host
value: 0.0.0.0 # 모든 네트워크 인터페이스에서 수신하도록 설정
ports:
- containerPort: 9200
name: es1 # HTTP 포트
- containerPort: 9300
name: es2 # Transport 포트
volumeMounts:
- name: vol-es-data
mountPath: /usr/share/elasticsearch/data
livenessProbe:
httpGet:
path: /
port: 9200
initialDelaySeconds: 60 # 초기 지연 시간
periodSeconds: 10 # 주기 시간
timeoutSeconds: 5 # 타임아웃 시간
failureThreshold: 3 # 실패 허용 임계값
initContainers:
- name: init-container
image: busybox:latest
command: ["sh","-c","chown -R 1000:1000 /usr/share/elasticsearch/data"]
securityContext:
privileged: true # 루트 권한으로 실행
volumeMounts:
- name: vol-es-data
mountPath: /usr/share/elasticsearch/data # 데이터 볼륨 마운트 경로
---
apiVersion: v1
kind: Service
metadata:
name: svc-es
namespace: work
spec:
clusterIP: None
ports:
- port: 9200
name: es1
- port: 9300
name: es2
selector:
app: sf-es
몇가지 설정에 대한 설명을 추가해보겠습니다.
디플로이먼트와 다르게 VolumeClaimTemplate 속성을 주면서 동적 프로비저닝을 할 수 있구요.
9200,9300 port는 엘라스틱서치가 사용되는 named port 입니다.
livenessProbe 속성값으로 실행된 컨테이너의 서비스 healthcheck 를 파드 차원에서 할 수 있습니다.
서비스 리소스를 생성하면 서비스 이름의 DNS 로 다른 파드에서 접근할 수 있습니다.
아래처럼 statefulset 을 배포하구요.
kubectl 또는 k9s 로 배포 상태를 확인해줍니다.
앞서 설명한 것 처럼 pod 의 이름에 임의의 문자열로 되어있지 않고, 이름과 인덱스로 고유한 이름을 갖고 있습니다.
3. 서비스 확인
별도의 파드를 띄워서 조금 전에 띄운 ElasticSearch 파드가 정상적으로 운영되는지, 접근이 되는지 확인해보겠습니다.
apiVersion: v1
kind: Pod
metadata:
name: pod-conn-test
namespace: work
spec:
containers:
- name: es-conn
image: curlimages/curl
command: ["sleep","3600"]
ElasticSearch는 RestAPI 기반으로 데이터를 핸들링할 수 있기 때문에, 리눅스 curl 이미지를 이용해 아래와 같이 테스트 파드를 띄웠습니다.
해당 파드의 컨테이너에 쉘에 진입해서 서비스 정보를 출력해봤습니다.
여기서 중요한 것은 ElasticSearch 의 DNS 입니다.
제가 만든 서비스의 이름으로 접근이 되는 것을 볼 수 있습니다.
미리 생성했던 인덱스도 조회해봤습니다.
추가적인 API 는 https://www.elastic.co/guide/en/elasticsearch/reference/current/rest-apis.html 에서 확인하실 수 있습니다.
4. 마치며
과거 프로젝트 진행으로 ElasticSearch를 여러 서버에 멀티클러스터링으로 직접 설치해본 경험도 있고, Docker 를 이용해 구축해본 경험도 있습니다. 쿠버네티스를 알게되고 나서 구축의 편의성을 크게 느낍니다..
느낌적으로 앞으로는 데이터엔지니어링의 서비스 배포 및 관리도 쿠버네티스로 많이 넘어갈 것 같아요.
오늘은 여기까지 쓰겠습니다.
끝
'Data Engineer' 카테고리의 다른 글
airflow - Dag Factory (0) | 2025.02.18 |
---|---|
airflow - gitSync 기능 연동 (0) | 2025.02.17 |
쿠버네티스 - 디플로이먼트(deployment)를 이용해 MySQL 배포 (1) | 2024.12.09 |
파이썬 데일리코딩 - 다이나믹 프로그래밍 (0) | 2024.11.25 |
파이썬 데일리코딩 - 덕 타이핑 (1) | 2024.11.17 |