KR_CS_StatefulSet - somaz94/DevOps-Engineer GitHub Wiki
μ§λ¬Έ: StatefulSetκ³Ό Stateless μ ν리μΌμ΄μ μ μ°¨μ΄λ₯Ό μ€λͺ νκ³ , Kubernetesμμ κ°κ°μ λ°°ν¬ λ°©λ²κ³Ό μ€μΌμΌλ§ μ λ΅μ μ€λͺ νμΈμ. Persistent Volume, Headless Service, Pod Identityμ μν μ μ€μ¬μΌλ‘ μ€λͺ νμΈμ.
| μ©μ΄ | μ€λͺ |
|---|---|
| StatefulSet | μνλ₯Ό κ°μ§ μ ν리μΌμ΄μ μ κ΄λ¦¬νλ K8s μ€λΈμ νΈ |
| Stateless Application | λ΄λΆ μνλ₯Ό μ μ§νμ§ μκ³ κ° μμ²μ λ 립 μ²λ¦¬νλ μ ν리μΌμ΄μ |
| Headless Service | ClusterIPκ° NoneμΈ μλΉμ€ β Pod IPλ₯Ό μ§μ λ°ν |
| Ordinal Index | StatefulSet Podμ μμ λ²νΈ (pod-0, pod-1, pod-2) |
| PVC (PersistentVolumeClaim) | Podκ° PVλ₯Ό μμ²νλ μ€λΈμ νΈ |
| volumeClaimTemplates | StatefulSetμμ κ° Podλ§λ€ PVCλ₯Ό μλ μμ±νλ ν νλ¦Ώ |
Stateless (Deployment): Stateful (StatefulSet):
ββββββββ ββββββββ ββββββββ ββββββββββββ ββββββββββββ ββββββββββββ
βPod A β βPod B β βPod C β β mysql-0 β β mysql-1 β β mysql-2 β
β β β β β β β (Master) β β (Slave) β β (Slave) β
ββββββββ ββββββββ ββββββββ β PV-0 β β PV-1 β β PV-2 β
β ββββββββββββ ββββββββββββ ββββββββββββ
Shared Database ββββββββ Replication βββββββ
(External State)
| νλͺ© | Stateless (Deployment) | Stateful (StatefulSet) |
|---|---|---|
| Pod μ΄λ¦ | λλ€ (nginx-abc123) | μμ λ²νΈ (mysql-0, mysql-1) |
| μμ± μμ | λμ μμ± κ°λ₯ | μμ°¨ μμ± (0 β 1 β 2) |
| μμ μμ | λμ μμ κ°λ₯ | μμ μμ (2 β 1 β 0) |
| Network Identity | λΆμμ (Pod IP λ³κ²½) | μμ μ (DNS μ μ§) |
| Storage | 곡μ λλ μμ | κ° Podλ§λ€ PVC |
| Service Type | ClusterIP / LoadBalancer | Headless + ClusterIP |
| μ¬μ© μ¬λ‘ | μΉ μλ², API μλ² | DB, λ©μμ§, λΆμ° μ€ν λ¦¬μ§ |
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"Rolling Update:
-
maxSurge: 1β μ΅λ replica+1κ°κΉμ§ λμ μ€ν νμ© -
maxUnavailable: 0β νμ replica μ μ μ§ (무μ€λ¨)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql-headless # Headless Service νμ
replicas: 3
selector:
matchLabels:
app: mysql
template:
spec:
containers:
- name: mysql
image: mysql:8.0
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates: # Podλ§λ€ PVC μλ μμ±
- metadata:
name: mysql-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: gp3
resources:
requests:
storage: 10GiclusterIP: None μΌλ‘ μ€μ νλ©΄ VIP μμ΄ Pod IPλ₯Ό μ§μ λ°ν.
apiVersion: v1
kind: Service
metadata:
name: mysql-headless
spec:
clusterIP: None
selector:
app: mysql
ports:
- port: 3306DNS μ‘°ν κ²°κ³Ό:
mysql-headless β 10.244.1.10 (mysql-0)
β 10.244.2.20 (mysql-1)
β 10.244.3.30 (mysql-2)
κ°λ³ Pod DNS:
mysql-0.mysql-headless.default.svc.cluster.local β 10.244.1.10
mysql-1.mysql-headless.default.svc.cluster.local β 10.244.2.20
Pod μ¬μμ νμλ DNS μ΄λ¦ μ μ§ β Master/Slave μ§μ μ§μ κ°λ₯.
- StatefulSet μμ μ PVCλ μμ λμ§ μμ (λ°μ΄ν° 보쑴)
- Pod μ¬μμ± μ κΈ°μ‘΄ PVC μ¬μ¬μ©
- PVC μλ μμ νμ:
kubectl delete pvc mysql-data-mysql-0
λ³Όλ₯¨ νμ₯ (StorageClassμμ allowVolumeExpansion: true νμ):
kubectl patch pvc mysql-data-mysql-0 \
-p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'| μ λ΅ | λμ |
|---|---|
| RollingUpdate (κΈ°λ³Έ) | μμμΌλ‘ μμ°¨ μ λ°μ΄νΈ (mysql-2 β mysql-1 β mysql-0) |
| OnDelete | μλ μ λ°μ΄νΈ μμ, Pod μλ μμ μ μ λ²μ μΌλ‘ μ¬μμ± |
| Parallel | λͺ¨λ Pod λμ μμ±/μμ (μμ 보μ₯ λΆνμν κ²½μ°) |