kind로 Elasticsearch 3노드 클러스터 구성
kind cluster
├─ elasticsearch-0
├─ elasticsearch-1
└─ elasticsearch-2
1. Headless Service 생성
apiVersion: v1
kind: Service
metadata:
name: elasticsearch
spec:
clusterIP: None
selector:
app: elasticsearch
ports:
- name: http
port: 9200
Headless Service는 Pod별 DNS를 생성해줍니다. StatefulSet과 함께 엘라스틱서치 노드 간 통신에 필요합니다.
2. StatefulSet 설정
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch
spec:
replicas: 3
serviceName: elasticsearch
selector:
matchLabels:
app: elasticsearch
template:
spec:
containers:
- name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:8.13.0
env:
- name: discovery.seed_hosts
value: "elasticsearch-0.elasticsearch,elasticsearch-1.elasticsearch,elasticsearch-2.elasticsearch"
- name: cluster.initial_master_nodes
value: "elasticsearch-0,elasticsearch-1,elasticsearch-2"
최초 마스터 노드 후보 값과 Headless Service 이름이 맞아야 한다는 것입니다.
※ 상태 확인
kubectl get pods
kubectl port-forward svc/elasticsearch 9200:9200
curl http://localhost:9200/_cluster/health?pretty
Python으로 Elasticsearch에 데이터 적재하기
from elasticsearch import Elasticsearch, helpers
from datetime import datetime
import uuid
es = Elasticsearch("http://localhost:9200")
index_name = "logs-test"
if not es.indices.exists(index=index_name):
es.indices.create(index=index_name)
docs = []
for i in range(10):
docs.append({
"_index": index_name,
"_id": str(uuid.uuid4()),
"_source": {
"message": f"hello elasticsearch {i}",
"timestamp": datetime.utcnow().isoformat()
}
})
helpers.bulk(es, docs)
print("데이터 적재 완료")
python python_app_name.py
🧠 마무리 요약
오늘 정리한 내용을 간단히 요약하면 아래와 같습니다.
- 쿠버네티스는 컨테이너 운영 자동화를 위해 등장한 표준 플랫폼이다.
- Pod는 언제든 죽고 다시 생성될 수 있기 때문에 Service로 접근해야 한다.
- Deployment vs StatefulSet은 상태 저장 여부에 따라 선택한다.
- kind는 Docker 기반으로 로컬에서 Kubernetes 클러스터를 띄울 수 있는 훌륭한 도구다.
- Elasticsearch 같은 상태 저장 시스템은 StatefulSet + Headless Service 구조로 운영해야 한다.
'데이터 엔지니어 > Docker & K8s' 카테고리의 다른 글
| [쿠버네티스] 간단한 개념부터 Kind 실습 (1/2) (0) | 2025.12.12 |
|---|---|
| [docker] ubuntu에서 docker 실행 불가 에러 (0) | 2023.04.11 |


