๐Ÿ”„ ์„œ๋น„์Šค ์ค‘๋‹จ ์—†์ด ์—…๋ฐ์ดํŠธํ•˜๊ธฐ – Kubernetes Deployment ์™„์ „ ์ •๋ณต

๋‹จ์ผ ํŒŒ๋“œ์˜ ๋ฌธ์ œ์ ์ด ๋ญ”์ง€ ์•„์‹œ๋‚˜์š”? ์ฃฝ์œผ๋ฉด ๊ทธ๋ƒฅ ๋์ž…๋‹ˆ๋‹ค. ์ž๋™์œผ๋กœ ์‚ด์•„๋‚˜์ง€ ์•Š์•„์š”. ๊ฒŒ๋‹ค๊ฐ€ ์ƒˆ ๋ฒ„์ „์„ ๋ฐฐํฌํ•˜๋ ค๋ฉด ๊ธฐ์กด ํŒŒ๋“œ๋ฅผ ๋‚ด๋ฆฌ๊ณ  ์ƒˆ ๊ฑธ ์˜ฌ๋ฆฌ๋Š” ๋™์•ˆ ์„œ๋น„์Šค๊ฐ€ ๋Š๊น๋‹ˆ๋‹ค. ์ด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ๋™์‹œ์— ํ•ด๊ฒฐํ•˜๋Š” ๊ฒŒ 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๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.