Ver3.0 ๐ ์ฟ ๋ฒ๋คํฐ์ค Deployment์ StatefulSet, ๋ญ๊ฐ ๋ค๋ฅผ๊น? ์๋ฒฝ ๋น๊ต ๊ฐ์ด๋

๐ ์ฟ ๋ฒ๋คํฐ์ค Deployment์ StatefulSet, ๋ญ๊ฐ ๋ค๋ฅผ๊น? ์๋ฒฝ ๋น๊ต ๊ฐ์ด๋
์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ์ ํต์ฌ ๊ฐ๋ ์ ์น๊ตฌ์ฒ๋ผ ์ฝ๊ฒ ํ์ด๋๋ฆฝ๋๋ค!
๐ ์๋
! ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ๊ณต๋ถํ๋ค ๋ณด๋ฉด Deployment์ StatefulSet์ด๋ผ๋ ์ฉ์ด๋ฅผ ์์ฃผ ๋ง๋๊ฒ ๋๋๋ฐ, ์ฒ์์ "๋ ๋ค ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌํ๋ ๊ฑฐ ์๋?"๋ผ๊ณ ์๊ฐํ๊ธฐ ์ฌ์. ๋ง์, ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋ ๋ค ์ปจํ
์ด๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ด๋ฆฌํ๋ ๋๊ตฌ์ผ. ํ์ง๋ง ๊ฐ์์ ํน์ฑ๊ณผ ์ฌ์ฉ ๋ชฉ์ ์ด ์์ ํ ๋ค๋ฅด๊ฑฐ๋ !
๐ฏ ์ด ๊ธ์์๋ Deployment์ StatefulSet์ ์ฐจ์ด์ ์ ์ค๋ฌด ๊ด์ ์์ ๊น์ด ์๊ฒ ํํค์ณ๋ณผ ๊ฑฐ์ผ. ๋จ์ํ ๊ฐ๋
๋ง ์ค๋ช
ํ๋ ๊ฒ ์๋๋ผ, ์ธ์ ์ด๋ค ๊ฑธ ์จ์ผ ํ๋์ง, ์ค์ ํ๋ก์ ํธ์์ ์ด๋ป๊ฒ ํ์ฉํ๋์ง๊น์ง ์น๊ตฌ์๊ฒ ์ค๋ช
ํ๋ฏ ์ฌ๋ฏธ์๊ฒ ์๋ ค์ค๊ฒ!
๐ก ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ํ๊ฒฝ์์ DevOps๋ฅผ ์ค์ฒํ๊ณ ์๋ค๋ฉด, ์ด ๋ ๊ฐ์ง ๋ฆฌ์์ค์ ์ฐจ์ด๋ฅผ ์ ํํ ์ดํดํ๋ ๊ฑด ์ ๋ง ์ค์ํด. ์๋ชป ์ ํํ๋ฉด ๋์ค์ ํฐ ๋ฌธ์ ๊ฐ ์๊ธธ ์๋ ์๊ฑฐ๋ !
๐ ์ฟ ๋ฒ๋คํฐ์ค ์ํฌ๋ก๋ ์ปจํธ๋กค๋ฌ๋?
๋ณธ๊ฒฉ์ ์ผ๋ก Deployment์ StatefulSet์ ๋น๊ตํ๊ธฐ ์ ์, ๋จผ์ ์ฟ ๋ฒ๋คํฐ์ค์ ์ํฌ๋ก๋ ์ปจํธ๋กค๋ฌ๊ฐ ๋ญ์ง ๊ฐ๋จํ ์ง๊ณ ๋์ด๊ฐ์!
์ํฌ๋ก๋ ์ปจํธ๋กค๋ฌ(Workload Controller)๋ ์ฟ ๋ฒ๋คํฐ์ค์์ Pod๋ค์ ๊ด๋ฆฌํ๋ ์์ ๋ ๋ฒจ์ ์ถ์ํ ๊ฐ์ฒด์ผ. Pod๋ฅผ ์ง์ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๋์ , ์ด๋ฐ ์ปจํธ๋กค๋ฌ๋ค์ ์ฌ์ฉํ๋ฉด ์๋์ผ๋ก Pod์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํด์ค์ ํจ์ฌ ํธ๋ฆฌํ์ง.
๋ํ์ ์ธ ์ํฌ๋ก๋ ์ปจํธ๋กค๋ฌ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ์์ด:
๐น Deployment - ๋ฌด์ํ(Stateless) ์ ํ๋ฆฌ์ผ์ด์ ๊ด๋ฆฌ
๐น StatefulSet - ์ํ์ ์ง(Stateful) ์ ํ๋ฆฌ์ผ์ด์ ๊ด๋ฆฌ
๐น DaemonSet - ๋ชจ๋ ๋ ธ๋์ Pod ๋ฐฐํฌ
๐น Job/CronJob - ๋ฐฐ์น ์์ ์คํ
๐น ReplicaSet - Pod ๋ณต์ ๋ณธ ๊ด๋ฆฌ (๋ณดํต Deployment๊ฐ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉ)
์ด ์ค์์ ์ค๋ ์ฐ๋ฆฌ๊ฐ ์ง์ค์ ์ผ๋ก ๋ณผ ๊ฑด Deployment์ StatefulSet์ด์ผ. ์ด ๋์ ์ค๋ฌด์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ปจํธ๋กค๋ฌ์ด๋ฉด์๋, ์ ํ์ ์๋ชปํ๋ฉด ํฐ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ ์ค์ํ ๋ ์๋ค์ด๊ฑฐ๋ !
๐ฏ Deployment: ๋ฌด์ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์
Deployment๋ ์ฟ ๋ฒ๋คํฐ์ค์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ํฌ๋ก๋ ์ปจํธ๋กค๋ฌ์ผ. ์น ์๋ฒ, API ์๋ฒ, ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ฒ๋ผ ์ํ๋ฅผ ์ ์ฅํ์ง ์๋(Stateless) ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ ๋ ์ฌ์ฉํด.
Deployment์ ํต์ฌ ์ฒ ํ์ ๊ฐ๋จํด: "๋ชจ๋ Pod๋ ๋์ผํ๊ณ ๊ต์ฒด ๊ฐ๋ฅํ๋ค"๋ ๊ฑฐ์ผ. ๋ง์น ๊ณต์ฅ์์ ์ฐ์ด๋ธ ๋๊ฐ์ ์ ํ๋ค์ฒ๋ผ, ์ด๋ค Pod๊ฐ ์ฃฝ์ด๋ ์๋ก์ด Pod๋ก ๋ฐ๋ก ๋์ฒดํ ์ ์์ง.
โจ Deployment์ ์ฃผ์ ํน์ง
1. Pod์ ๋์ผ์ฑ (Identical Pods) ๋ชจ๋ Pod๋ ์์ ํ ๋์ผํ ์คํ์ผ๋ก ์์ฑ๋ผ. Pod-1์ด๋ Pod-2๋ ๊ธฐ๋ฅ์ ์ผ๋ก ์ฐจ์ด๊ฐ ์์ด. ๊ทธ๋์ ๋ก๋๋ฐธ๋ฐ์๊ฐ ์ด๋ Pod๋ก ํธ๋ํฝ์ ๋ณด๋ด๋ ์๊ด์์ง.
2. ๋ฌด์์ ๋คํธ์ํฌ ์๋ณ์
Pod ์ด๋ฆ์ด nginx-deployment-7d8f9c6b5-x7k2m ๊ฐ์ ํํ๋ก ์์ฑ๋ผ. ๋ค์ ๋ถ๋ ํด์๊ฐ์ ๋ฌด์์์ผ. Pod๊ฐ ์ฌ์์๋๋ฉด ์ด๋ฆ๋ ๋ฐ๋์ด.
3. ์๊ตฌ ์คํ ๋ฆฌ์ง ๋ถํ์
๊ธฐ๋ณธ์ ์ผ๋ก Pod๊ฐ ์ญ์ ๋๋ฉด ๋ฐ์ดํฐ๋ ํจ๊ป ์ฌ๋ผ์ ธ. ๋ฌผ๋ก PersistentVolume์ ์ฐ๊ฒฐํ ์๋ ์์ง๋ง, ๋ชจ๋ Pod๊ฐ ๊ฐ์ ๋ณผ๋ฅจ์ ๊ณต์ ํ๊ฒ ๋ผ.
4. ๋น ๋ฅธ ์ค์ผ์ผ๋ง
Pod๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ด๋ ๊ฒ ๋งค์ฐ ๋น ๋ฅด๊ณ ๊ฐ๋จํด. ์์๋ ์๊ด์๊ณ , ๋์์ ์ฌ๋ฌ ๊ฐ๋ฅผ ์์ฑ/์ญ์ ํ ์ ์์ด.
5. ๋กค๋ง ์
๋ฐ์ดํธ ์ง์
์ ๋ฒ์ ์ ๋ฐฐํฌํ ๋ ๋ฌด์ค๋จ์ผ๋ก ์ ์ง์ ์ผ๋ก ๊ต์ฒดํ ์ ์์ด. ์ด๊ฒ Deployment์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ์ค ํ๋์ผ!
๐ป Deployment ์ค์ ์์
๊ฐ๋จํ Nginx ์น ์๋ฒ๋ฅผ Deployment๋ก ๋ฐฐํฌํ๋ ์์ ๋ฅผ ๋ณผ๊น?
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
์ด YAML ํ์ผ์ ์ ์ฉํ๋ฉด ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์๋์ผ๋ก 3๊ฐ์ Nginx Pod๋ฅผ ์์ฑํด์ค. ๊ฐ Pod๋ ์์ ํ ๋์ผํ๊ณ , ํ๋๊ฐ ์ฃฝ์ผ๋ฉด ์๋์ผ๋ก ์๋ก์ด Pod๋ฅผ ๋ง๋ค์ด์ 3๊ฐ๋ฅผ ์ ์งํด.
์ค์ผ์ผ๋ง๋ ์์ฒญ ๊ฐ๋จํด:
kubectl scale deployment nginx-deployment --replicas=5
์ด ๋ช ๋ น์ด ํ๋๋ก Pod ๊ฐ์๋ฅผ 3๊ฐ์์ 5๊ฐ๋ก ๋๋ฆด ์ ์์ด. ๋ฐ๋๋ก ์ค์ด๋ ๊ฒ๋ ๋ง์ฐฌ๊ฐ์ง๊ณ !
๐ก ์ค๋ฌด ํ: Deployment๋ HPA(Horizontal Pod Autoscaler)์ ํจ๊ป ์ฌ์ฉํ๋ฉด CPU๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ฐ๋ผ ์๋์ผ๋ก Pod ๊ฐ์๋ฅผ ์กฐ์ ํ ์ ์์ด. ํธ๋ํฝ์ด ๋ง์ ๋ ์๋์ผ๋ก ์ค์ผ์ผ ์์๋๊ณ , ์ ์ ๋๋ ์ค์ผ์ผ ์ธ๋๋ ๊ฑฐ์ง. ํด๋ผ์ฐ๋ ๋น์ฉ ์ ๊ฐ์๋ ํฐ ๋์์ด ๋ผ!
๐ ๋กค๋ง ์ ๋ฐ์ดํธ์ ๋ง๋ฒ
Deployment์ ์ง์ง ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋กค๋ง ์
๋ฐ์ดํธ(Rolling Update)์ผ. ์ ๋ฒ์ ์ ๋ฐฐํฌํ ๋ ์๋น์ค ์ค๋จ ์์ด ์ ์ง์ ์ผ๋ก ๊ต์ฒดํ ์ ์๊ฑฐ๋ .
์๋ฅผ ๋ค์ด, Nginx ๋ฒ์ ์ 1.21์์ 1.22๋ก ์
๋ฐ์ดํธํ๊ณ ์ถ๋ค๋ฉด:
kubectl set image deployment/nginx-deployment nginx=nginx:1.22
์ด ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ ๋ฐ์ดํธ๋ฅผ ์งํํด:
1. ์ ๋ฒ์ (1.22)์ Pod๋ฅผ ํ๋ ์์ฑ
2. ์ Pod๊ฐ ์ ์ ๋์ํ๋์ง ํ์ธ (Health Check)
3. ํ์ธ๋๋ฉด ๊ธฐ์กด ๋ฒ์ (1.21) Pod ํ๋๋ฅผ ์ข
๋ฃ
4. ์ด ๊ณผ์ ์ ๋ชจ๋ Pod๊ฐ ๊ต์ฒด๋ ๋๊น์ง ๋ฐ๋ณต
์ด ๊ณผ์ ์์ ํญ์ ์ต์ํ์ Pod๊ฐ ์คํ ์ค์ด๊ธฐ ๋๋ฌธ์ ์๋น์ค๊ฐ ์ค๋จ๋์ง ์์. ๋ง์ฝ ์ ๋ฒ์ ์ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด? ๊ฑฑ์ ๋ง! ๋กค๋ฐฑ๋ ํ ์ค์ด๋ฉด ๋ผ:
kubectl rollout undo deployment/nginx-deployment
์ด์ ๋ฒ์ ์ผ๋ก ์ฆ์ ๋๋๋ฆด ์ ์์ด. ์ด๊ฒ ๋ฐ๋ก Deployment๊ฐ CI/CD ํ์ดํ๋ผ์ธ์์ ์ฌ๋๋ฐ๋ ์ด์ ์ผ!
๐๏ธ StatefulSet: ์ํ์ ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฌธ๊ฐ
์, ์ด์ StatefulSet์ ์์๋ณผ ์ฐจ๋ก์ผ. StatefulSet์ ์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์ํ๋ฅผ ์ ์งํด์ผ ํ๋(Stateful) ์ ํ๋ฆฌ์ผ์ด์
์ ์ํด ์ค๊ณ๋์ด.
๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ฉ์์ง ํ, ๋ถ์ฐ ์คํ ๋ฆฌ์ง ์์คํ
์ฒ๋ผ ๊ฐ ์ธ์คํด์ค๊ฐ ๊ณ ์ ํ ์ ์ฒด์ฑ๊ณผ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ผ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ์ง. Deployment์๋ ์์ ํ ๋ค๋ฅธ ์ฒ ํ์ ๊ฐ์ง๊ณ ์์ด: "๊ฐ Pod๋ ๊ณ ์ ํ๊ณ ๋์ฒด ๋ถ๊ฐ๋ฅํ๋ค"๋ ๊ฑฐ์ผ.
โจ StatefulSet์ ์ฃผ์ ํน์ง
1. ์์ ์ ์ธ ๋คํธ์ํฌ ์๋ณ์ Pod ์ด๋ฆ์ด mysql-0, mysql-1, mysql-2 ๊ฐ์ ํํ๋ก ์์ฑ๋ผ. ์์๋๋ก ๋ฒํธ๊ฐ ๋งค๊ฒจ์ง๊ณ , Pod๊ฐ ์ฌ์์๋์ด๋ ๊ฐ์ ์ด๋ฆ์ ์ ์งํด.
2. ์์ ์ ์ธ ์คํ ๋ฆฌ์ง
๊ฐ Pod๋ง๋ค ๋
๋ฆฝ์ ์ธ PersistentVolumeClaim(PVC)์ด ์๋์ผ๋ก ์์ฑ๋ผ. Pod๊ฐ ์ฌ์์๋์ด๋ ๊ฐ์ ๋ณผ๋ฅจ์ ๋ค์ ์ฐ๊ฒฐ๋์ด์ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋ผ.
3. ์์ฐจ์ ๋ฐฐํฌ ๋ฐ ์ข
๋ฃ
Pod๊ฐ 0๋ฒ๋ถํฐ ์์๋๋ก ์์ฑ๋๊ณ , ์ญ์ ํ ๋๋ ์ญ์์ผ๋ก ์งํ๋ผ. ์ด์ Pod๊ฐ ์์ ํ ์ค๋น๋ ๋๊น์ง ๋ค์ Pod๋ฅผ ์์ฑํ์ง ์์.
4. ์์ ์ ์ธ DNS ์ด๋ฆ
Headless Service์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๊ฐ Pod๊ฐ mysql-0.mysql-service.default.svc.cluster.local ๊ฐ์ ๊ณ ์ ํ DNS ์ด๋ฆ์ ๊ฐ์ ธ.
5. ์์ ๋ณด์ฅ
์ค์ผ์ผ๋ง์ด๋ ์
๋ฐ์ดํธ ์์๋ ์์๊ฐ ๋ณด์ฅ๋ผ. ์ด๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฌ์คํฐ ๊ฐ์ ์์คํ
์์ ๋งค์ฐ ์ค์ํด!
๐ป StatefulSet ์ค์ ์์
MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ StatefulSet์ผ๋ก ๋ฐฐํฌํ๋ ์์ ๋ฅผ ๋ณผ๊น?
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
clusterIP: None # Headless Service
selector:
app: mysql
ports:
- port: 3306
name: mysql
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql-service
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: "password123"
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
์ด ์ค์ ์ ์ ์ฉํ๋ฉด ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๋์ํด:
1. mysql-0 Pod์ mysql-data-mysql-0 PVC ์์ฑ
2. mysql-0์ด ์์ ํ ์ค๋น๋๋ฉด mysql-1 ์์ฑ
3. mysql-1์ด ์ค๋น๋๋ฉด mysql-2 ์์ฑ
4. ๊ฐ Pod๋ ๋
๋ฆฝ์ ์ธ 10GB ์คํ ๋ฆฌ์ง๋ฅผ ๊ฐ์ง
5. Pod๊ฐ ์ฌ์์๋์ด๋ ๊ฐ์ PVC์ ๋ค์ ์ฐ๊ฒฐ๋จ
์ด๋ ๊ฒ ํ๋ฉด ๊ฐ MySQL ์ธ์คํด์ค๊ฐ ์์ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๋ณด๊ดํ ์ ์์ด. Pod๊ฐ ์ฃฝ์ด์ ๋ค์ ์์๋์ด๋ ๋ฐ์ดํฐ๋ ๊ทธ๋๋ก ๋จ์์์ง!
โ ๏ธ ์ฃผ์์ฌํญ: StatefulSet์ PVC๋ ์๋์ผ๋ก ์ญ์ ๋์ง ์์. StatefulSet์ ์ญ์ ํด๋ PVC์ PV๋ ๋จ์์์ด์ ๋ฐ์ดํฐ๊ฐ ๋ณด์กด๋ผ. ์ด๊ฑด ์์ ์ฅ์น์ด๊ธฐ๋ ํ์ง๋ง, ์์ ํ ์ญ์ ํ๋ ค๋ฉด PVC๋ ์๋์ผ๋ก ์ง์์ผ ํ๋ค๋ ๊ฑธ ๊ธฐ์ตํด!
๐ Headless Service์์ ์กฐํฉ
StatefulSet์ ์ง์ง ํ์๋ Headless Service์ ํจ๊ป ์ฌ์ฉํ ๋ ๋ํ๋. Headless Service๋ clusterIP: None์ผ๋ก ์ค์ ๋ ์๋น์ค์ธ๋ฐ, ์ด๊ฑธ ์ฌ์ฉํ๋ฉด ๊ฐ Pod๊ฐ ๊ณ ์ ํ DNS ์ด๋ฆ์ ๊ฐ์ง๊ฒ ๋ผ.
์๋ฅผ ๋ค์ด, ์์ MySQL StatefulSet์์:
โข mysql-0.mysql-service.default.svc.cluster.local
โข mysql-1.mysql-service.default.svc.cluster.local
โข mysql-2.mysql-service.default.svc.cluster.local
์ด๋ ๊ฒ ๊ฐ Pod์ ์ง์ ์ ๊ทผํ ์ ์์ด. ์ด๊ฒ ์ ์ค์ํ๋๋ฉด, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณต์ ์ค์ ๊ฐ์ ๊ฑธ ํ ๋ ํน์ Pod๋ฅผ ์ง์ ํด์ ์ฐ๊ฒฐํด์ผ ํ๊ฑฐ๋ . Master-Slave ๊ตฌ์กฐ์์ Master์๋ง ์ฐ๊ธฐ๋ฅผ ํ๊ณ Slave์์ ์ฝ๊ธฐ๋ฅผ ํ๋ ์์ผ๋ก ๋ง์ด์ผ.
โ๏ธ Deployment vs StatefulSet: ํต์ฌ ์ฐจ์ด์ ๋น๊ต
์, ์ด์ ๋ ์ปจํธ๋กค๋ฌ์ ์ฐจ์ด๋ฅผ ๋ช ํํ๊ฒ ์ ๋ฆฌํด๋ณด์! ํ๋ก ํ๋์ ๋น๊ตํด๋ณผ๊ฒ.
| ๋น๊ต ํญ๋ชฉ | Deployment | StatefulSet |
|---|---|---|
| Pod ์ ์ฒด์ฑ | ๋์ผํ๊ณ ๊ต์ฒด ๊ฐ๋ฅ | ๊ณ ์ ํ๊ณ ๋์ฒด ๋ถ๊ฐ๋ฅ |
| Pod ์ด๋ฆ | ๋ฌด์์ ํด์ (์: app-7d8f9c-x7k2m) | ์์ฐจ์ ๋ฒํธ (์: app-0, app-1) |
| ๋คํธ์ํฌ ์๋ณ์ | ๋ถ์์ (์ฌ์์ ์ ๋ณ๊ฒฝ) | ์์ ์ (์ฌ์์ ํ์๋ ์ ์ง) |
| ์คํ ๋ฆฌ์ง | ๊ณต์ ๋๋ ์์ | ๊ฐ Pod๋ง๋ค ๋ ๋ฆฝ์ PVC |
| ๋ฐฐํฌ ์์ | ์์ ์์ (๋ณ๋ ฌ ์์ฑ) | ์์ฐจ์ (0โ1โ2...) |
| ์ข ๋ฃ ์์ | ์์ ์์ (๋ณ๋ ฌ ์ข ๋ฃ) | ์ญ์ (...โ2โ1โ0) |
| ์ค์ผ์ผ๋ง ์๋ | ๋น ๋ฆ | ๋๋ฆผ (์์ฐจ์ ) |
| ์ ๋ฐ์ดํธ ์ ๋ต | RollingUpdate, Recreate | RollingUpdate, OnDelete |
| DNS ์ด๋ฆ | Service ๋ ๋ฒจ๋ง | ๊ฐ Pod๋ง๋ค ๊ณ ์ DNS |
| ์ฌ์ฉ ์ฌ๋ก | ์น ์๋ฒ, API, ํ๋ก ํธ์๋ | ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ฉ์์ง ํ, ๋ถ์ฐ ์์คํ |
๐ญ ์ํ(State)์ ์๋ฏธ
์ฌ๊ธฐ์ ์ ๊น! "์ํ๊ฐ ์๋ค/์๋ค"๋ ๊ฒ ์ ํํ ๋ฌด์จ ๋ป์ผ๊น? ์ด๊ฒ ์ข ํท๊ฐ๋ฆด ์ ์์ด์ ๋ช
ํํ ์ง๊ณ ๋์ด๊ฐ์.
Stateless (๋ฌด์ํ)๋:
โข ์์ฒญ์ ์ฒ๋ฆฌํ ๋ ์ด์ ์์ฒญ์ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ์ง ์์
โข ์ด๋ค ์ธ์คํด์ค๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํด๋ ๊ฒฐ๊ณผ๊ฐ ๋์ผ
โข ์ธ์คํด์ค ๊ฐ์ ๋ฐ์ดํฐ ๋๊ธฐํ๊ฐ ํ์ ์์
โข ์: ์ ์ ์น ์๋ฒ, REST API ์๋ฒ, ํ๋ก ํธ์๋ ์ฑ
Stateful (์ํ์ ์ง)๋:
โข ๊ฐ ์ธ์คํด์ค๊ฐ ๊ณ ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌ
โข ํน์ ์ธ์คํด์ค์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ๋ค๋ฅธ ๊ณณ์ ์์ ์ ์์
โข ์ธ์คํด์ค ๊ฐ์ ๋ฐ์ดํฐ ๋๊ธฐํ๋ ๋ณต์ ๊ฐ ํ์
โข ์: ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ฉ์์ง ํ, ๋ถ์ฐ ์บ์, ํ์ผ ์์คํ
๐ก ์ค๋ฌด ์์: Netflix ๊ฐ์ ์คํธ๋ฆฌ๋ฐ ์๋น์ค๋ฅผ ์๊ฐํด๋ด. ๋น๋์ค๋ฅผ ์ฌ์ํ๋ ์น ์๋ฒ๋ Stateless์ผ. ์ด๋ค ์๋ฒ๊ฐ ์์ฒญ์ ๋ฐ๋ ๊ฐ์ ๋น๋์ค๋ฅผ ์คํธ๋ฆฌ๋ฐํด์ฃผ๋ฉด ๋๊ฑฐ๋ . ํ์ง๋ง ์ฌ์ฉ์์ ์์ฒญ ๊ธฐ๋ก์ ์ ์ฅํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ Stateful์ด์ผ. ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ธ๋๊ฐ ํน์ ์ฌ์ฉ์๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋ด๋นํ๊ณ ์์ผ๋๊น!
๐ค ์ธ์ ๋ฌด์์ ์ฌ์ฉํด์ผ ํ ๊น?
์ด๋ก ์ ์ถฉ๋ถํ ๋ดค์ผ๋, ์ด์ ์ค์ ํ๋จ ๊ธฐ์ค์ ์์๋ณด์! ํ๋ก์ ํธ์์ Deployment์ StatefulSet ์ค ๋ญ ์ ํํด์ผ ํ ์ง ๊ณ ๋ฏผ๋ ๋ ์ฐธ๊ณ ํ ์ ์๋ ๊ฐ์ด๋๋ผ์ธ์ด์ผ.
โ Deployment๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ
1. ์น ์ ํ๋ฆฌ์ผ์ด์ ์๋ฒ Node.js, Spring Boot, Django ๊ฐ์ ์น ํ๋ ์์ํฌ๋ก ๋ง๋ API ์๋ฒ๋ ๋๋ถ๋ถ Stateless์ผ. ์ธ์ ์ ๋ณด๋ฅผ Redis ๊ฐ์ ์ธ๋ถ ์ ์ฅ์์ ๋ณด๊ดํ๋ค๋ฉด ์๋ฒฝํ Deployment ํ๋ณด์ง.
2. ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์
React, Vue, Angular๋ก ๋น๋ํ ์ ์ ํ์ผ๋ค์ ์๋นํ๋ Nginx๋ Apache ์๋ฒ. ์ด๊ฒ๋ ์์ ํ Stateless์ผ.
3. ๋ง์ดํฌ๋ก์๋น์ค
๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ๋
๋ฆฝ์ ์ผ๋ก ๋์ํ๊ณ ์ํ๋ฅผ ์ธ๋ถ DB์ ์ ์ฅํ๋ค๋ฉด Deployment๊ฐ ์ ํฉํด. ๋น ๋ฅธ ์ค์ผ์ผ๋ง๊ณผ ๋กค๋ง ์
๋ฐ์ดํธ์ ์ด์ ์ ์ต๋ํ ํ์ฉํ ์ ์์ด.
4. ๋ฐฐ์น ์ฒ๋ฆฌ ์์ปค
ํ์์ ์์
์ ๊ฐ์ ธ์์ ์ฒ๋ฆฌํ๋ ์์ปค ํ๋ก์ธ์ค๋ค. ๊ฐ ์์ปค๊ฐ ๋
๋ฆฝ์ ์ผ๋ก ๋์ํ๋ค๋ฉด Deployment๋ก ์ถฉ๋ถํด.
5. ์บ์ ์๋ฒ (ํน์ ๊ฒฝ์ฐ)
Redis๋ฅผ ๋จ์ ์บ์๋ก๋ง ์ฌ์ฉํ๊ณ ๋ฐ์ดํฐ ์์ค์ด ๊ด์ฐฎ๋ค๋ฉด Deployment๋ ๊ฐ๋ฅํด. ํ์ง๋ง ์๊ตฌ ์ ์ฅ์ด ํ์ํ๋ฉด StatefulSet์ ์จ์ผ ํด!
โ StatefulSet์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ
1. ๋ฐ์ดํฐ๋ฒ ์ด์ค MySQL, PostgreSQL, MongoDB, Cassandra ๋ฑ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ StatefulSet์ผ๋ก ๋ฐฐํฌํด์ผ ํด. ๊ฐ ์ธ์คํด์ค๊ฐ ๊ณ ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์์ผ๋๊น.
2. ๋ฉ์์ง ํ ๋ฐ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ
Kafka, RabbitMQ, NATS ๊ฐ์ ์์คํ
๋ค. ๋ฉ์์ง ์์์ ํํฐ์
ํ ๋น์ด ์ค์ํ๊ธฐ ๋๋ฌธ์ ์์ ์ ์ธ ๋คํธ์ํฌ ์๋ณ์๊ฐ ํ์์ผ.
3. ๋ถ์ฐ ์คํ ๋ฆฌ์ง ์์คํ
Elasticsearch, Ceph, GlusterFS ๊ฐ์ ๋ถ์ฐ ํ์ผ ์์คํ
์ด๋ ๊ฒ์ ์์ง. ๊ฐ ๋
ธ๋๊ฐ ๋ฐ์ดํฐ์ ์ผ๋ถ๋ฅผ ๋ด๋นํ๊ณ ์์ด.
4. ๋ถ์ฐ ์ฝ๋๋ค์ด์
์๋น์ค
ZooKeeper, etcd, Consul ๊ฐ์ ์์คํ
. ํด๋ฌ์คํฐ ๋ฉค๋ฒ์ญ๊ณผ ๋ฆฌ๋ ์ ์ถ์ด ์ค์ํด์ ์์ ์ ์ธ ์ ์ฒด์ฑ์ด ํ์์ผ.
5. ์ํ๋ฅผ ์ ์งํ๋ ์บ์
Redis๋ Memcached๋ฅผ ์๊ตฌ ์ ์ฅ์๋ก ์ฌ์ฉํ๊ฑฐ๋, ํด๋ฌ์คํฐ ๋ชจ๋๋ก ์ด์ํ ๋๋ StatefulSet์ด ํ์ํด.
๐ Deployment ์ ํ ์ ํธ
โ Pod๊ฐ ์ฃฝ์ด๋ ๋ฐ์ดํฐ ์์ค OK
โ ๋ชจ๋ Pod๊ฐ ๋์ผํ ์ญํ
โ ๋น ๋ฅธ ์ค์ผ์ผ๋ง ํ์
โ ๋กค๋ง ์
๋ฐ์ดํธ ์์ฃผ ํจ
โ ๋ก๋๋ฐธ๋ฐ์ฑ์ผ๋ก ์ถฉ๋ถ
๐๏ธ StatefulSet ์ ํ ์ ํธ
โ ๋ฐ์ดํฐ ์๊ตฌ ๋ณด์กด ํ์
โ ๊ฐ Pod๊ฐ ๊ณ ์ ํ ์ญํ
โ ์์๊ฐ ์ค์ํจ
โ ํน์ Pod ์ง์ ์ ๊ทผ ํ์
โ Master-Slave ๊ตฌ์กฐ
๐ฏ ์ค์ ์์ฌ๊ฒฐ์ ํ๋ก์ฐ
์์ง๋ ํท๊ฐ๋ฆฐ๋ค๋ฉด ์ด ๊ฐ๋จํ ์ง๋ฌธ๋ค๋ก ํ๋จํด๋ด:
Q1: ์ด ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ก์ปฌ ๋์คํฌ์ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋?
โ YES: StatefulSet ๊ณ ๋ ค
โ NO: Deployment ๊ฐ๋ฅ
Q2: Pod๊ฐ ์ฌ์์๋ ๋ ๊ฐ์ ๋คํธ์ํฌ ์๋ณ์๋ฅผ ์ ์งํด์ผ ํ๋?
โ YES: StatefulSet ํ์
โ NO: Deployment ๊ฐ๋ฅ
Q3: Pod๋ค์ด ์๋ก ๋ค๋ฅธ ์ญํ ์ ํ๊ฑฐ๋ ์์๊ฐ ์ค์ํ๊ฐ?
โ YES: StatefulSet ํ์
โ NO: Deployment ๊ฐ๋ฅ
Q4: ํน์ Pod์ ์ง์ ์ ๊ทผํด์ผ ํ๋?
โ YES: StatefulSet ํ์
โ NO: Deployment ๊ฐ๋ฅ
์ ์ง๋ฌธ ์ค ํ๋๋ผ๋ YES๋ผ๋ฉด StatefulSet์ ์ง์งํ๊ฒ ๊ณ ๋ คํด์ผ ํด. ๋ฐ๋๋ก ๋ชจ๋ NO๋ผ๋ฉด Deployment๊ฐ ๋ ๋์ ์ ํ์ด์ผ!
๐ ๏ธ ์ค๋ฌด ํ์ฉ ํจํด๊ณผ ๋ฒ ์คํธ ํ๋ํฐ์ค
์ด๋ก ์ ๋์ด์ ์ค์ ํ๋ก์ ํธ์์ ์ด๋ป๊ฒ ํ์ฉํ๋์ง ์์๋ณด์. ์ฌ๊ธฐ์๋ ์ค๋ฌด์์ ์์ฃผ ๋ง์ฃผ์น๋ ์๋๋ฆฌ์ค๋ค๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ณต์ ํ ๊ฒ!
๐ ํจํด 1: ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ
์ ํ์ ์ธ ๋ง์ดํฌ๋ก์๋น์ค ํ๊ฒฝ์์๋ Deployment์ StatefulSet์ ํจ๊ป ์ฌ์ฉํด:
Deployment๋ก ๊ด๋ฆฌ:
โข API Gateway (Kong, Nginx)
โข ๋น์ฆ๋์ค ๋ก์ง ์๋น์ค๋ค (User Service, Order Service ๋ฑ)
โข ํ๋ก ํธ์๋ ์ ํ๋ฆฌ์ผ์ด์
โข ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ปค
StatefulSet์ผ๋ก ๊ด๋ฆฌ:
โข PostgreSQL (์ฃผ๋ฌธ ๋ฐ์ดํฐ)
โข MongoDB (์ฌ์ฉ์ ํ๋กํ)
โข Redis (์ธ์
์ ์ฅ์)
โข Kafka (์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ)
์ด๋ ๊ฒ ์ญํ ์ ๋ฐ๋ผ ์ ์ ํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ํํ๋ฉด ๊ฐ ์ปดํฌ๋ํธ์ ํน์ฑ์ ๋ง๋ ์ต์ ์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํด!
๐ ํจํด 2: ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ
๋๋ก๋ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๊ธฐ๋ ํด. ์๋ฅผ ๋ค์ด WordPress ๊ฐ์ CMS๋ฅผ ๋ฐฐํฌํ๋ค๋ฉด:
# WordPress ์ ํ๋ฆฌ์ผ์ด์
(Deployment)
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 3
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:latest
env:
- name: WORDPRESS_DB_HOST
value: mysql-0.mysql-service
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
---
# MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค (StatefulSet)
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql-service
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 20Gi
WordPress ์ ํ๋ฆฌ์ผ์ด์ ์์ฒด๋ Stateless์ด๋๊น Deployment๋ก ์ฌ๋ฌ ๊ฐ ๋์์ ๋ถํ๋ฅผ ๋ถ์ฐํ๊ณ , MySQL์ StatefulSet์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ ํ๊ฒ ๋ณด๊ดํ๋ ๊ฑฐ์ง!
โก ํจํด 3: ์ฝ๊ธฐ ์ ์ฉ ๋ณต์ ๋ณธ
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฝ๊ธฐ ์ฑ๋ฅ์ ๋์ด๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ํจํด์ด์ผ:
Master (StatefulSet): ์ฐ๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๋ Primary ๋ฐ์ดํฐ๋ฒ ์ด์ค. 1๊ฐ์ Pod๋ก ์ด์.
Read Replicas (Deployment):
์ฝ๊ธฐ ์ ์ฉ ๋ณต์ ๋ณธ๋ค. Master์์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ๋ฐ์์ ์ฝ๊ธฐ ์์ฒญ๋ง ์ฒ๋ฆฌ. ์ฌ๋ฌ ๊ฐ๋ก ์ค์ผ์ผ ๊ฐ๋ฅ.
์ด ํจํด์ ์ฅ์ ์ ์ฝ๊ธฐ ๋ณต์ ๋ณธ์ Deployment๋ก ๊ด๋ฆฌํด์ ํธ๋ํฝ์ ๋ฐ๋ผ ๋น ๋ฅด๊ฒ ์ค์ผ์ผ๋งํ ์ ์๋ค๋ ๊ฑฐ์ผ. ์ฝ๊ธฐ ๋ณต์ ๋ณธ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ์ง ์์ผ๋๊น Stateless์ฒ๋ผ ์ทจ๊ธํ ์ ์๊ฑฐ๋ !
๐จ ๋ฒ ์คํธ ํ๋ํฐ์ค
1. ๋ฆฌ์์ค ์ ํ ์ค์ Deployment๋ StatefulSet์ด๋ ํญ์ resources.requests์ resources.limits๋ฅผ ์ค์ ํด. ํนํ StatefulSet์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ค์ํ ์ํฌ๋ก๋๋๊น ๋์ฑ ์ ๊ฒฝ ์จ์ผ ํด.
2. Health Check ๊ตฌ์ฑ
livenessProbe์ readinessProbe๋ฅผ ๋ฐ๋์ ์ค์ ํด. ํนํ StatefulSet์์๋ Pod๊ฐ ์์ ํ ์ค๋น๋ ๋๊น์ง ๋ค์ Pod๋ฅผ ์์ฑํ์ง ์์ผ๋๊น readinessProbe๊ฐ ๋งค์ฐ ์ค์ํด!
3. PodDisruptionBudget ์ฌ์ฉ
ํด๋ฌ์คํฐ ์ ์ง๋ณด์ ์ค์๋ ์ต์ํ์ Pod๊ฐ ์คํ๋๋๋ก ๋ณด์ฅํด์ค. ํนํ StatefulSet์์ ์ค์ํด.
4. ๋ฐฑ์
์ ๋ต
StatefulSet์ PVC๋ ์๋์ผ๋ก ๋ฐฑ์
๋์ง ์์. Velero ๊ฐ์ ๋๊ตฌ๋ก ์ ๊ธฐ์ ์ธ ๋ฐฑ์
์ ์ค์ ํด์ผ ํด.
5. ๋ชจ๋ํฐ๋ง ๋ฐ ์๋ฆผ
Prometheus์ Grafana๋ก Pod ์ํ, ๋ฆฌ์์ค ์ฌ์ฉ๋, ์คํ ๋ฆฌ์ง ์ฉ๋์ ๋ชจ๋ํฐ๋งํด. ํนํ StatefulSet์ ๋์คํฌ ์ฌ์ฉ๋์ ๊ผญ ์ฒดํฌํด์ผ ํด!
๐ก ์ฌ๋ฅ๋ท ํ์ฉ ํ: ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ ๊ตฌ์ถ์ด๋ Deployment/StatefulSet ์ค์ ์ด ์ด๋ ต๋ค๋ฉด, ์ฌ๋ฅ๋ท(https://www.jaenung.net)์์ DevOps ์ ๋ฌธ๊ฐ์ ๋์์ ๋ฐ์๋ณด๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์ผ. ์ค๋ฌด ๊ฒฝํ์ด ํ๋ถํ ์ ๋ฌธ๊ฐ๋ค์ด ํ๋ก์ ํธ์ ๋ง๋ ์ต์ ์ ์ํคํ ์ฒ๋ฅผ ์ค๊ณํด์ค ์ ์์ด!
โ ๏ธ ํํ ์ค์์ ํธ๋ฌ๋ธ์ํ
์ค๋ฌด์์ ์์ฃผ ๋ฐ์ํ๋ ์ค์๋ค๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์์๋ณด์. ์ด๋ฐ ํจ์ ๋ค์ ๋ฏธ๋ฆฌ ์๊ณ ์์ผ๋ฉด ๋ง์ ์ํ์ฐฉ์ค๋ฅผ ์ค์ผ ์ ์์ด!
โ ์ค์ 1: StatefulSet์ด ํ์ํ๋ฐ Deployment ์ฌ์ฉ
์ฆ์: ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ Deployment๋ก ๋ฐฐํฌํ๋๋ Pod๊ฐ ์ฌ์์๋ ๋๋ง๋ค ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๊ฑฐ๋, ์ฌ๋ฌ Pod๊ฐ ๊ฐ์ ๋ฐ์ดํฐ ํ์ผ์ ๋์ ์ ๊ทผํด์ ๋ฐ์ดํฐ ์์์ด ๋ฐ์.
์์ธ:
Deployment๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๊ตฌ ์คํ ๋ฆฌ์ง๋ฅผ ๊ฐ Pod์ ๋
๋ฆฝ์ ์ผ๋ก ํ ๋นํ์ง ์์. PVC๋ฅผ ์ฐ๊ฒฐํด๋ ๋ชจ๋ Pod๊ฐ ๊ฐ์ ๋ณผ๋ฅจ์ ๊ณต์ ํ๊ฒ ๋ผ.
ํด๊ฒฐ:
StatefulSet์ผ๋ก ์ ํํ๊ณ volumeClaimTemplates๋ฅผ ์ฌ์ฉํด์ ๊ฐ Pod๋ง๋ค ๋
๋ฆฝ์ ์ธ PVC๋ฅผ ์์ฑํด.
โ ์ค์ 2: StatefulSet ์ค์ผ์ผ๋ง ์ ์์ ๋ฌด์
์ฆ์: StatefulSet์ ๊ธํ๊ฒ ์ค์ผ์ผ ๋ค์ดํ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ฌ์คํฐ๊ฐ ๊นจ์ง๊ฑฐ๋ ๋ฐ์ดํฐ ๋ถ์ผ์น ๋ฐ์.
์์ธ:
StatefulSet์ ์ญ์์ผ๋ก Pod๋ฅผ ์ข
๋ฃํ๋๋ฐ, ์ด ๊ณผ์ ์ ๋ฌด์ํ๊ณ ๊ฐ์ ๋ก ์ญ์ ํ๋ฉด ํด๋ฌ์คํฐ ์ํ๊ฐ ๋ง๊ฐ์ง ์ ์์ด.
ํด๊ฒฐ:
StatefulSet ์ค์ผ์ผ๋ง์ ์ฒ์ฒํ ํ๋์ฉ ์งํํด. ํนํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ค์ผ์ผ ๋ค์ด ์ ์ ๋ฐ์ดํฐ ๋ณต์ ์ํ๋ฅผ ํ์ธํ๊ณ , ์์ ํ๊ฒ ๋
ธ๋๋ฅผ ์ ๊ฑฐํด์ผ ํด.
โ ์ค์ 3: Headless Service ์์ด StatefulSet ์ฌ์ฉ
์ฆ์: StatefulSet์ ๊ฐ Pod์ ์ง์ ์ ๊ทผํ ์ ์์ด์ Master-Slave ๊ตฌ์ฑ์ด๋ ํด๋ฌ์คํฐ ์ค์ ์ด ๋ถ๊ฐ๋ฅ.
์์ธ:
StatefulSet์ Headless Service์ ํจ๊ป ์ฌ์ฉํด์ผ ๊ฐ Pod๊ฐ ๊ณ ์ ํ DNS ์ด๋ฆ์ ๊ฐ์ ธ. ์ผ๋ฐ Service๋ง ์์ผ๋ฉด ๋ก๋๋ฐธ๋ฐ์ฑ๋ง ๋๊ณ ๊ฐ๋ณ Pod ์ ๊ทผ์ด ์ ๋ผ.
ํด๊ฒฐ:
clusterIP: None์ผ๋ก ์ค์ ๋ Headless Service๋ฅผ ๋ง๋ค๊ณ , StatefulSet์ serviceName์ ์ฐ๊ฒฐํด.
โ ์ค์ 4: PVC ์ญ์ ์ ์ฑ ์คํด
์ฆ์: StatefulSet์ ์ญ์ ํ๋๋ฐ PVC๊ฐ ๋จ์์์ด์ ์คํ ๋ฆฌ์ง ๋น์ฉ์ด ๊ณ์ ์ฒญ๊ตฌ๋๊ฑฐ๋, ๋ฐ๋๋ก ์ค์๋ก PVC๋ฅผ ์ญ์ ํด์ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ์์ด๋ฒ๋ฆผ.
์์ธ:
์ฟ ๋ฒ๋คํฐ์ค๋ ๊ธฐ๋ณธ์ ์ผ๋ก StatefulSet์ ์ญ์ ํด๋ PVC๋ฅผ ์๋์ผ๋ก ์ญ์ ํ์ง ์์. ์ด๊ฑด ๋ฐ์ดํฐ ๋ณดํธ๋ฅผ ์ํ ์์ ์ฅ์น์ผ.
ํด๊ฒฐ:
StatefulSet ์ญ์ ์ ์ ๋ฐ์ดํฐ ๋ฐฑ์
์ ํ์ธํ๊ณ , ๋ ์ด์ ํ์ ์๋ค๋ฉด PVC๋ฅผ ์๋์ผ๋ก ์ญ์ ํด. ์๋ํํ๋ ค๋ฉด Helm Chart๋ Operator๋ฅผ ์ฌ์ฉํด.
โ ์ค์ 5: ๋กค๋ง ์ ๋ฐ์ดํธ ์ค ๋ฐ์ดํฐ ๋ถ์ผ์น
์ฆ์: StatefulSet์ ์ ๋ฐ์ดํธํ๋ ๋์ ์ผ๋ถ Pod๋ ์ ๋ฒ์ , ์ผ๋ถ๋ ๊ตฌ ๋ฒ์ ์ด ๋์์ ์คํ๋๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ถ์ผ์น ๋ฐ์.
์์ธ:
StatefulSet์ ๋กค๋ง ์
๋ฐ์ดํธ๋ ์์ฐจ์ ์ด์ง๋ง, ์
๋ฐ์ดํธ ์ค์๋ ์ฌ๋ฌ ๋ฒ์ ์ด ๊ณต์กดํ ์ ์์ด. ํนํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๋ณ๊ฒฝ์ด ์์ผ๋ฉด ๋ฌธ์ ๊ฐ ๋ผ.
ํด๊ฒฐ:
๋ฐ์ดํฐ๋ฒ ์ด์ค ์
๋ฐ์ดํธ๋ ์ ์คํ๊ฒ ๊ณํํด. ๊ฐ๋ฅํ๋ฉด ํ์ ํธํ์ฑ์ ์ ์งํ๋ ์คํค๋ง ๋ณ๊ฒฝ์ ๋จผ์ ํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์
์
๋ฐ์ดํธ๋ ๋์ค์ ํด. ๋๋ OnDelete ์
๋ฐ์ดํธ ์ ๋ต์ ์ฌ์ฉํด์ ์๋์ผ๋ก ์ ์ดํด.
๐ง ํธ๋ฌ๋ธ์ํ ์ฒดํฌ๋ฆฌ์คํธ
๋ฌธ์ ๊ฐ ์๊ฒผ์ ๋ ํ์ธํ ์ฌํญ๋ค:
1. Pod ์ํ ํ์ธ
kubectl get pods -l app=your-app
kubectl describe pod your-pod-name
kubectl logs your-pod-name
2. PVC ์ํ ํ์ธ
kubectl get pvc
kubectl describe pvc your-pvc-name
3. ์ด๋ฒคํธ ๋ก๊ทธ ํ์ธ
kubectl get events --sort-by='.lastTimestamp'
4. ๋ฆฌ์์ค ์ฌ์ฉ๋ ํ์ธ
kubectl top pods
kubectl top nodes
5. Service ์ฐ๊ฒฐ ํ์ธ
kubectl get svc
kubectl describe svc your-service-name
๐ ๊ณ ๊ธ ํ์ฉ: Operator ํจํด
StatefulSet์ ์ง์ ๊ด๋ฆฌํ๋ ๊ฒ ๋ณต์กํ๋ค๋ฉด, Operator ํจํด์ ๊ณ ๋ คํด๋ณผ ์ ์์ด. Operator๋ ์ฟ ๋ฒ๋คํฐ์ค์ ํ์ฅ ๋ฉ์ปค๋์ฆ์ผ๋ก, ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌ์ ๊ด๋ฆฌ๋ฅผ ์๋ํํด์ฃผ๋ ์ํํธ์จ์ด์ผ.
๐ค Operator๊ฐ ๋ญ์ผ?
Operator๋ ์ฟ ๋ฒ๋คํฐ์ค API๋ฅผ ํ์ฅํด์ ํน์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋๋ฉ์ธ ์ง์์ ์ฝ๋๋ก ๊ตฌํํ ๊ฑฐ์ผ. ์๋ฅผ ๋ค์ด, MySQL Operator๋ MySQL ํด๋ฌ์คํฐ๋ฅผ ์ค์ ํ๊ณ , ๋ฐฑ์
ํ๊ณ , ๋ณต๊ตฌํ๋ ๋ชจ๋ ์์
์ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ค.
Operator๋ ๋ด๋ถ์ ์ผ๋ก StatefulSet์ ์ฌ์ฉํ์ง๋ง, ๊ทธ ์์ ํจ์ฌ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํด:
โข ์๋ ๋ฐฑ์
๋ฐ ๋ณต๊ตฌ
โข ํด๋ฌ์คํฐ ํ์ฅ ๋ฐ ์ถ์
โข ๋ฒ์ ์
๊ทธ๋ ์ด๋
โข ์ฅ์ ๋ณต๊ตฌ (Self-healing)
โข ๋ชจ๋ํฐ๋ง ๋ฐ ์๋ฆผ
โข ์ฑ๋ฅ ํ๋
๐ฆ ์ธ๊ธฐ ์๋ Operator๋ค
1. Prometheus Operator ๋ชจ๋ํฐ๋ง ์คํ์ ์ฝ๊ฒ ๋ฐฐํฌํ๊ณ ๊ด๋ฆฌ. ServiceMonitor ๊ฐ์ CRD๋ก ๋ชจ๋ํฐ๋ง ๋์์ ์ ์ธ์ ์ผ๋ก ์ ์ํ ์ ์์ด.
2. MySQL Operator (Oracle, Percona, Vitess ๋ฑ)
MySQL ํด๋ฌ์คํฐ๋ฅผ ์๋์ผ๋ก ๊ตฌ์ฑํ๊ณ , ๋ฐฑ์
/๋ณต๊ตฌ, ํ์ผ์ค๋ฒ๋ฅผ ์ฒ๋ฆฌํด์ค.
3. PostgreSQL Operator (Zalando, Crunchy Data ๋ฑ)
PostgreSQL ๊ณ ๊ฐ์ฉ์ฑ ํด๋ฌ์คํฐ๋ฅผ ๊ด๋ฆฌ. ์๋ ํ์ผ์ค๋ฒ์ ๋ฐฑ์
์ด ๋ด์ฅ๋์ด ์์ด.
4. MongoDB Operator
MongoDB ๋ ํ๋ฆฌ์นด์
๊ณผ ์ค๋ฉ ํด๋ฌ์คํฐ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌ.
5. Kafka Operator (Strimzi)
Kafka ํด๋ฌ์คํฐ์ ZooKeeper๋ฅผ ํจ๊ป ๊ด๋ฆฌ. ํ ํฝ ์์ฑ, ์ฌ์ฉ์ ๊ด๋ฆฌ๋ CRD๋ก ๊ฐ๋ฅ.
6. Elasticsearch Operator (Elastic Cloud on Kubernetes)
Elasticsearch ํด๋ฌ์คํฐ๋ฅผ ๋ฐฐํฌํ๊ณ ์ค์ผ์ผ๋ง, ์
๊ทธ๋ ์ด๋๋ฅผ ์๋ํ.
๐ก Operator ์ฌ์ฉ ์์
Strimzi Kafka Operator๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต์กํ Kafka ํด๋ฌ์คํฐ๋ฅผ ์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ ๋ฐฐํฌํ ์ ์์ด:
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: my-cluster
spec:
kafka:
version: 3.3.1
replicas: 3
listeners:
- name: plain
port: 9092
type: internal
tls: false
- name: tls
port: 9093
type: internal
tls: true
storage:
type: persistent-claim
size: 100Gi
deleteClaim: false
zookeeper:
replicas: 3
storage:
type: persistent-claim
size: 10Gi
deleteClaim: false
entityOperator:
topicOperator: {}
userOperator: {}
์ด YAML ํ๋๋ก Kafka 3๊ฐ, ZooKeeper 3๊ฐ, ๊ทธ๋ฆฌ๊ณ Topic/User ๊ด๋ฆฌ Operator๊น์ง ๋ชจ๋ ๋ฐฐํฌ๋ผ. ์ง์ StatefulSet์ ์์ฑํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๋จํ๊ณ ์์ ํ์ง!
๐ก Operator vs ์ง์ StatefulSet ๊ด๋ฆฌ: ๊ฐ๋จํ ํ๋ก์ ํธ๋ ํ์ต ๋ชฉ์ ์ด๋ผ๋ฉด ์ง์ StatefulSet์ ๊ด๋ฆฌํ๋ ๊ฒ ์ข์. ํ์ง๋ง ํ๋ก๋์ ํ๊ฒฝ์์ ๋ณต์กํ ์ํ์ ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์ํ๋ค๋ฉด Operator๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ํจ์ฌ ์์ ํ๊ณ ํจ์จ์ ์ด์ผ. ํนํ ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์ ์๋น์ค๋ฅผ ์ด์ํ๋ค๋ฉด, ์์ ์ฑ์ด ๋งค์ฐ ์ค์ํ๋๊น Operator ๋์ ์ ์ ๊ทน ๊ณ ๋ คํด๋ด!
๐ ์ฑ๋ฅ ์ต์ ํ ํ
Deployment์ StatefulSet์ ์ฑ๋ฅ์ ์ต๋ํ ๋์ด์ฌ๋ฆฌ๋ ๋ฐฉ๋ฒ๋ค์ ์์๋ณด์!
โก Deployment ์ต์ ํ
1. HPA (Horizontal Pod Autoscaler) ํ์ฉ
CPU๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ ์ ๋ฐ๋ผ ์๋์ผ๋ก Pod ๊ฐ์๋ฅผ ์กฐ์ ํด. ํธ๋ํฝ ํจํด์ด ๋ณ๋์ด ์ฌํ ์๋น์ค์ ํนํ ์ ์ฉํด.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
2. ๋ฆฌ์์ค ์์ฒญ/์ ํ ์ต์ ํ
๋๋ฌด ๋ฎ๊ฒ ์ค์ ํ๋ฉด OOMKilled๊ฐ ๋ฐ์ํ๊ณ , ๋๋ฌด ๋๊ฒ ์ค์ ํ๋ฉด ๋ฆฌ์์ค ๋ญ๋น์ผ. ์ค์ ์ฌ์ฉ๋์ ๋ชจ๋ํฐ๋งํด์ ์ ์ ํ ๊ฐ์ ์ฐพ์์ผ ํด.
3. ๋กค๋ง ์
๋ฐ์ดํธ ์ ๋ต ์กฐ์
maxSurge์ maxUnavailable์ ์กฐ์ ํด์ ์
๋ฐ์ดํธ ์๋์ ์์ ์ฑ์ ๊ท ํ์ ๋ง์ถฐ.
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # ๋์์ ์์ฑํ ์ ์๋ ์ถ๊ฐ Pod ์
maxUnavailable: 0 # ์
๋ฐ์ดํธ ์ค ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ Pod ์
4. Readiness Probe ์ต์ ํ
๋๋ฌด ์งง์ผ๋ฉด Pod๊ฐ ์ค๋น๋๊ธฐ ์ ์ ํธ๋ํฝ์ ๋ฐ๊ณ , ๋๋ฌด ๊ธธ๋ฉด ์
๋ฐ์ดํธ๊ฐ ๋๋ ค์ ธ. ์ ํ๋ฆฌ์ผ์ด์
์์ ์๊ฐ์ ๊ณ ๋ คํด์ ์ค์ ํด.
๐๏ธ StatefulSet ์ต์ ํ
1. ์คํ ๋ฆฌ์ง ํด๋์ค ์ ํ
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ I/O ์ง์ฝ์ ์ธ ์ํฌ๋ก๋๋ SSD ๊ธฐ๋ฐ์ ๊ณ ์ฑ๋ฅ ์คํ ๋ฆฌ์ง ํด๋์ค๋ฅผ ์ฌ์ฉํด. AWS EBS gp3, Azure Premium SSD, GCP SSD Persistent Disk ๋ฑ.
2. Pod Management Policy
๊ธฐ๋ณธ๊ฐ์ OrderedReady์ธ๋ฐ, ์์๊ฐ ์ค์ํ์ง ์๋ค๋ฉด Parallel๋ก ์ค์ ํด์ ๋ฐฐํฌ ์๋๋ฅผ ๋์ผ ์ ์์ด.
spec:
podManagementPolicy: Parallel # ๋๋ OrderedReady (๊ธฐ๋ณธ๊ฐ)
3. ๋ก์ปฌ ์คํ ๋ฆฌ์ง ํ์ฉ
๋คํธ์ํฌ ์คํ ๋ฆฌ์ง๋ณด๋ค ๋ก์ปฌ SSD๊ฐ ํจ์ฌ ๋น ๋ฅด์ง๋ง, ๋
ธ๋ ์ฅ์ ์ ๋ฐ์ดํฐ ์์ค ์ํ์ด ์์ด. ๋ณต์ ๊ฐ ์ ๋์ด ์๋ ์์คํ
(Cassandra, Elasticsearch ๋ฑ)์์ ๊ณ ๋ คํด๋ณผ ๋งํด.
4. Anti-Affinity ์ค์
StatefulSet์ Pod๋ค์ ์๋ก ๋ค๋ฅธ ๋
ธ๋์ ๋ถ์ฐ์์ผ์ ๋จ์ผ ๋
ธ๋ ์ฅ์ ์ ๋๋นํด.
spec:
template:
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- mysql
topologyKey: kubernetes.io/hostname
5. ๋ฐฑ์
์๋ํ
Velero๋ Kasten K10 ๊ฐ์ ๋๊ตฌ๋ก ์ ๊ธฐ์ ์ธ ๋ฐฑ์
์ ์๋ํํด. StatefulSet์ PVC๋ ์ค์ํ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์์ผ๋๊น ๋ฐฑ์
์ด ํ์์ผ!
๐ฏ ๊ณตํต ์ต์ ํ
1. ๋ค์์คํ์ด์ค ๋ถ๋ฆฌ ํ๊ฒฝ๋ณ(dev, staging, prod)๋ก ๋ค์์คํ์ด์ค๋ฅผ ๋ถ๋ฆฌํ๊ณ , ResourceQuota๋ก ๋ฆฌ์์ค ์ฌ์ฉ๋์ ์ ํํด.
2. ๋คํธ์ํฌ ์ ์ฑ
๋ถํ์ํ ํธ๋ํฝ์ ์ฐจ๋จํด์ ๋ณด์๊ณผ ์ฑ๋ฅ์ ๋์์ ํฅ์์์ผ.
3. ์ด๋ฏธ์ง ์ต์ ํ
๋ฉํฐ ์คํ
์ด์ง ๋น๋๋ก ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ , ๋ ์ด์ด ์บ์ฑ์ ํ์ฉํด์ ๋น๋ ์๋๋ฅผ ๋์ฌ.
4. ๋ชจ๋ํฐ๋ง ๋ฐ ์๋ฆผ
Prometheus + Grafana๋ก ์ค์๊ฐ ๋ชจ๋ํฐ๋งํ๊ณ , Alertmanager๋ก ๋ฌธ์ ๋ฐ์ ์ ์ฆ์ ์๋ฆผ๋ฐ์.
๐ ํด๋ผ์ฐ๋ ์ ๊ณต์๋ณ ๊ณ ๋ ค์ฌํญ
AWS, Azure, GCP ๊ฐ์ ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ Deployment์ StatefulSet์ ์ฌ์ฉํ ๋ ์์์ผ ํ ํน์ง๋ค์ ์ ๋ฆฌํด๋ณผ๊ฒ!
โ๏ธ AWS EKS
์คํ ๋ฆฌ์ง:
โข EBS CSI Driver๋ฅผ ์ฌ์ฉํด์ gp3 ๋ณผ๋ฅจ ์ถ์ฒ (gp2๋ณด๋ค ์ฑ๋ฅ ์ข๊ณ ์ ๋ ด)
โข EFS๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ Pod๊ฐ ๋์์ ์ ๊ทผ ๊ฐ๋ฅ (ReadWriteMany)
โข ๊ณ ์ฑ๋ฅ์ด ํ์ํ๋ฉด io2 Block Express ๊ณ ๋ ค
๋คํธ์ํน:
โข VPC CNI๋ฅผ ์ฌ์ฉํ๋ฉด Pod๊ฐ VPC IP๋ฅผ ์ง์ ๋ฐ์
โข Security Group for Pods๋ก ์ธ๋ฐํ ๋คํธ์ํฌ ์ ์ด ๊ฐ๋ฅ
๋ก๋๋ฐธ๋ฐ์ฑ:
โข ALB Ingress Controller๋ก Application Load Balancer ์๋ ์์ฑ
โข NLB๋ฅผ ์ฌ์ฉํ๋ฉด ๊ณ ์ฑ๋ฅ TCP/UDP ๋ก๋๋ฐธ๋ฐ์ฑ ๊ฐ๋ฅ
โ๏ธ Azure AKS
์คํ ๋ฆฌ์ง:
โข Azure Disk (Premium SSD, Standard SSD, Standard HDD)
โข Azure Files๋ก ReadWriteMany ์ง์
โข Ultra Disk๋ก ์ด๊ณ ์ฑ๋ฅ I/O ๊ฐ๋ฅ
๋คํธ์ํน:
โข Azure CNI๋ก Pod๊ฐ VNet IP ์ง์ ํ ๋น
โข Kubenet์ NAT๋ฅผ ์ฌ์ฉํด์ IP ์ ์ฝ
ํตํฉ ์๋น์ค:
โข Azure Monitor๋ก ํตํฉ ๋ชจ๋ํฐ๋ง
โข Azure Key Vault๋ก ์ํฌ๋ฆฟ ๊ด๋ฆฌ
โข Azure AD๋ก ์ธ์ฆ/์ธ๊ฐ
โ๏ธ Google GKE
์คํ ๋ฆฌ์ง:
โข Persistent Disk (SSD, Standard)
โข Filestore๋ก NFS ๊ธฐ๋ฐ ๊ณต์ ์คํ ๋ฆฌ์ง
โข Local SSD๋ก ์ด๊ณ ์ ์์ ์คํ ๋ฆฌ์ง
๋คํธ์ํน:
โข VPC-native ํด๋ฌ์คํฐ๋ก Pod๊ฐ VPC IP ์ฌ์ฉ
โข Private GKE๋ก ์์ ํ ๊ฒฉ๋ฆฌ๋ ํด๋ฌ์คํฐ ๊ตฌ์ฑ ๊ฐ๋ฅ
์๋ํ:
โข GKE Autopilot์ผ๋ก ๋
ธ๋ ๊ด๋ฆฌ ์๋ํ
โข Workload Identity๋ก ์์ ํ GCP ์๋น์ค ์ ๊ทผ
๐ก ๋ฉํฐ ํด๋ผ์ฐ๋ ์ ๋ต: ์ฌ๋ฌ ํด๋ผ์ฐ๋๋ฅผ ๋์์ ์ฌ์ฉํ๋ค๋ฉด, ์คํ ๋ฆฌ์ง ํด๋์ค ์ด๋ฆ์ ํ์คํํ๊ณ , Helm Chart๋ก ํ๊ฒฝ๋ณ ์ค์ ์ ๊ด๋ฆฌํ๋ ๊ฒ ์ข์. ์ฌ๋ฅ๋ท์์ ํด๋ผ์ฐ๋ ์ํคํ ์ฒ ์ ๋ฌธ๊ฐ์ ์ปจ์คํ ์ ๋ฐ์ผ๋ฉด ๋ฉํฐ ํด๋ผ์ฐ๋ ์ ๋ต์ ํจ๊ณผ์ ์ผ๋ก ์๋ฆฝํ ์ ์์ด!
๐ฎ ๋ฏธ๋ ํธ๋ ๋์ ๋ฐ์ ๋ฐฉํฅ
์ฟ ๋ฒ๋คํฐ์ค ์ํ๊ณ๋ ๊ณ์ ์งํํ๊ณ ์์ด. Deployment์ StatefulSet์ ๋ฏธ๋๋ ์ด๋ป๊ฒ ๋ ๊น?
๐ ์ฃผ๋ชฉํ ๋งํ ํธ๋ ๋
1. GitOps์ ๋ถ์ ArgoCD, Flux ๊ฐ์ GitOps ๋๊ตฌ๋ค์ด ์ธ๊ธฐ๋ฅผ ์ป๊ณ ์์ด. Git ์ ์ฅ์๊ฐ ์ง์ค์ ์์ฒ(Source of Truth)์ด ๋์ด์, ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ด Git์ ํตํด ๊ด๋ฆฌ๋๊ณ ์๋์ผ๋ก ๋ฐฐํฌ๋ผ.
2. Serverless ์ปจํ
์ด๋
AWS Fargate, Azure Container Instances, Google Cloud Run ๊ฐ์ ์๋น์ค๋ค์ด ๋ฑ์ฅํ๋ฉด์, ๋
ธ๋ ๊ด๋ฆฌ ์์ด ์ปจํ
์ด๋๋ฅผ ์คํํ ์ ์๊ฒ ๋์ด. ํ์ง๋ง StatefulSet ๊ฐ์ ๋ณต์กํ ์ํฌ๋ก๋๋ ์์ง ์ ํต์ ์ธ ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ๋ ์ ํฉํด.
3. Service Mesh ํตํฉ
Istio, Linkerd ๊ฐ์ Service Mesh๊ฐ Deployment์ ํตํฉ๋์ด์, ํธ๋ํฝ ๊ด๋ฆฌ, ๋ณด์, ๊ด์ฐฐ์ฑ์ด ๋์ฑ ๊ฐํ๋๊ณ ์์ด.
4. AI/ML ์ํฌ๋ก๋ ์ง์
Kubeflow, MLflow ๊ฐ์ ๋๊ตฌ๋ค์ด ๋ฑ์ฅํ๋ฉด์, ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ ํ์ต๊ณผ ์๋น์ ์ํ ํนํ๋ ์ํฌ๋ก๋ ์ปจํธ๋กค๋ฌ๋ค์ด ๊ฐ๋ฐ๋๊ณ ์์ด.
5. Edge Computing
K3s, MicroK8s ๊ฐ์ ๊ฒฝ๋ ์ฟ ๋ฒ๋คํฐ์ค ๋ฐฐํฌํ์ด ๋ฑ์ฅํ๋ฉด์, IoT ๋๋ฐ์ด์ค๋ ์ฃ์ง ํ๊ฒฝ์์๋ Deployment์ StatefulSet์ ์ฌ์ฉํ ์ ์๊ฒ ๋์ด.
๐ง ๊ฐ์ ๋๊ณ ์๋ ๊ธฐ๋ฅ๋ค
1. ๋ ๋น ๋ฅธ ์ค์ผ์ผ๋ง StatefulSet์ ์์ฐจ์ ๋ฐฐํฌ๊ฐ ๋ณ๋ ฌํ๋๋ ์ต์ ๋ค์ด ์ถ๊ฐ๋๊ณ ์์ด. ๋๊ท๋ชจ ํด๋ฌ์คํฐ์์ ๋ฐฐํฌ ์๊ฐ์ ํฌ๊ฒ ๋จ์ถํ ์ ์์ง.
2. ํฅ์๋ ์คํ ๋ฆฌ์ง ๊ด๋ฆฌ
CSI (Container Storage Interface)๊ฐ ๊ณ์ ๋ฐ์ ํ๋ฉด์, ์ค๋
์ท, ํด๋ก , ๋ณผ๋ฅจ ํ์ฅ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค์ด ํ์คํ๋๊ณ ์์ด.
3. ๋ณด์ ๊ฐํ
Pod Security Standards, Network Policies, RBAC ๋ฑ์ด ๋์ฑ ์ธ๋ฐํ๊ฒ ์ ์ด ๊ฐ๋ฅํด์ง๊ณ ์์ด.
4. ๊ด์ฐฐ์ฑ ๊ฐ์
OpenTelemetry ๊ฐ์ ํ์ค์ด ๋ฑ์ฅํ๋ฉด์, ํธ๋ ์ด์ฑ, ๋ฉํธ๋ฆญ, ๋ก๊ทธ๊ฐ ํตํฉ์ ์ผ๋ก ๊ด๋ฆฌ๋๊ณ ์์ด.
๐ ํ์ต ๋ฆฌ์์ค์ ์ปค๋ฎค๋ํฐ
๋ ๊น์ด ๊ณต๋ถํ๊ณ ์ถ๋ค๋ฉด ์ด๋ฐ ๋ฆฌ์์ค๋ค์ ํ์ฉํด๋ด!
๐ ๊ณต์ ๋ฌธ์
โข Kubernetes ๊ณต์ ๋ฌธ์: kubernetes.io/docs
โข Deployment ๊ฐ์ด๋: kubernetes.io/docs/concepts/workloads/controllers/deployment
โข StatefulSet ๊ฐ์ด๋: kubernetes.io/docs/concepts/workloads/controllers/statefulset
โข Best Practices: kubernetes.io/docs/concepts/configuration/overview
๐ ์จ๋ผ์ธ ๊ฐ์
โข Kubernetes ๊ณต์ ํธ๋ ์ด๋: CKAD, CKA ์๊ฒฉ์ฆ ์ค๋น
โข Udemy, Coursera: ๋ค์ํ ์ฟ ๋ฒ๋คํฐ์ค ๊ฐ์
โข Linux Foundation: ๋ฌด๋ฃ ์ฟ ๋ฒ๋คํฐ์ค ์
๋ฌธ ๊ณผ์
โข YouTube: TechWorld with Nana, Just me and Opensource ๋ฑ
๐ฅ ์ปค๋ฎค๋ํฐ
โข Kubernetes Slack: kubernetes.slack.com
โข Reddit: r/kubernetes
โข Stack Overflow: kubernetes ํ๊ทธ
โข CNCF ๋ฐ์
: ์ ์ธ๊ณ ์ฟ ๋ฒ๋คํฐ์ค ์ฌ์ฉ์ ๋ชจ์
โข ํ๊ตญ ์ปค๋ฎค๋ํฐ: ์ฟ ๋ฒ๋คํฐ์ค ํ๊ตญ ์ฌ์ฉ์ ๋ชจ์, DevOps Korea
๐ ๏ธ ์ค์ต ํ๊ฒฝ
โข Minikube: ๋ก์ปฌ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ
โข Kind: Docker ์ปจํ
์ด๋๋ก ์ฟ ๋ฒ๋คํฐ์ค ์คํ
โข K3s: ๊ฒฝ๋ ์ฟ ๋ฒ๋คํฐ์ค ๋ฐฐํฌํ
โข Play with Kubernetes: ๋ธ๋ผ์ฐ์ ์์ ๋ฌด๋ฃ๋ก ์ค์ต
โข ํด๋ผ์ฐ๋ ๋ฌด๋ฃ ํฐ์ด: GKE, EKS, AKS ๋ฌด๋ฃ ํฌ๋ ๋ง ํ์ฉ
๐ก ์ค์ ๊ฒฝํ์ ์ค์์ฑ: ์ด๋ก ๋ง์ผ๋ก๋ ๋ถ์กฑํด. ์ง์ ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ถํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๊ณ , ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด๋ ๊ฒฝํ์ด ๊ฐ์ฅ ์ค์ํด. ์ฌ๋ฅ๋ท์์ ์ค์ ํ๋ก์ ํธ์ ์ฐธ์ฌํ๊ฑฐ๋, ๋ฉํ ๋ง์ ๋ฐ์ผ๋ฉด ํจ์ฌ ๋น ๋ฅด๊ฒ ์ฑ์ฅํ ์ ์์ด!
๐ฏ ๋ง๋ฌด๋ฆฌ: ์ฌ๋ฐ๋ฅธ ์ ํ์ด ์ฑ๊ณต์ ์ด์
์, ์ฌ๊ธฐ๊น์ง Deployment์ StatefulSet์ ๋ชจ๋ ๊ฒ์ ์ดํด๋ดค์ด! ๊ธด ๊ธ์ด์์ง๋ง, ์ด ๋ ๊ฐ์ง ์ปจํธ๋กค๋ฌ์ ์ฐจ์ด๋ฅผ ์ ๋๋ก ์ดํดํ๋ ๊ฑด ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ๋ง์คํฐํ๋ ๋ฐ ์ ๋ง ์ค์ํ ๋จ๊ณ์ผ.
ํต์ฌ์ ๋ค์ ํ๋ฒ ์ ๋ฆฌํ๋ฉด:
๐ Deployment๋:
โข ๋ฌด์ํ(Stateless) ์ ํ๋ฆฌ์ผ์ด์
์ ์ต์
โข ๋น ๋ฅธ ์ค์ผ์ผ๋ง๊ณผ ๋กค๋ง ์
๋ฐ์ดํธ๊ฐ ๊ฐ์
โข ์น ์๋ฒ, API, ํ๋ก ํธ์๋์ ์ฌ์ฉ
โข Pod๊ฐ ๋์ผํ๊ณ ๊ต์ฒด ๊ฐ๋ฅ
๐๏ธ StatefulSet์:
โข ์ํ์ ์ง(Stateful) ์ ํ๋ฆฌ์ผ์ด์
์ ํ์
โข ์์ ์ ์ธ ๋คํธ์ํฌ ์๋ณ์์ ์คํ ๋ฆฌ์ง ์ ๊ณต
โข ๋ฐ์ดํฐ๋ฒ ์ด์ค, ๋ฉ์์ง ํ, ๋ถ์ฐ ์์คํ
์ ์ฌ์ฉ
โข ๊ฐ Pod๊ฐ ๊ณ ์ ํ๊ณ ๋์ฒด ๋ถ๊ฐ๋ฅ
๐ก ์ค๋ฌด์์ ๊ฐ์ฅ ์ค์ํ ๊ฑด ์ ํ๋ฆฌ์ผ์ด์
์ ํน์ฑ์ ์ ํํ ํ์
ํ๋ ๊ฒ์ด์ผ. "์ด ์ ํ๋ฆฌ์ผ์ด์
์ด ์ํ๋ฅผ ์ ์ฅํ๋?", "Pod๊ฐ ์ฌ์์๋์ด๋ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋์ด์ผ ํ๋?", "๊ฐ ์ธ์คํด์ค๊ฐ ๊ณ ์ ํ ์ ์ฒด์ฑ์ ๊ฐ์ ธ์ผ ํ๋?" ๊ฐ์ ์ง๋ฌธ๋ค์ ๋ตํ๋ค ๋ณด๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์ฌ๋ฐ๋ฅธ ์ ํ์ ํ ์ ์์ด.
๐ ์ฒ์์ ์ด๋ ต๊ฒ ๋๊ปด์ง ์ ์์ง๋ง, ์ง์ ์ค์ตํ๊ณ ๊ฒฝํ์ ์๋ค ๋ณด๋ฉด ์ ์ ์ต์ํด์ง ๊ฑฐ์ผ. ์์ ํ๋ก์ ํธ๋ถํฐ ์์ํด์ ์ ์ฐจ ๋ณต์กํ ์์คํ
์ผ๋ก ํ์ฅํด๋๊ฐ๋ ๊ฒ ์ข์.
๐ค ํผ์ ๊ณต๋ถํ๊ธฐ ์ด๋ ต๋ค๋ฉด ์ปค๋ฎค๋ํฐ์ ๋์์ ๋ฐ๊ฑฐ๋, ์ฌ๋ฅ๋ท(https://www.jaenung.net)์์ ์ ๋ฌธ๊ฐ์ ๋ฉํ ๋ง์ ๋ฐ๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์ผ. ์ค๋ฌด ๊ฒฝํ์ด ํ๋ถํ DevOps ์์ง๋์ด๋ค์ด ํ๋ก์ ํธ์ ๋ง๋ ์ต์ ์ ์ํคํ
์ฒ๋ฅผ ์ค๊ณํ๊ณ , ํธ๋ฌ๋ธ์ํ
์ ๋์์ค ์ ์๊ฑฐ๋ !
๐ ์ฟ ๋ฒ๋คํฐ์ค๋ ๊ณ์ ์งํํ๊ณ ์๊ณ , ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ์ํ๊ณ๋ ๋์ฑ ํ๋ถํด์ง๊ณ ์์ด. Deployment์ StatefulSet์ ์ ๋๋ก ์ดํดํ๊ณ ํ์ฉํ ์ ์๋ค๋ฉด, ํ๋์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ์ ์ด์์์ ํฐ ๊ฒฝ์๋ ฅ์ ๊ฐ์ง ์ ์์ ๊ฑฐ์ผ!
๐ช ์ด์ ๋น์ ๋ Deployment์ StatefulSet์ ์ฐจ์ด๋ฅผ ์๋ฒฝํ๊ฒ ์ดํดํ์ผ๋, ์์ ๊ฐ์ ๊ฐ์ง๊ณ ์ค์ ์ ์ ์ฉํด๋ด. ์ฒ์์ ์ค์๋ ํ๊ณ ์ํ์ฐฉ์ค๋ ๊ฒช๊ฒ ์ง๋ง, ๊ทธ๊ฒ ๋ฐ๋ก ์ฑ์ฅ์ ๊ณผ์ ์ด์ผ. ํ์ดํ
!
๐ ์ถํํฉ๋๋ค!
Deployment์ StatefulSet์ ๋ชจ๋ ๊ฒ์ ๋ง์คํฐํ์ต๋๋ค!
์ด์ ์ฟ ๋ฒ๋คํฐ์ค ์ํฌ๋ก๋๋ฅผ ์์ ์์ฌ๋ก ๋ค๋ฃฐ ์ ์๋
DevOps ์ ๋ฌธ๊ฐ๋ก ํ ๊ฑธ์ ๋ ๋์๊ฐ์ด์.
๊ณ์ํด์ ๋ฐฐ์ฐ๊ณ , ์คํํ๊ณ , ์ฑ์ฅํ์ธ์! ๐
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.