StatefulSet은 상태를 유지하는(stateful) 애플리케이션을 관리하기 위한 워크로드 리소스입니다. Deployment와 달리 Pod에 안정적인 네트워크 식별자와 영구 스토리지를 제공합니다.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
serviceName: mysql
replicas: 3
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secrets
key: root-password
ports:
- name: mysql
containerPort: 3306
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "standard"
resources:
requests:
storage: 10Gi
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
ports:
- port: 3306
name: mysql
clusterIP: None # 헤드리스 서비스
selector:
app: mysql
StatefulSet의 각 Pod는 다음과 같은 형태의 DNS 이름을 가집니다:
<pod-name>.<service-name>.<namespace>.svc.cluster.local
예: mysql-0.mysql.default.svc.cluster.local
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
partition: 2 # 인덱스 2 이상의 Pod만 업데이트