StatefulSet 프로젝트
Source: Dev.to
Prerequisites
StatefulSet을 사용하려면 다음 구성 요소가 필요합니다:
- Headless Service – 각 pod에 안정적인 DNS를 제공합니다.
- StatefulSet manifest – pod와 그 정체성을 정의합니다.
- PersistentVolume / StorageClass – 일반적으로 클러스터에 이미 존재합니다.
이 요소가 없으면 StatefulSet이 올바르게 동작하지 않습니다.
Headless Service
apiVersion: v1
kind: Service
metadata:
name: mysql-headless
spec:
clusterIP: None # <- makes the service headless
selector:
app: mysql
ports:
- port: 3306
서비스를 적용합니다:
kubectl apply -f service.yaml
왜 중요한가
- 로드 밸런싱이 없으며, 각 pod마다 고유한 DNS 엔트리가 생성됩니다.
- 데이터베이스 및 클러스터링 시나리오에 필수적입니다.
StatefulSet Manifest
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql-headless # MUST match the headless service name
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: root
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 5Gi
StatefulSet을 적용합니다:
kubectl apply -f statefulset.yaml
Verifying the Deployment
Pod 목록을 확인합니다:
kubectl get pods
다음과 같은 결과가 나타납니다:
mysql-0
mysql-1
mysql-2
PersistentVolumeClaim 목록을 확인합니다:
kubectl get pvc
다음과 같은 결과가 나타납니다:
data-mysql-0
data-mysql-1
data-mysql-2
Pod에 접속하기
kubectl exec -it mysql-0 -- bash
Pod 내부에서 DNS 해석을 테스트할 수 있습니다:
ping mysql-1.mysql-headless
ping mysql-2.mysql-headless
각 pod은 자체적인 안정적인 호스트명을 가집니다.
Scaling the StatefulSet
kubectl scale statefulset mysql --replicas=4
무슨 일이 일어나는가
mysql-2뒤에 새로운 podmysql-3이 생성됩니다.- 새로운 PVC
data-mysql-3이 프로비저닝됩니다. - 데이터 손실이 없으며, pod는 안정적인 이름, DNS 및 스토리지를 유지합니다.
- pod는 순차적으로 시작·중지되며, 이는 많은 상태 저장 애플리케이션에 필수적입니다.
Use Cases
StatefulSet은 안정적인 정체성과 영구 스토리지가 필요한 워크로드에 이상적이며, 예시로는 다음과 같습니다:
- MySQL / PostgreSQL
- MongoDB
- Kafka
- ZooKeeper
- Elasticsearch
StatefulSet은 안정적인 정체성, DNS 및 영구 스토리지를 갖는 pod를 생성합니다. 이는 데이터베이스와 같은 상태 저장 워크로드에 필수적입니다.