๋จ์ผ ํ๋์ ๋ฌธ์ ์ ์ด ๋ญ์ง ์์๋์? ์ฃฝ์ผ๋ฉด ๊ทธ๋ฅ ๋์ ๋๋ค. ์๋์ผ๋ก ์ด์๋์ง ์์์. ๊ฒ๋ค๊ฐ ์ ๋ฒ์ ์ ๋ฐฐํฌํ๋ ค๋ฉด ๊ธฐ์กด ํ๋๋ฅผ ๋ด๋ฆฌ๊ณ ์ ๊ฑธ ์ฌ๋ฆฌ๋ ๋์ ์๋น์ค๊ฐ ๋๊น๋๋ค. ์ด ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋์์ ํด๊ฒฐํ๋ ๊ฒ Deployment์ ๋๋ค. ๊ณ ๊ฐ์ฉ์ฑ(HA)๊ณผ ๋ฌด์ค๋จ ๋ฐฐํฌ(Zero-downtime)๋ฅผ ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์์์ ์ฒ๋ฆฌํด์ฃผ์ฃ .
๐ฏ Deployment๊ฐ ํด๊ฒฐํ๋ 3๊ฐ์ง
- ๋ณต์ ์คํ: Replicas๋ก ํ๋๋ฅผ ์ฌ๋ฌ ๊ฐ ์ ์ง โ ํ๋ ์ฃฝ์ด๋ ๋๋จธ์ง๊ฐ ํธ๋ํฝ ์ฒ๋ฆฌ
- ๋กค๋ง ์ ๋ฐ์ดํธ: ๊ตฌ๋ฒ์ ํ๋๋ฅผ ํ๋์ฉ ๋ด๋ฆฌ๊ณ ์ ๋ฒ์ ์ ํ๋์ฉ ์ฌ๋ฆผ โ ์๋น์ค ๋ฌด์ค๋จ
- ๋กค๋ฐฑ: ์ ๋ฒ์ ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ์ด์ ๋ฒ์ ์ผ๋ก ์ฆ์ ๋ณต๊ตฌ
๐๏ธ Deployment ์์ฑ โ YAML ์์ฑ
# nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3 # ํ๋ 3๊ฐ๋ฅผ ํญ์ ์ ์ง
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.20 # ์ฒ์์ 1.20 ๋ฒ์ ์ผ๋ก ์์
ports:
- containerPort: 80
kubectl apply -f nginx-deployment.yaml
# ReplicaSet๊ณผ ํ๋๊ฐ ๋ชจ๋ ์์ฑ๋๋์ง ํ์ธ
kubectl get deployment,replicaset,pods
Deployment๋ฅผ ๋ง๋ค๋ฉด ์๋์ผ๋ก ReplicaSet์ด ์์ฑ๋๊ณ , ReplicaSet์ด ํ๋ 3๊ฐ๋ฅผ ๋ง๋ญ๋๋ค. Deployment โ ReplicaSet โ Pod ๊ตฌ์กฐ์ ๋๋ค.
๐ ๋กค๋ง ์ ๋ฐ์ดํธ
์ด์ nginx๋ฅผ 1.20์์ 1.21๋ก ์ฌ๋ ค๋ด
์๋ค.
kubectl set image deployment/nginx-deployment nginx=nginx:1.21
# ์ค์๊ฐ ์งํ ์ํฉ ํ์ธ
kubectl rollout status deployment/nginx-deployment
์
๋ฐ์ดํธ๊ฐ ์งํ๋๋ ๋์ kubectl get pods๋ฅผ ์น๋ฉด ์ด๋ฐ ๋ชจ์ต์ด ๋ณด์
๋๋ค:
NAME STATUS RESTARTS
nginx-deployment-old-xxx Terminating 0
nginx-deployment-new-yyy ContainerCreating 0
nginx-deployment-new-zzz Running 0
๊ตฌ๋ฒ์ (1.20) ํ๋๊ฐ ํ๋์ฉ ๋ด๋ ค๊ฐ๊ณ , ์ ๋ฒ์ (1.21) ํ๋๊ฐ ํ๋์ฉ ์ฌ๋ผ์ค๋ ๊ณผ์ ์ ๋๋ค. ์ด ๋์ ์๋น์ค๋ ๊ณ์ ์ด์์์ต๋๋ค.
โช ๋กค๋ฐฑ โ ๋ญ๊ฐ ์๋ชป๋์ ๋
๋ฐฐํฌ ํ์คํ ๋ฆฌ๋ฅผ ๋ณด๋ฉด ๊ฐ ๋ฒ์ ์ด Revision์ผ๋ก ๊ด๋ฆฌ๋ฉ๋๋ค.
# ๋ฐฐํฌ ์ด๋ ฅ ํ์ธ
kubectl rollout history deployment/nginx-deployment
# ์ด์ ๋ฒ์ (Revision 1)์ผ๋ก ๋กค๋ฐฑ
kubectl rollout undo deployment/nginx-deployment
# ํน์ ๋ฒ์ ์ผ๋ก ๋กค๋ฐฑํ๋ ค๋ฉด
kubectl rollout undo deployment/nginx-deployment --to-revision=1
# ๋กค๋ฐฑ ํ ์ด๋ฏธ์ง ๋ฒ์ ํ์ธ
kubectl describe deployment nginx-deployment | grep Image
๐ ๋กค๋ฐฑ์ ๋์ ์๋ฆฌ โ ํท๊ฐ๋ฆฌ๊ธฐ ์ฌ์ด ๋ถ๋ถ
๋กค๋ฐฑ ํ ํ์คํ ๋ฆฌ๋ฅผ ๋ณด๋ฉด ์ด์ํ ์ผ์ด ์ผ์ด๋ฉ๋๋ค.
REVISION CHANGE-CAUSE
2 nginx=nginx:1.21
3 nginx=nginx:1.20 โ rollback!
Revision 1์ด ์ฌ๋ผ์ง๊ณ 3์ด ์๊ฒผ์ต๋๋ค. ์์ผ๊น์?
์ฟ ๋ฒ๋คํฐ์ค์ ๋กค๋ฐฑ์ “์๊ฐ์ ๋๋๋ฆฌ๋” ๊ฒ ์๋๋๋ค. Revision 1์ ์ค์ ์ ๋ณต์ฌํด์ ์๋ก์ด Revision 3์ผ๋ก ์ ์ฉํ๋ ๊ฒ๋๋ค. Re-deployment์ฃ . ์ค๋ณต ๋ฐฉ์ง๋ฅผ ์ํด ๊ธฐ์กด Revision 1์ ๋ชฉ๋ก์์ ์ ๊ฑฐ๋ฉ๋๋ค. ์ด๊ฑด GitOps์ “์ ์ธ์ ์ํ ๊ด๋ฆฌ” ์ฒ ํ๊ณผ ์ ํํ ๊ฐ์ต๋๋ค.
๐จ ์ฝ์ง ํฌ์ธํธ โ ํ๋๊ฐ Pending์์ ์ ๋์ด๊ฐ์
Deployment๋ฅผ ๋ฐฐํฌํ๋๋ฐ ํ๋๊ฐ ์ฃ๋ค Pending ์ํ์ ๋ฉ์ถฐ์์์ต๋๋ค.
kubectl describe pod <ํ๋๋ช
>
Events์ ์ด๋ฐ ๋ฉ์์ง๊ฐ ์์์ต๋๋ค:
0/3 nodes are available: 1 node has taint {control-plane},
2 nodes had untolerated taint {node.kubernetes.io/unreachable}
ํด์ํ๋ฉด: ๋ง์คํฐ๋ ์ค์ผ์ค๋ง ์ ์ธ(์ ์)์ด๊ณ , ์์ปค ๋ ธ๋ 2๋๊ฐ “์ฐ๋ฝ ๋์ (Unreachable)” ์ํ๋ผ์ ํ๋ ๋ฐฐ์นํ ๊ณณ์ด ์๋ค๋ ๋ป์ ๋๋ค.
์์ธ์ VM์ ์ ์ ๋ชจ๋๋ก ๋๋ค๊ฐ ๊นจ์ด๋ ํ kubelet์ด ์ฃฝ์ด์์๋ ๊ฒ์ด์์ต๋๋ค.
# ๊ฐ ์์ปค ๋
ธ๋์์ ์คํ
sudo systemctl restart kubelet
์์ปค ๋
ธ๋ ์ํ๊ฐ Ready๋ก ๋์์ค์๋ง์ Pending์ด๋ ํ๋๋ค์ด ์ฆ์ Running์ผ๋ก ์ ํ๋์ต๋๋ค.
๐ก ์ ๋ฆฌ
Deployment๋ฅผ ์ฐ๋ฉด ์ฟ ๋ฒ๋คํฐ์ค๊ฐ “์ด ์ํ๋ฅผ ์ ์งํด์ค” ๋ผ๋ ์ ์ธ๋ง์ผ๋ก ํ๋ ๊ฐ์ ์ ์ง, ๋ฌด์ค๋จ ์ ๋ฐ์ดํธ, ๋กค๋ฐฑ์ ์ ๋ถ ์ฒ๋ฆฌํด์ค๋๋ค.
ํ๋๋ฅผ ๋จ์ผ๋ก ์ฐ๋ ๊ฑด DB ํ ์คํธ์ฉ์ด๋ ์ผํ์ฑ ์์ ์ธ์ ๊ฑฐ์ ์์ต๋๋ค. ์ค์ ์๋น์ค๋ ๋๋ถ๋ถ Deployment์ ๋๋ค.
๋ค์ ๊ธ์์๋ ์ด Deployment๋ค์ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๊ฒ ๋ง๋๋ Service๋ฅผ ๋ค๋ฃน๋๋ค.