๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Container/Kubernetes

[Kubernetes] ํŒŒ๋“œ์˜ ์ƒ์• ์ฃผ๊ธฐ(Lifecycle)์™€ ๋ฐฐํฌ ์ „๋žต

๋ฐ˜์‘ํ˜•

๐Ÿ”Š ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ์‹œ์ž‘ํ•˜์„ธ์š”! ๋„์ปค/์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ์ ์„ ์ฝ๊ณ  ๊ฐœ์ธ์ ์ธ ๋ชฉ์  ํ•˜์— ์ž‘์„ฑ๋˜๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค. ํฌ์ŠคํŒ…์— ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์ž๋ฃŒ๋Š” ์ œ๊ฐ€ ์ง์ ‘ ์žฌ๊ตฌ์„ฑํ•˜์˜€์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
 

Kubernetes

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋Š” ํŒŒ๋“œ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ, ํŒŒ๋“œ์˜ ์ƒํƒœ๊ฐ’์— ๋”ฐ๋ผ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ํŒŒ๋“œ์˜ ์ƒํƒœ๋Š” ํŒŒ๋“œ์˜ ์ƒ์• ์ฃผ๊ธฐ(Lifecycle)๋ผ๋Š” ๊ฒƒ ์•ˆ์— ๋‹ค์–‘ํ•œ ์ƒํƒœ ์ข…๋ฅ˜๋กœ ์กด์žฌํ•œ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ํŒŒ๋“œ์˜ ์ƒ์• ์ฃผ๊ธฐ๋ฅผ ์•Œ์•„๋ณด๋ฉด์„œ ํŒŒ๋“œ์˜ ์ƒํƒœ์— ์–ด๋–ค ์ข…๋ฅ˜๋“ค์ด ์žˆ๊ณ , ๊ทธ ์˜๋ฏธ๊ฐ€ ๋ฌด์—‡์ธ์ง€, ๋” ๋‚˜์•„๊ฐ€ ์ด ์ƒ์• ์ฃผ๊ธฐ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๋ฐฐํฌ ์ „๋žต(a.k.a ๋ธ”๋ฃจ ๊ทธ๋ฆฐ, ๋กค๋ง ์—…๋ฐ์ดํŠธ)์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.
 
์ง€๊ธˆ๊นŒ์ง€๋Š” ํŒŒ๋“œ, ๋””ํ”Œ๋กœ์ด๋จผํŠธ, ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ๋“ฑ ๋ชจ๋“  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋‹จ์ˆœํžˆ kubectl apply -f ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐฐํฌํ•ด์™”๋‹ค. ์ข€ ๋” ๊ณ ๋„ํ™”๋œ ๋ฐฉ์‹์œผ๋กœ ์š”์ฆ˜์€ Spinnaker, Helm, Kustomize, ArgoCD, Jenkins ์™€ ๊ฐ™์€ ์ง€์†์  ๋ฐฐํฌ ๋„๊ตฌ(CD)๋ฅผ ์ด์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์™ธ๋ถ€์˜ ๋ฐฐํฌ ๋„๊ตฌ์— ๋Œ€ํ•œ ์„ค๋ช… ๋ณด๋‹ค๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์ž์ฒด์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ํŒŒ๋“œ ๋ฐฐํฌ ์ „๋žต์— ๋Œ€ํ•ด ๋‹ค๋ฃจ์–ด ๋ณด๋ ค๊ณ  ํ•œ๋‹ค.
 
์šฐ์„  ๋ฐฐํฌ ์ „๋žต์€ ๋Œ€์ฒด ์™œ ํ•„์š”ํ• ๊นŒ? ํ•˜๋‚˜ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž. ์šฐ๋ฆฌ๋Š” ํ˜„์žฌ v1 ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ๋“œ๋ฅผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— ๋ฐฐํฌํ•œ ์ƒํƒœ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ด์„œ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋กœ์ง์ด ๋ฐ˜์˜๋œ v2 ๋ผ๋Š” ์ด๋ฆ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ๋“œ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐํฌํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์— ์ง๋ฉดํ–ˆ๋‹ค. v1์—์„œ v2 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ฐ€์žฅ ๋‹จ์ˆœ๋ฌด์‹(?)ํ•œ ๋ฐฉ๋ฒ•์€ kubectl delete, create ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ v1 ์ด๋ฆ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ๋“œ๋ฅผ kubectl delete ๋ช…๋ น์–ด๋กœ ์‚ญ์ œํ•˜๊ณ , ๊ณง๋ฐ”๋กœ v2 ์ด๋ฆ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ๋“œ๋ฅผ kubectl apply ๋ช…๋ น์–ด๋กœ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
 
ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค. ์™œ๋ƒํ•˜๋ฉด v1์„ ์‚ญ์ œํ•˜๊ณ  v2์„ ๋ฐฐํฌํ•  ๋•Œ, ๊ทธ ์ค‘๊ฐ„์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋‹ค์šด ํƒ€์ž„์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ๋˜ํ•œ v1์„ ์‚ญ์ œํ•˜๋Š” ์ˆœ๊ฐ„ ๊ทธ ์ˆœ๊ฐ„์— ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ v1 ํŒŒ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ์„ํ…๋ฐ, ์ฒ˜๋ฆฌํ•˜๋Š” ์ค‘๊ฐ„์— ํŒŒ๋“œ๋ฅผ ์‚ญ์ œํ•ด๋ฒ„๋ฆฌ๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” v1 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒŒ๋“œ๋กœ๋ถ€ํ„ฐ ์•Œ ์ˆ˜ ์—†๋Š” ์‘๋‹ต์„ ๋ฐ›๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

1. ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ด์šฉํ•ด ๋กค๋ง ์—…๋ฐ์ดํŠธ ์ˆ˜ํ–‰ํ•˜๊ธฐ

๋ฐฉ๊ธˆ ์†Œ๊ฐœํ•œ ์ƒํ™ฉ ์ฆ‰, ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ํŒŒ๋“œ๋กœ ๋‹ค์šดํƒ€์ž„ ์—†์ด ์˜ฎ๊ธฐ๊ธฐ ์œ„ํ•ด์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ด์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ๋กค๋ง ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์‚ฌ์‹ค ์ด ๊ธฐ๋Šฅ์€ ์ด์ „ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ๋ฐฐ์šฐ๋Š” ํฌ์ŠคํŒ…์—์„œ ์†Œ๊ฐœํ•œ ์ ์ด ์žˆ์—ˆ๋‹ค. ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋Š” ๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์˜ ๋ฆฌ๋น„์ „ ๊ด€๋ฆฌ, ๋กค๋ฐฑ ๊ธฐ๋Šฅ, ๋กค๋ง ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋Š” ๋ ˆํ”Œ๋ฆฌ์นด์…‹์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ €์žฅํ•˜๋Š” ๋ฆฌ๋น„์ „(reivison)์„ ๊ด€๋ฆฌํ•จ์œผ๋กœ์จ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กค๋ฐฑ, ๋กค๋ง ์—…๋ฐ์ดํŠธ๋ฅผ ์‰ฝ๊ฒŒํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
 
์ด์ „ ํฌ์ŠคํŒ…์—์„œ๋„ ์†Œ๊ฐœํ–ˆ์ง€๋งŒ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ •์˜ํ•˜๊ณ  kubectl apply ๋ช…๋ น์–ด ์ˆ˜ํ–‰ ์‹œ, --record ์˜ต์…˜์„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ ˆํ”Œ๋ฆฌ์นด์…‹์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ•ด๋‹น ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ํžˆ์Šคํ† ๋ฆฌ์— ๊ธฐ๋ก๋œ๋‹ค. ์ฐธ๊ณ ๋กœ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ ํžˆ์Šคํ† ๋ฆฌ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฒ„์ „์˜ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์˜ ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ด๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ •์˜ํ•˜๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— spec.revisionHistoryLimit ์œผ๋กœ ๊ฐ’์„ ๋ช…์‹œํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
 
๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ ๋กค๋ง ์—…๋ฐ์ดํŠธ๋ผ๋Š” ์ผ์ข…์˜ ๋ฐฐํฌ ์ „๋žต ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, ์‚ฌ์‹ค ๋กค๋ง ์—…๋ฐ์ดํŠธ ๋ง๊ณ ๋„ ReCreate ๋ผ๋Š” ๋ฐฐํฌ ์ „๋žต ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•œ๋‹ค. ReCreate ๋ฐฉ๋ฒ•์€ ๋กค๋ง ์—…๋ฐ์ดํŠธ์™€๋Š” ๋‹ฌ๋ฆฌ ๋‹ค์šด ํƒ€์ž„์„ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ๋ฐฐํฌ ์ „๋žต์ด๋‹ค. ReCreate์™€ ๋กค๋ง ์—…๋ฐ์ดํŠธ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ๋„์‹ํ™” ํ•ด๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ Recreate ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌ ์ „๋žต์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด?

 
t0 ์—์„œ t2 ๋กœ ์‹œ๊ฐ„์ด ํ๋ฅธ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. t0์—์„œ๋Š” version 1 ์ด๋ผ๋Š” ๋ ˆํ”Œ๋ฆฌ์นด์…‹์ด ์ƒ์„ฑ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ œ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์ธ version 2๋ฅผ ๋ฐฐํฌํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ์ด ๋•Œ, ๋งŒ์•ฝ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ๋ฐฐํฌ ์ „๋žต์ด Recreate์ธ ์ƒํƒœ๋ผ๋ฉด t1 ์ผ๋•Œ version 1 ์ด๋ผ๋Š” ๋ ˆํ”Œ๋ฆฌ์นด์…‹์ด ๋ชจ๋‘ ์‚ญ์ œ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚œ ๋’ค, t2 ์‹œ์ ์— ๊ฐ€์„œ์•ผ version 2 ๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์ด ์ƒ์„ฑ๋œ๋‹ค. ์ด๋Ÿฐ Recreate ๋ฐฐํฌ ์ „๋žต์€ ๋‹น์—ฐํ•˜๊ฒŒ๋„ t1 ์‹œ์ ์—๋Š” ๋‹ค์šดํƒ€์ž„์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ Recreate ๋ฐฐํฌ ์ „๋žต์€ ์ผ์‹œ์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•ด๋„ ๊ดœ์ฐฎ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋””ํ”Œ๋กœ์ด๋จผํŠธ์— ๋ฐฐํฌ ์ „๋žต์„ Recreate๋กœ ๋ช…์‹œํ•˜๋Š” ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-reCreate
spec:
  replicas: 3
  selector:
    matchLabels:
      app: testApp
  strategy:
    type: Recreate
  template:
    metadata:
      name: nginx-pod
      labels:
        app: testApp
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

 
์ด์ œ ๋‹ค์Œ์œผ๋กœ ์•Œ์•„๋ณผ ๋ฐฐํฌ ์ „๋žต์€ ๋กค๋ง ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹์ด๋‹ค. ๋กค๋ง ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹์€ Recreate ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋‹ค์šด ํƒ€์ž„์ด ์—†๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•œ๋‹ค. ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ RollingUpdate ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌ์ „๋žต์„ ๊ฐ€์ ธ๊ฐ„๋‹ค๋ฉด?

 
๊ทธ๋ฆผ์„ ๋ณด๋ฉด t1 ๊ณผ t2 ์ผ ๋•Œ version 1 ๊ณผ 2์˜ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์ด ๊ณต์กดํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ๋ณผ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์ฆ‰, ๋กค๋ง ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹์€ ๊ธฐ์กด์˜ ํŒŒ๋“œ์™€ ์ƒˆ๋กœ์šด ํŒŒ๋“œ๋ฅผ ์กฐ๊ธˆ์”ฉ ์‚ญ์ œ ๋ฐ ์ƒ์„ฑํ•˜๋ฉด์„œ ์ง„ํ–‰๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค์šดํƒ€์ž„์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์œผ๋ฉด์„œ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค. 
 
๋กค๋ง ์—…๋ฐ์ดํŠธ์— ๋Œ€ํ•œ ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” ์‹œ๊ฐ„์ด ํ๋ฆ„์— ๋”ฐ๋ผ ํŒŒ๋“œ ํ•˜๋‚˜์”ฉ์„ ์‚ญ์ œ ๋ฐ ์ƒ์„ฑํ•˜๋„๋ก ๋‚˜ํƒ€๋‚ด์—ˆ์ง€๋งŒ, ๋ช‡ ๊ฐœ๋ฅผ ํ•œ ๋ฒˆ์— ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑํ• ์ง€๋„ ์‚ฌ์šฉ์ž๊ฐ€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์„ ์–ธ์ ์œผ๋กœ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ์šฐ์„  ๋กค๋ง ์—…๋ฐ์ดํŠธ ์ „๋žต์„ ๊ฐ€์ ธ๊ฐ€๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ์˜ˆ์‹œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-rollingupdate
spec:
  replicas: 3
  selector:
    matchLabels:
      app: testApp
  strategy:
    type: RollingUpdate   # ๋ฐฐํฌ ์ „๋žต์„ ๋ณ€๊ฒฝ
    rollingUpdate:        # ๋กค๋ง ์—…๋ฐ์ดํŠธ ์‹œ ์˜ต์…˜ ๋ช…์‹œ
      maxSurge: 2
      maxUnavailable: 2
  template:
    metadata:
      name: nginx-pod
      labels:
        app: testApp
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

 
์œ„ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ spec.strategy ์˜์—ญ์„ ๋ณด์ž. RollingUpdate ๋กœ type์„ ๋ฐ”๊พผ ๋’ค, maxSurge, maxUnavailable ์ด๋ผ๋Š” ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด์„œ ๋กค๋ง ์—…๋ฐ์ดํŠธ์˜ ์„ค์ •์„ ๋ช…์‹œํ•ด์ฃผ์—ˆ๋‹ค. ์ด ์˜ต์…˜์€ ๋กค๋ง ์—…๋ฐ์ดํŠธ์˜ ์†๋„๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” ์ˆซ์ž ๊ฐ’์„์œผ๋กœ '๊ฐœ์ˆ˜'๋ฅผ ๋ช…์‹œํ–ˆ์ง€๋งŒ, '๋น„์œจ(%)'ํ˜•ํƒœ๋กœ๋„ ๋ช…์‹œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฐธ๊ณ ๋กœ ๋น„์œจ์„ ๋ช…์‹œํ•  ๊ฒฝ์šฐ, maxSurge์˜ ์†Œ์ˆ˜์  ๊ฐ’์€ ๋ฐ˜์˜ฌ๋ฆผ๋˜๊ณ , maxUnavailable์€ ์†Œ์ˆ˜์ ์ด ๋‚ด๋ฆผ์ฒ˜๋ฆฌ๋œ๋‹ค. ๊ฐ ์˜ต์…˜์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

  • maxUnavailable : ๋กค๋ง ์—…๋ฐ์ดํŠธ ๋„์ค‘ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ ์ฆ‰, ์‚ญ์ œ ๋Œ€์ƒ ํŒŒ๋“œ์ด์ž ๊ธฐ์กด ๋ฒ„์ „์˜ ํŒŒ๋“œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ตœ๋Œ€ ๋ช‡ ๊ฐœ๋ฅผ ์‚ญ์ œํ• ์ง€๋ฅผ ๋ช…์‹œํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ๊ฐ’์„ 2๋กœ ์„ค์ •ํ–ˆ๋‹ค๋ฉด, ํ•œ๊บผ๋ฒˆ์— ์‚ญ์ œ๋  ํŒŒ๋“œ ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ 2๊ฐœ์ž„์„ ์˜๋ฏธ.
  • maxSurge : ๋กค๋ง ์—…๋ฐ์ดํŠธ ๋„์ค‘ ์ „์ฒด ํŒŒ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ replicas ๊ฐœ์ˆ˜๋ณด๋‹ค ์–ผ๋งˆ๋‚˜ ๋” ๋งŽ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค์ •ํ•œ๋‹ค. ์ฆ‰, ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•  ํŒŒ๋“œ์ด์ž ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ํŒŒ๋“œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ƒ์„ฑํ•  ๊ฐœ์ˆ˜๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ์˜๋ฏธํ•œ๋‹ค. ์ด ๊ฐ„์ ‘์ ์œผ๋กœ ์˜๋ฏธํ•œ๋‹ค๋Š” ๋œป์€ ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ ์ดํ•ดํ•ด๋ณด์ž.

maxSurge ์™€ maxUnavailable์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ์ข€ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์•„๊นŒ ์œ„์—์„œ ์‚ดํŽด๋ณธ ๊ทธ๋ฆผ์„ ๊ฐ€์ง€๊ณ  ์ดํ•ดํ•ด๋ณด๋„๋ก ํ•˜์ž.
 

 
t0 ์‹œ์ ์—๋Š” version 1์˜ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์ด ์šด์˜๋˜๊ณ  ์žˆ๋‹ค๊ฐ€ t1 ์‹œ์ ์ด ๋˜์–ด version 2์˜ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์ด ๋ฐฐํฌ๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ๋•Œ, version 1์˜ ํŒŒ๋“œ๋Š” 1๊ฐœ๋งŒ ์‚ญ์ œ๋˜์—ˆ๋‹ค. 1๊ฐœ๋งŒ ์‚ญ์ œ๊ฐ€ ๋œ ์ด์œ ๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ maxUnavailable์ด 2์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ฆ‰, version 1์ด ํ•œ๊บผ๋ฒˆ์— ์‚ญ์ œ๋  ์ˆ˜ ์žˆ๋Š” ํŒŒ๋“œ์˜ '์ตœ๋Œ€' ๊ฐœ์ˆ˜๋Š” 2๊ฐœ์ด๋ฏ€๋กœ(๋ฐ˜๋“œ์‹œ 2๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด 2๊ฐœ ์ดํ•˜์ด๋‹ค) ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” 1๊ฐœ๋งŒ ์‚ญ์ œ๋˜๋„๋ก ์˜ˆ์‹œ๋ฅผ ๋“ค์—ˆ๋‹ค. ๊ทธ์™€ ๋™์‹œ์— version 2๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ํŒŒ๋“œ๋Š” ํ•œ๊บผ๋ฒˆ์— 3๊ฐœ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ–ˆ๋˜ ์ด์œ ๋Š” maxSurge ๊ฐ’์ด 2์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋  ํŒŒ๋“œ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋Š” replicas ๊ฐ’๊ณผ maxSurge ๊ฐ’์˜ ํ•ฉ์œผ๋กœ ๊ฒฐ์ •์ด ๋˜๋Š”๋ฐ, ์œ„ ์˜ˆ์‹œ ์ƒ์œผ๋กœ๋Š” replicas๊ฐ€ 3์ด๊ณ , maxSurge๊ฐ€ 2์ด๋ฏ€๋กœ ๋‘ ํ•ฉ์ด 5์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ๋กค๋ง ์—…๋ฐ์ดํŠธ ๋„์ค‘ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ๋“œ์˜ ์ „์ฒด ๊ฐœ์ˆ˜๋Š” ์ตœ๋Œ€ 5๊ฐœ๊นŒ์ง€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ด์•ผ๊ธฐ๋‹ค. t1 ์‹œ์ ์— version 2๋ผ๋Š” ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ํŒŒ๋“œ 3๊ฐœ๊ฐ€ ๋ชจ๋‘ ์ƒ์„ฑ๋˜๋”๋ผ๋„ version 1์˜ ํŒŒ๋“œ 2๊ฐœ๋ž‘ ๊ฐœ์ˆ˜๋ฅผ ํ•ฉ์ณ๋„ 5๊ฐœ์ด๋ฏ€๋กœ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ํŒŒ๋“œ 3๊ฐœ๊ฐ€ ํ•œ๊บผ๋ฒˆ์— ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  t2 ์‹œ์ ์— version 1์˜ ํŒŒ๋“œ 2๊ฐœ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. 2๊ฐœ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋„ maxUnavailable์ด 2์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
 
์ด๋Ÿฌํ•œ ๋กค๋ง ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹์—์„œ ์ฃผ์˜ํ•  ์ ์€ ์œ„ ๊ทธ๋ฆผ์—์„œ t1 ์‹œ์ ์ฒ˜๋Ÿผ version 1๊ณผ version 2์˜ ํŒŒ๋“œ๋“ค์ด ๋™์‹œ์— ์กด์žฌํ•˜๋Š” ์ˆœ๊ฐ„์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๋ง์€ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋ณด๋‚ด๋Š” ์š”์ฒญ์„ version 1, version 2 ๋ชจ๋‘ ๋ฐ›์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋ณด๋‚ด๋Š” ์š”์ฒญ์— ๋งž์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง„ version์˜ ํŒŒ๋“œ๋Š” ๊ต์ฒด๋  ๋•Œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋จ์— ์ฃผ์˜ํ•˜์ž.
 
๋ฐฉ๊ธˆ ์–ธ๊ธ‰ํ•œ ๋กค๋ง ์—…๋ฐ์ดํŠธ์˜ ๋‹จ์  ์ฆ‰, 2๊ฐ€์ง€ ๋ฒ„์ „์˜ ํŒŒ๋“œ๊ฐ€ ๊ณต์กดํ•œ๋‹ค๋Š” ์ ๋„ ํ•ด๊ฒฐํ•˜๊ณ  ๋‹ค์šดํƒ€์ž„์ด ์—†๋„๋ก ํ•  ์ˆ˜ ์žˆ๋Š” ๋ธ”๋ฃจ ๊ทธ๋ฆฐ ๋ฐฐํฌ ๋ฐฉ์‹์ด๋ผ๋Š” ๊ฒƒ๋„ ์กด์žฌํ•œ๋‹ค. ๋ธ”๋ฃจ ๊ทธ๋ฆฐ ๋ฐฐํฌ๋Š” ๊ธฐ์กด ๋ฒ„์ „์˜ ํŒŒ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋†”๋‘” ์ƒํƒœ์—์„œ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ํŒŒ๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๋ชจ๋‘ ์ƒ์„ฑํ•ด๋†“๊ณ , ์„œ๋น„์Šค ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ์˜ ๋ผ์šฐํŒ…๋งŒ ๊ธฐ์กด ๋ฒ„์ „์—์„œ ์ƒˆ๋กœ์šด ๋ฒ„์ „์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฐํฌ ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
 

๋ธ”๋ฃจ ๊ทธ๋ฆฐ ๋ฐฐํฌ ๋ฐฉ์‹์„ ์„ ํƒํ•œ๋‹ค๋ฉด?

 
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธ”๋ฃจ ๊ทธ๋ฆฐ ๋ฐฐํฌ ๋ฐฉ์‹์„ ์ œ๊ณตํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ์™ธ๋ถ€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์ง์ ‘ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜์ •ํ•จ์œผ๋กœ์จ ์ ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ๋ชจ๋‘ ์ƒ์„ฑํ•ด๋†“์€ ๋’ค, Service ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” ๋ผ๋ฒจ์„ ๊ธฐ์กด ๋””ํ”Œ๋กœ์ด๋จผํŠธ์—์„œ ์ƒˆ๋กœ์šด ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ผ์šฐํŒ…๋งŒ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ๋ฌผ๋ก  ์ด๋Ÿฐ ๊ฒฝ์šฐ ๊ธฐ์กด ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์‚ญ์ œํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ธ”๋ฃจ ๊ทธ๋ฆฐ ๋ฐฉ์‹์€ ๋กค๋ง ์—…๋ฐ์ดํŠธ์™€ Recreate ๋ฐฉ์‹์˜ ๋‹จ์ ์„ ๋ชจ๋‘ ๋ณด์™„ํ•˜๊ธด ํ•˜์ง€๋งŒ, ๊ธฐ์กด ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ์‹ ๊ทœ ๋””ํ”Œ๋กœ์ด๋จผํŠธ 2๊ฐœ๊ฐ€ ๋ชจ๋‘ ํ•œ๊บผ๋ฒˆ์— ์ƒ์„ฑ๋œ๋‹ค๋Š” ์ ์—์„œ ์ผ์‹œ์ ์œผ๋กœ ์ „์ฒด ์ž์›์„ ๋งŽ์ด ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

2. ๋กค๋ง ์—…๋ฐ์ดํŠธ๊ฐ€ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ๊ฒƒ : ํŒŒ๋“œ์˜ ์ƒ์• ์ฃผ๊ธฐ(Lifecycle)

1๋ฒˆ ๋ชฉ์ฐจ์—์„œ ์•Œ์•„๋ณธ ๋ฐฐํฌ ์ „๋žต ์ค‘ ๋กค๋ง ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” ๊ธฐ์กด ํŒŒ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž˜ ์ข…๋ฃŒ๋˜์—ˆ๋Š”์ง€, ๋˜ ์ƒˆ๋กœ์šด ํŒŒ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž˜ ์‹คํ–‰๋˜์–ด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋งž์ดํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์ผ๋‹จ ๊ธฐ์กด ํŒŒ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ์‹œ์—, ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋˜ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋๊นŒ์ง€ ์™„๊ฒฐ์„ฑ ์žˆ๊ฒŒ ์ฒ˜๋ฆฌํ•œ ํ›„ ์ข…๋ฃŒ๋˜์–ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ํŒŒ๋“œ์˜ ์ƒํƒœ(status)๊ฐ€ Running์ด ๋˜์—ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„, ํŒŒ๋“œ ์ปจํ…Œ์ด๋„ˆ์˜ init ํ”„๋กœ์„ธ์Šค(์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ง„์ž…ํ•˜๋Š” entrypoint๋กœ์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค)๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋ฐ ๊ฝค ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค๋ฉด ๊ทธ ๋™์•ˆ์—๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ค€๋น„๊ฐ€ ์•ˆ๋˜์–ด์žˆ์„ ์ƒํƒœ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.
 
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ด๋ ‡๊ฒŒ ๊ธฐ์กด ํŒŒ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์ฒ˜๋ฆฌ ์ค‘์ด๋˜ ์š”์ฒญ์„ ๋งˆ๋ฌด๋ฆฌํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ข…๋ฃŒํ•˜๋„๋ก ํ•˜๋Š” Graceful Shutdown์„ ํ•˜๋„๋ก, ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋œ ๋’ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ„๋„์˜ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ livenessProbe, readinessProbe, startupProbe๊ฐ€ ์žˆ๋‹ค. ๋‹ค๋งŒ ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜๋“ค์˜ ๊ธฐ๋Šฅ์„ ์•Œ์•„๋ณด๊ธฐ ์ „์— ์šฐ๋ฆฌ๋Š” ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๊ธฐ ๋ถ€ํ„ฐ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€์˜ ๋‹จ๊ณ„๋ฅผ ์˜๋ฏธํ•˜๋Š” ํŒŒ๋“œ์˜ ์ƒ์• ์ฃผ๊ธฐ(Lifecycle)์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
 
ํŒŒ๋“œ์˜ ์ƒ์• ์ฃผ๊ธฐ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. ๊ฐœ๊ด„์ ์œผ๋กœ ๋จผ์ € ์˜๋ฏธ๋ฅผ ์‚ดํŽด๋ณด๊ณ , ์„ธ๋ถ€์ ์ธ ์˜๋ฏธ๋ฅผ ๊ฐ๊ฐ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž.

  • Pending : ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” API ์š”์ฒญ์ด kupe api server์— ์˜ํ•ด ์Šน์ธ๋˜์—ˆ์ง€๋งŒ, ์–ด๋– ํ•œ ์ด์œ ๋กœ ํŒŒ๋“œ๊ฐ€ ์•„์ง ์‹ค์งˆ์ ์œผ๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋ฅผ ์˜๋ฏธ. ์—ฌ๊ธฐ์„œ '์–ด๋– ํ•œ ์ด์œ '๋ผ ํ•จ์€ ๋Œ€ํ‘œ์ ์œผ๋กœ ํŒŒ๋“œ๊ฐ€ ์Šค์ผ€์ฅด๋ง๋  ๋…ธ๋“œ๊ฐ€ ์•„์ง ์„ ์ •๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.
  • Running : ํŒŒ๋“œ์— ํฌํ•จ๋œ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋“ค์ด ์ž˜ ์ƒ์„ฑ๋˜์–ด ํŒŒ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ ์ƒํƒœ. ์ด๋Ÿฌํ•œ ์ƒํƒœ๋ฅผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋Š” ๋ฐ”๋žŒ์งํ•œ(Desired) ์ƒํƒœ๋ผ๊ณ  ๋ถ€๋ฆ„. ๋‹ค๋งŒ, ์œ„์—์„œ๋„ ์–ธ๊ธ‰ํ–ˆ์ง€๋งŒ Running ์ƒํƒœ๊ฐ€ ๋๋”๋ผ๋„ ๋ฌด์กฐ๊ฑด์ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋งž์ดํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง„ ์•Š์Œ
  • Completed : ํŒŒ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ ๋’ค ์ข…๋ฃŒ๋˜์—ˆ์Œ์„ ์˜๋ฏธ. ์ฆ‰, ํŒŒ๋“œ ์ปจํ…Œ์ด๋„ˆ์˜ init ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ์ฝ”๋“œ(exit code)๊ฐ€ 0์„ ๋ฐ˜ํ™˜ํ•œ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธ(์ด '์ข…๋ฃŒ ์ฝ”๋“œ'๋ผ ํ•จ์€ ์˜ˆ์ „ ๋ฆฌ๋ˆ…์Šค ์…ธ ์Šคํฌ๋ฆฝํŠธ ํฌ์ŠคํŒ…์—์„œ ๋ฐฐ์šด์ ์ด ์žˆ์œผ๋ฏ€๋กœ ์ฐธ๊ณ )
  • Error : ํŒŒ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ข…๋ฃŒ๋˜์—ˆ์Œ์„ ์˜๋ฏธ. ์ฆ‰ ํŒŒ๋“œ ์ปจํ…Œ์ด๋„ˆ์˜ init ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ 0์ด ์•„๋‹Œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธ
  • Terminating : ํŒŒ๋“œ๊ฐ€ ์‚ญ์ œ ๋˜๋Š” ํ‡ด๊ฑฐ(Eviction)๋˜๊ธฐ ์œ„ํ•ด ์‚ญ์ œ ์ƒํƒœ์— ๋จธ๋ฌผ๋Ÿฌ ์žˆ๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹น

2-1. ์ž˜ ์ข…๋ฃŒ๋˜์—ˆ๊ฑฐ๋‚˜ ๋ง๊ฑฐ๋‚˜ : Completed, Error

๋จผ์ € ์•Œ์•„๋ณผ ํŒŒ๋“œ์˜ ์ƒ์• ์ฃผ๊ธฐ ์ƒํƒœ ๊ฐ’์œผ๋กœ๋Š” Completed ์™€ Error์ด๋‹ค. ์ด ์ƒํƒœ ๊ฐ’๋“ค์€ ํŒŒ๋“œ ์ปจํ…Œ์ด๋„ˆ์˜ init ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ 0์œผ๋กœ ๋ฐ˜ํ™˜ํ–ˆ๋Š๋ƒ ๋˜๋Š” 0์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ˆซ์ž๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ๋Š๋ƒ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค. ์—ฌ๊ธฐ์„œ 'init ํ”„๋กœ์„ธ์Šค' ๋ผ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ ์ƒ์†Œํ•  ์ˆ˜ ์žˆ๋‹ค. init ํ”„๋กœ์„ธ์Šค๋Š” ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์ด ๊ตฌ๋™๋  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์„ธ์Šค๋กœ์„œ ์ผ๋ฐ˜์ ์œผ๋กœ PID ๊ฐ’์ด 1๋ฒˆ์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ์ต์ˆ™ํ•œ Docker๋กœ ์น˜๋ฉด Dockerfile ํŒŒ์ผ ๋‚ด์šฉ์— ์„ค์ •๋œ CMD์™€ ENTRYPOINT ๋ช…๋ น์–ด์˜ ์กฐํ•ฉ์ด init ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋œ๋‹ค. ๋˜ํ•œ ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋“ค์˜ ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” "docker ps" ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ฝ˜์†”์— ์ถœ๋ ฅ๋˜๋Š” ๋‚ด์šฉ ์ค‘ "COMMAND" ํ•ญ๋ชฉ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์ด init ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋œ๋‹ค.
 
์ด๋Ÿฌํ•œ init ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ช…๋ น์–ด๊ฐ€ ์ž˜ ๋™์ž‘ํ–ˆ๋‹ค๋ฉด ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ 0์œผ๋กœ, ์ž˜ ๋™์ž‘ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด 0์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.(init ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋Š” ๋งˆ์น˜ ํ•จ์ˆ˜์˜ return ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค) ๊ทธ๋ž˜์„œ ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ 0์ด๋ฉด ํŒŒ๋“œ์˜ ์ƒํƒœ๊ฐ€ Completed๋ฅผ, 0์ด ์•„๋‹ˆ๋ผ๋ฉด Error ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
 
๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์ด Completed, Error์™€ ๊ด€๋ จ๋˜์–ด์„œ ํŒŒ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” restartPolicy ๋ผ๋Š” ํŠน์„ฑ์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค. restartPolicy๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ํŒŒ๋“œ๊ฐ€ ์žฌ์‹œ์ž‘ํ•˜๋Š” ์ •์ฑ…์„ ๋ฌด์—‡์œผ๋กœ ํ•  ๊ฒƒ์ธ์ง€ ๋ช…์‹œํ•˜๋Š” ๊ฐ’์ด๋‹ค. ์ข…๋ฅ˜์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์กด์žฌํ•œ๋‹ค.

  • Always : ํŒŒ๋“œ์˜ ์ข…๋ฃŒ ์ƒํƒœ๊ฐ€ Completed ๋˜, Error์ด๋˜ ํŒŒ๋“œ๊ฐ€ ๊ณ„์†ํ•ด์„œ ๋‹ค์‹œ ์‹คํ–‰(Restart)๋œ๋‹ค.
  • Never : ํŒŒ๋“œ์˜ ์ข…๋ฃŒ ์ƒํƒœ๊ฐ€ Completed ๋˜, Error์ด๋˜ ํŒŒ๋“œ๋Š” ๋” ์ด์ƒ ๋‹ค์‹œ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
  • OnFailure : ํŒŒ๋“œ์˜ ์ข…๋ฃŒ ์ƒํƒœ๊ฐ€ Error ์ผ ๋•Œ๋งŒ ํŒŒ๋“œ๊ฐ€ ๊ณ„์†ํ•ด์„œ ๋‹ค์‹œ ์‹คํ–‰ ๋œ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด restartPolicy ๊ฐ’์„ ๋ณ„๋„๋กœ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ Always ๋ผ๋Š” ๊ฐ’์ด ๋ช…์‹œ๋˜์–ด ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ "๋‚ด๊ฐ€ ์ƒ์„ฑํ•œ ํŒŒ๋“œ๊ฐ€ ์ž˜ ์ข…๋ฃŒ๋˜๋ฉด ๋” ์ด์ƒ ์‹คํ–‰๋˜๊ธธ ์›ํ•˜์ง€ ์•Š์•„" ๋ผ๊ณ  ์˜๋„ํ–ˆ๋Š”๋ฐ, ํ•ด๋‹น ํŒŒ๋“œ๊ฐ€ ๊ณ„์† ์žฌ์‹œ์ž‘ํ•ด์„œ RESTART ํ•ญ๋ชฉ ์ˆ˜๊ฐ€ ๊ณ„์† ์ฆ๊ฐ€ํ•œ๋‹ค๋ฉด restartPolicy ๊ฐ’์„ ์˜๋„์— ๋งž๊ฒŒ ๋ช…์‹œํ•ด๋ณด๋„๋ก ํ•˜์ž. ์‹ค์ œ๋กœ, Never, OnFailure ์™€ ๊ฐ™์€ restartPolicy ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ๋“œ๋Š” ์ฃผ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์ŠคํŠธ์˜ Job์ด๋‚˜ CronJob ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋˜๋Š” ํŒŒ๋“œ๋“ค์—์„œ ์‚ฌ์šฉํ•œ๋‹ค.
 
๊ทธ๋ฆฌ๊ณ  ์ฐธ๊ณ ๋กœ ํŒŒ๋“œ์˜ ์ƒํƒœ๊ฐ€ Error๋กœ ๋ฐœ์ƒํ•ด์„œ ํŒŒ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ์žฌ์‹œ์ž‘ํ•  ๋•Œ, ์ฆ‰์‹œ ์žฌ์‹œ์ž‘๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์ค‘๊ฐ„์— ํŒŒ๋“œ๊ฐ€ ์ƒ์• ์ฃผ๊ธฐ์˜ ๋˜ ๋‹ค๋ฅธ ์ƒํƒœ ๊ฐ’์— ์ž ์‹œ ๋จธ๋ฌด๋ฅด๋Š”๋ฐ, ์ด ์ƒํƒœ๊ฐ€ ๋ฐ”๋กœ CrashLoopBackOff ๋ผ๋Š” ์ƒํƒœ์ด๋‹ค. ์ด ์ƒํƒœ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์–ด๋– ํ•œ ์ž‘์—…์ด ์‹คํŒจํ–ˆ์„ ๋•Œ, ์ผ์ • ๊ฐ„๊ฒฉ์„ ๋‘๊ณ  ํ•ด๋‹น ์ž‘์—…์„ ์žฌ์‹œ๋„ํ•˜๋Š”๋ฐ, ์ด ๋•Œ ์ผ์ • ๊ฐ„๊ฒฉ๋™์•ˆ ํŒŒ๋“œ๊ฐ€ ๋จธ๋ฌผ๋Ÿฌ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋ฐ”๋กœ CrashLoopBackOff์ด๋‹ค. ๋‹ค๋งŒ, ์ด CrashLoopBackOff ์ƒํƒœ์— ๋จธ๋ฌด๋Š” ๊ธฐ๊ฐ„์ด ํŒŒ๋“œ๊ฐ€ ์‹คํŒจํ•˜๊ณ  ์žฌ์‹œ์ž‘ํ•˜๋Š” ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚จ์— ๋”ฐ๋ผ ์ ์  ์ง€์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ค ํŒŒ๋“œ์˜ ์ž‘์—…์ด ์ฒซ๋ฒˆ์งธ์— ์‹คํŒจํ–ˆ์„ ๋•Œ ์žฌ์‹œ์ž‘ ์ „ CrashLoopBackOff ์ƒํƒœ์— ๋จธ๋ฌด๋ฅด๋Š” ์‹œ๊ฐ„๋ณด๋‹ค 9๋ฒˆ์งธ, 10๋ฒˆ์งธ ์‹คํŒจํ–ˆ์„ ๋•Œ ์žฌ์‹œ์ž‘ ์ „ CrashLoopBackOff ์ƒํƒœ์— ๋จธ๋ฌด๋ฅด๋Š” ์‹œ๊ฐ„์ด ํ›จ์”ฌ ๋” ๊ธธ์–ด์ง„๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

2-2. ํŒŒ๋“œ๊ฐ€ ์ž˜ ์ƒ์„ฑ๋˜์—ˆ์ง€๋งŒ ์ •๋ง ์ž˜ ์ƒ์„ฑ๋˜์—ˆ๋‚˜? : Running

์ด๋ฒˆ์—๋Š” ํŒŒ๋“œ๊ฐ€ ์ž˜ ์ƒ์„ฑ๋œ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•˜๋Š” Running์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ๊ทธ๋Ÿฐ๋ฐ [๋ชฉ์ฐจ 2-2] ์ œ๋ชฉ์ด ์ด๊ฒŒ ๋ฌด์Šจ ์†Œ๋ฆฌ์ธ๊ฐ€ ์‹ถ๋‹ค. ํŒŒ๋“œ๊ฐ€ ์ž˜ ์ƒ์„ฑ๋œ๊ฑฐ๋ฉด ๋œ๊ฑฐ์ง€ ์ •๋ง ์ž˜ ์ƒ์„ฑ๋œ ๊ฒƒ์ด๋ผ๋‹ˆ? ์ด ์˜๋ฏธ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ [๋ชฉ์ฐจ 2] ์ธํŠธ๋กœ์—์„œ ์ž ์‹œ ์–ธ๊ธ‰ํ–ˆ๋˜ ์ด์•ผ๊ธฐ๋ฅผ ๋‹ค์‹œ ํ•ด๋ณด์ž. 
 
ํŒŒ๋“œ์˜ ์ƒํƒœ๊ฐ€ Running์ด ๋˜์—ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ๊ทธ Running ์ƒํƒœ๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ํŒŒ๋“œ๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ํ–ˆ๋‹ค. ๋‹จ์ ์ธ ์˜ˆ๋กœ, ์–ด๋–ค ํŒŒ๋“œ์˜ init ํ”„๋กœ์„ธ์Šค๊ฐ€ ์Šคํ† ๋ฆฌ์ง€์—์„œ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ initialize ํ•˜๋Š” 2๊ฐ€์ง€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๊ทธ๋Ÿฐ๋ฐ ์ด ๋•Œ, ์Šคํ† ๋ฆฌ์ง€์—์„œ ํŒŒ์ผ๋“ค ๋‹ค์šด๋กœ๋“œ ๋ฐ›๋Š” ์‹œ๊ฐ„์—๋Š” ์•ฝ 10์ดˆ๊ฐ€ ์†Œ์š”๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ์ด๋Ÿด ๊ฒฝ์šฐ, ์Šคํ† ๋ฆฌ์ง€์—์„œ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๋Š” ๋™์•ˆ์€ ์—ฌ์ „ํžˆ ํŒŒ๋“œ์˜ ์ƒํƒœ๋Š” Running์ด๋‹ค. ํ•˜์ง€๋งŒ ์•„์ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ initialize ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ, ํŒŒ๋“œ์˜ ์ƒํƒœ๋Š” Running ์ƒํƒœ์ด์ง€๋งŒ ์ด ์ˆœ๊ฐ„์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•ด๋‹น ํŒŒ๋“œ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ํŒŒ๋“œ๋Š” ๊ทธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ค€๋น„๊ฐ€ ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์š”์ฒญ์ด ์‹คํŒจํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ๋น„์œ ๋กœ ๋“ค์–ด, "ํŒŒ๋“œ๊ฐ€ ์ž˜ ์ƒ์„ฑ๋˜์—ˆ์ง€๋งŒ ์ •๋ง ์ž˜ ์ƒ์„ฑ๋˜์—ˆ๋‚˜?" ๋ผ๊ณ  ์ œ๋ชฉ์„ ์ง€์€ ๊ฒƒ์ด๋‹ค. 
 
์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋Š” ํŒŒ๋“œ์˜ ์ƒํƒœ๊ฐ€ Running ์ด์ง€๋งŒ, ํŒŒ๋“œ๊ฐ€ ์‹ค์ œ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›๊ธฐ ์œ„ํ•œ ์ค€๋น„๋„ ์™„๋ฃŒ๊ฐ€ ๋œ ๊ฒƒ์ธ์ง€ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด init Container, postStart, livenessProbe/readinessProbe ๋ผ๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ง€์›ํ•œ๋‹ค. ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž. ์ฐธ๊ณ ๋กœ init Container, postStart๋Š” ์• ์ดˆ์— ํŒŒ๋“œ๊ฐ€ Running ์ƒํƒœ๋กœ ์ „ํ™˜ํ•˜๊ธฐ์œ„ํ•œ ํ•„์ˆ˜ ์กฐ๊ฑด์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค. ๋ฐ˜๋ฉด livenessProbe/readinessProbe ๊ธฐ๋Šฅ์€ ์ง์ „ ๋ฌธ๋‹จ์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ์™€ ๊ฐ™์ด ํŒŒ๋“œ๊ฐ€ Running ์ƒํƒœ๋กœ ์ „ํ™˜๋˜์—ˆ์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ๊นŒ์ง€ ์ฒ˜๋ฆฌํ•  ์ƒํƒœ๊นŒ์ง€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„์ด๋‹ค. ์ด์— ๋Œ€ํ•ด ํ—ท๊ฐˆ๋ฆด ๊ฒƒ ๊ฐ™์•„ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ณด์•˜๋‹ค. 
 

2-2-1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์ „ ์ตœ์ดˆ๋กœ ์‹คํ–‰๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ : init Container

๊ฐ€์žฅ ๋จผ์ € ์•Œ์•„๋ณผ ๊ฒƒ์€ init Container์ด๋‹ค. init Container๋Š” ์ƒ์„ฑ๋  ํŒŒ๋“œ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ฆ‰, ์ผ์ข…์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ์™€ init Container ๊ฐ„์˜ ์ฐจ์ด์ ์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด init Container๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๋ณด๋‹ค ๋‹จ์ˆœํžˆ ๋จผ์ € ์‹คํ–‰๋˜๋Š” ๊ฒƒ ๋ฐ–์— ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์–ด๋–ค ์ž‘์—…์ด ์„ ํ–‰๋˜์–ด์•ผ ํ•  ๋•Œ init Container๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ง์ „์—์„œ ์–ธ๊ธ‰ํ•œ "์Šคํ† ๋ฆฌ์ง€์—์„œ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ intialize" ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋“ค์—ˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ "์Šคํ† ๋ฆฌ์ง€์—์„œ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๋Š”" ์ž‘์—…์„ init Container์—์„œ ์‹คํ–‰ํ•ด๋„ ๋œ๋‹ค.(๋ฌผ๋ก  init Container ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ emptyDir ๋ณผ๋ฅจ์„ ์ด์šฉํ•ด์•ผ ํ•จ. emptyDir ๋ณผ๋ฅจ์— ๋Œ€ํ•ด์„œ๋Š” ์ด์ „ PV, PVC ํฌ์ŠคํŒ… ์ฐธ์กฐ)
 
init Container๋Š” ํŒŒ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ YAML ํŒŒ์ผ์— initContainers ํ•ญ๋ชฉ์œผ๋กœ ๋ช…์‹œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์—ฌ๋Ÿฌ ๊ฐœ์˜ init Container๋ฅผ ํ•œ๊บผ๋ฒˆ์— ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, 2๊ฐœ ์ด์ƒ์˜ init Container๋“ค์„ ๋ช…์‹œํ•˜๋ฉด ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์— ๋ช…์‹œ๋œ ์ˆœ์„œ๋กœ ์‹คํ–‰์ด ๋œ๋‹ค. ์˜ˆ์‹œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

apiVersion: v1
kind: Pod
metadata:
  name: init-container-test
spec:
  initContainers:
    - name: init-container-first
      image: busybox
      command: ["sh", "-c", "echo Hello init-container-first"]
    - name: init-container-second
      image: busybox
      command: ["sh", "-c", "echo Hello init-container-second"]
  containers:
    - name: nginx
      image: nginx:latest

 
init Container๋„ ์‹คํŒจํ•  ๊ฒฝ์šฐ, ๋ช…์‹œํ•œ restartPolicy ์ข…๋ฅ˜์— ๋”ฐ๋ผ ํŒŒ๋“œ๊ฐ€ ์žฌ์‹œ์ž‘ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  init Container๊ฐ€ ์ •์ƒ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๊ทธ ์ดํ›„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ๋‹จ๊ณ„๋กœ ์ ˆ๋Œ€ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ์ด init Container์—์„œ ํ•˜๋Š” ์ž‘์—…์„ dig ๋‚˜ nslookup ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•ด ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜์—ฌ ์•ฝ๊ฐ„ ์‘์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋‚˜ ์„œ๋น„์Šค๋“ค์ด ์ค€๋น„๊ฐ€ ๋œ ์ดํ›„์— ํ•ด๋‹น ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ„์ ‘์ ์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…์‹œ์ผœ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค.

2-2-2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ํ›…(Hook) ๊ฑธ๊ธฐ! : postStart

์ด๋ฒˆ์— ์•Œ์•„๋ณผ postStart๋Š” init Container๊ฐ€ ์•„๋‹Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์–ด๋–ค ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…์„ ํŒŒ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์ •์˜๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. postStart๋Š” ์•„๋ž˜์˜ 2๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์ง€์›ํ•œ๋‹ค.
 

  • HTTP : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘ํ•œ ์งํ›„, ํŠน์ • ์ฃผ์†Œ๋กœ HTTP ์š”์ฒญ์„ ์ „์†ก
  • Exec : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘ํ•œ ์งํ›„, ํŠน์ • ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰

๋‘˜ ์ค‘ Exec ๋ฐฉ์‹์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

apiVersion: v1
kind: Pod
metadata:
  name: post-start-hook
spec:
  containers:
    - name: nginx
      image: nginx:latest
      lifecycle:
        postStart:
          exec:
            command: ["sh", "-c", "touch/test.log"]

 
์ด postStart์— ๋ช…์‹œ๋œ HTTP ์š”์ฒญ ๋˜๋Š” Exec ๋ช…๋ น์–ด๋„ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ Running ์ƒํƒœ๋กœ ์ „ํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค. ์ฃผ์˜ํ•  ์ ์€ ์ด postStart๋Š” init ํ”„๋กœ์„ธ์Šค์™€ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜ ์ค‘์— ์–ด๋–ค ๊ฒƒ์ด ๋จผ์ € ์‹คํ–‰๋œ๋‹ค๋Š” ๋ณด์žฅ์€ ์—†๋‹ค. ๊ทธ๋ž˜์„œ postStart ์™€ init ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฐ ๋กœ์ง์ด ์„œ๋กœ ๋””ํŽœ๋˜์‹œ๊ฐ€ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋Š” ๋“ฏ ํ•˜๋‹ค. ์™œ๋ƒํ•˜๋ฉด postStart๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๋กœ์ง๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ œ๋Œ€๋กœ ์‹คํ–‰์ด ์•ˆ๋˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ Running ์ƒํƒœ๋กœ ์ „ํ™˜๋˜์ง€ ์•Š๊ณ  restartPolicy ์— ์˜ํ•ด ์žฌ์‹œ์ž‘๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  postStart ์‹คํ–‰ ๋กœ๊ทธ๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ณ„๋„๋กœ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ๋„ ์ฃผ์˜ํ•˜์ž.

2-2-3. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋ฐ›์„ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€๋ฅผ ๋ณด์žฅ! : livenessProbe, readinessProbe, startupProbe

์ด๋ฒˆ์— ์•Œ์•„๋ณผ ๋‚ด์šฉ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๊ฐ€ Running์œผ๋กœ ์ „ํ™˜๋˜์—ˆ๋‹ค๊ณ  ํ•ด๋„ ์ •๋ง ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์„ ์ƒํƒœ๊นŒ์ง€ ๋œ ๊ฒƒ์ธ์ง€ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์ธ livenessProbe, readinessProbe, startupProbe์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. ์ด 3๊ฐ€์ง€ ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•˜๋Š” ์ˆœ์„œ๋ฅผ ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

 
3๊ฐ€์ง€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • starupProbe : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘๋  ๋•Œ ์ˆ˜ํ–‰๋˜๋Š” ์ดˆ๊ธฐํ™” ์ž‘์—… ๋“ฑ(init container, postStart์—์„œ ์ˆ˜ํ–‰ํ–ˆ๋˜ ์ž‘์—…์ด๋ผ๋˜์ง€, ...)์ด ์ž˜ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ. ์ด startupProbe๊ฐ€ ์„ฑ๊ณตํ•ด์•ผ livenessProbe, readinessProbe๊ฐ€ ์‹œ์ž‘๋˜๋ฉฐ, startupProbe๋„ ์‹คํŒจํ•˜๊ฒŒ ๋˜๋ฉด ํŒŒ๋“œ์˜ restartPolicy์— ๋”ฐ๋ผ ํŒŒ๋“œ๊ฐ€ ์žฌ์‹œ์ž‘๋จ
  • readinessProbe : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•จ. ๊ฒ€์‚ฌ์— ์‹คํŒจํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น ํŒŒ๋“œ ์ปจํ…Œ์ด๋„ˆ๋Š” k8s ์„œ๋น„์Šค์˜ ๋ผ์šฐํŒ… ๋Œ€์ƒ์—์„œ ์ œ์™ธ๊ฐ€ ๋จ
  • livenessProbe : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‚ด์•„์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•จ. ๊ฒ€์‚ฌ์— ์‹คํŒจํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋Š” restartPolicy์— ๋”ฐ๋ผ ์žฌ์‹œ์ž‘ํ•จ

์—ฌ๊ธฐ์„œ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ ์€ readinesProbe ์™€ livenessProbe์ธ๋ฐ, ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋ชฉ์ ์€ ์—„์—ฐํžˆ ๋‹ค๋ฅด๋‹ค. livenessProbe์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ •์ƒ ์ƒํƒœ๋ฅผ ์ง€์†ํ•ด์„œ ๊ณ„์†๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ด๊ณ , readinesProbe๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘ํ•œ ๋’ค ์ดˆ๊ธฐํ™” ์ž‘์—…์ด ์™„๋ฃŒ๊ฐ€ ๋˜์–ด์„œ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๋ฐ›์„ ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ค.
 
๊ทธ๋ž˜์„œ ์ด ๋ชฉ์ ์„ฑ์— ๋ถ€ํ•ฉํ•˜๋“ฏ์ด, livenessProbe์—์„œ ์‹คํŒจํ•˜๊ฒŒ ๋˜๋ฉด ํŒŒ๋“œ๊ฐ€ restartPolicy์— ๋”ฐ๋ผ ์žฌ์‹œ์ž‘ํ•˜์ง€๋งŒ, readinesProbe์€ ์‹คํŒจํ•˜๋”๋ผ๋„ ์žฌ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋‹จ์ˆœํžˆ k8s ์„œ๋น„์Šค์˜ ๋ผ์šฐํŒ… ๋Œ€์ƒ์—์„œ ํ•ด๋‹น ํŒŒ๋“œ์˜ IP๊ฐ€ ์ œ์™ธ๋˜๊ณ  ์—”๋“œํฌ์ธํŠธ ๋ฆฌ์†Œ์Šค์—์„œ๋„ ํ•ด๋‹น ํŒŒ๋“œ๋ฅผ ์ œ์™ธ์‹œํ‚ค๊ธฐ๋งŒ ํ•œ๋‹ค. readinesProbe๋Š” ์–ด๋Š์ •๋„ ์‹œ๊ฐ„์ด ์ง€๋‚œ ๋’ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์‹œ์ž‘๊นŒ์ง€๋Š” ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋  ์‹œ ๋ฐ”๋กœ ์„œ๋น„์Šค ๋ผ์šฐํŒ… ๋Œ€์ƒ์— ํฌํ•จ์‹œํ‚ค๊ณ , ์—”๋“œํฌ์ธํŠธ ๋ฆฌ์†Œ์Šค์—๋„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.
 
์ด์ œ ๊ทธ๋Ÿผ ์˜ˆ์ œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์‚ดํŽด๋ณด์ž. ๋จผ์ € livenessProbe ๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž. 
 

apiVersion: v1
kind: Pod
metadata:
  name: liveness-probe-test
spec:
  containers:
    - name: nginx
      image: nginx:latest
      livenessProbe:
        httpGet:
          port: 80
          path: /

 
์œ„ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋ณด๋ฉด httpGet ์ด๋ผ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. livenessProbe์—๋Š” ์•„๋ž˜์˜ 3๊ฐ€์ง€ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ์˜ ์ƒํƒœ๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค.

  • httpGet : HTTP GET ์š”์ฒญ์„ ์ „์†กํ•ด ์ƒํƒœ๋ฅผ ๊ฒ€์‚ฌํ•จ. ์š”์ฒญ์„ ์ „์†กํ•œ ๋’ค ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ 200 ๋˜๋Š” 300๋ฒˆ ๊ณ„์—ด์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๊ฒ€์‚ฌ์— ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ด ํŒŒ๋“œ๊ฐ€ ์žฌ์‹œ์ž‘ํ•œ๋‹ค. ์š”์ฒญ์„ ๋ณด๋‚ผ ํฌํŠธ์™€ ๊ฒฝ๋กœ, ๊ทธ๋ฆฌ๊ณ  ํ—ค๋”, HTTPS ์‚ฌ์šฉ ์—ฌ๋ถ€ ๋“ฑ์„ ์ถ”๊ฐ€๋กœ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • exec : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด ์ƒํƒœ๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. ๋ช…๋ น์–ด์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ 0์ด ์•„๋‹Œ ๊ฒฝ์šฐ์— ๊ฒ€์‚ฌ์— ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ด ํŒŒ๋“œ๊ฐ€ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.
  • tcpSocket : TCP ์—ฐ๊ฒฐ์ด ์ˆ˜๋ฆฝ๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์ฒดํฌํ•ด์„œ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ˆ˜๋ฆฝ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ฒ€์‚ฌ์— ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•ด ํŒŒ๋“œ๊ฐ€ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.

๋‹ค์Œ์€ readinessProbe ์˜ˆ์ œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์ธ๋ฐ, ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ๋ช…์‹œํ•˜๋Š” ๊ฐ’๊ณผ ๊ฒ€์‚ฌ ๋ฐฉ์‹(httpGet, exec, tcpSocket)์ด livenessProbe์™€ ๋™์ผํ•˜๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์˜ˆ์ œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋งŒ ๋ณด๊ณ  ๋„˜์–ด๊ฐˆํ…๋ฐ, ์•„๋ฌด๋ž˜๋„ readinessProbe์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ผ์šฐํŒ…์„ ์œ„ํ•ด ์„œ๋น„์Šค ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋„ ๊ฐ™์ด ๋„ฃ์–ด๋†“์•˜๋‹ค.
 

apiVersion: v1
kind: Pod
metadata:
  name: readiness-probe-pod
  labels:
    readiness-probe: test
spec:
  containers:
    - name: nginx
      image: nginx:latest
      readinessProbe:
        httpGet:
          port: 80
          path: /
---
apiVersion: v1
kind: Service
metadata:
  name: readiness-probe-svc
spec:
  type: ClusterIP
  ports:
    - name: nginx
      port: 80
      targetPort: 80
  selector:
    readiness-probe: test

 
์ฐธ๊ณ ๋กœ readinessProbe๋ฅผ ํŒŒ๋“œ์— ์ ์šฉํ•˜๊ธฐ ์–ด๋ ต๊ฑฐ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…Œ์ด๋„ˆ์˜ ์ดˆ๊ธฐํ™” ์‹œ๊ฐ„์ด ๊ฝค ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— minReadySeconds ๋ผ๋Š” ๊ฒƒ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ๋กค๋ง ์—…๋ฐ์ดํŠธ ์‹œ ํŒŒ๋“œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ค€๋น„๋˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์„ค์ •ํ•ด์„œ ์ƒˆ๋กœ์šด ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋œ ๋’ค minReadySeconds ๋งŒํผ์€ ๊ธฐ์กด ํŒŒ๋“œ๊ฐ€ ์œ ์ง€๋˜๊ณ , ๊ทธ ์ดํ›„์— ๊ธฐ์กด ํŒŒ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
 
๋งˆ์ง€๋ง‰์œผ๋กœ livenessProbe, readinessProbe, startupProbe ๋ชจ๋‘ ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์„ธ๋ถ€ ์˜ต์…˜๋“ค์˜ ์˜๋ฏธ์— ๋Œ€ํ•ด ์—ด๊ฑฐํ•ด๋ณด๊ณ  ๋‹ค์Œ ๋ชฉ์ฐจ๋กœ ๋„˜์–ด๊ฐ€๋ณด๋„๋ก ํ•˜์ž.

  • periodSeconds : ์ƒํƒœ ๊ฒ€์‚ฌ๋ฅผ ์ง„ํ–‰ํ•  ์ฃผ๊ธฐ๋ฅผ ์„ค์ •. ๋””ํดํŠธ ๊ฐ’์€ 10์ดˆ
  • initialDelaySeconds : ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋œ ๋’ค ์ƒํƒœ ๊ฒ€์‚ฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „๊นŒ์ง€์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์„ค์ •. ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š์Œ
  • timeoutSeconds : ์ƒํƒœ ๊ฒ€์‚ฌ ์‹œ ์ˆ˜ํ–‰ํ•œ ์š”์ฒญ์— ๋Œ€ํ•œ ํƒ€์ž„์•„์›ƒ์„ ์„ค์ •. ๋””ํดํŠธ ๊ฐ’์€ 1์ดˆ
  • successThreshold : ์ƒํƒœ ๊ฒ€์‚ฌ์— ์„ฑ๊ณตํ–ˆ๋‹ค๊ณ  ๊ฐ„์ฃผํ•  ๊ฒ€์‚ฌ ์„ฑ๊ณต ํšŸ์ˆ˜๋ฅผ ์„ค์ •. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ๊ฐ’์ด 3์œผ๋กœ ์„ค์ •๋˜๋ฉด 3๋ฒˆ์€ ์„ฑ๊ณตํ•ด์•ผ ์ƒํƒœ ๊ฒ€์‚ฌ์— ์„ฑ๊ณตํ–ˆ๋‹ค๊ณ  ๊ฐ„์ฃผ๋˜์–ด ๊ทธ ๋‹ค์Œ ์ƒํƒœ๋กœ ํŒŒ๋“œ๊ฐ€ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ. ๋””ํดํŠธ๋Š” 1
  • failtureThreshold : ์ƒํƒœ ๊ฒ€์‚ฌ์— ์‹คํŒจํ–ˆ๋‹ค๊ณ  ๊ฐ„์ฃผํ•  ๊ฒ€์‚ฌ ์‹คํŒจ ํšŸ์ˆ˜๋ฅผ ์„ค์ •. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด ๊ฐ’์ด 3์œผ๋กœ ์„ค์ •๋˜๋ฉด 3๋ฒˆ์€ ์‹คํŒจํ•ด์•ผ ์ƒํƒœ ๊ฒ€์‚ฌ์— ์‹คํŒจํ–ˆ๋‹ค๊ณ  ๊ฐ„์ฃผ๋˜์–ด ํŒŒ๋“œ๊ฐ€ ๋‹ค์Œ ์ƒํƒœ๋กœ ๋„˜์–ด๊ฐ€์ง€ ๋ชปํ•˜๊ฒŒ ํ•จ. ๋””ํดํŠธ๋Š” 3
    • ์ด ๊ฐ’์„ 1๋กœ ์„ค์ •ํ•˜๋ฉด ๋„ˆ๋ฌด ๋ฏผ๊ฐ(?)ํ•˜๊ฒŒ ์ƒํƒœ ๊ฒ€์‚ฌ์— ์‹คํŒจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์–ด robust ํ•˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ค์ˆ˜๋„ ์žˆ์Œ์— ์œ ์˜

2-3. ํŒŒ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ์ƒํƒœ : Terminating

๋‹ค์Œ์œผ๋กœ ์•Œ์•„๋ณผ ํŒŒ๋“œ์˜ ์ƒ์• ์ฃผ๊ธฐ ์ƒํƒœ๋Š” Terminating ์ด๋‹ค. ์˜์–ด๋‹จ์–ด ๊ทธ๋Œ€๋กœ ํŒŒ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋‹ค๋งŒ, ์—ฌ๊ธฐ์„œ '์ข…๋ฃŒ'๋ผ๋Š” ๊ฒƒ์€ ๋ช‡ ๊ฐ€์ง€์˜ ์ข…๋ฃŒ ๋ฐฉ์‹์„ ๋‚ดํฌํ•˜๊ณ  ์žˆ๋‹ค. ๋จผ์ € ๊ฐ•์ œ ์ข…๋ฃŒ์ด๋‹ค. ๊ฐ•์ œ ์ข…๋ฃŒ๋ผ ํ•จ์€ ํŒŒ๋“œ๊ฐ€ ํ˜„์žฌ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด ์žˆ๋˜ ์—†๋˜ ๋ฐ”๋กœ ์ข…๋ฃŒํ•ด ๋ฒ„๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋ฉด์— Graceful ์ข…๋ฃŒ๊ฐ€ ์žˆ๋‹ค. ์ด๋Š” ํŒŒ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ํ˜„์žฌ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ๋“ค์„ ๋งˆ์ € ๋งˆ๋ฌด๋ฆฌ ์ง“๊ณ  ์ข…๋ฃŒํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ์˜ Terminating์€ ํ›„์ž์ธ Graceful ์ข…๋ฃŒ๋ฅผ ์ง€ํ–ฅํ•œ๋‹ค. ๋‹ค๋งŒ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ๋งŒ์œผ๋กœ๋Š” ์ด Graceful ์ข…๋ฃŒ ๊ธฐ๋Šฅ์„ ์™„๋ฒฝํžˆ ๊ตฌํ˜„ํ•˜๊ธฐ๋Š” ํž˜๋“ค๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์˜ ์†Œ์Šค์ฝ”๋“œ ๋ ˆ๋ฒจ์˜ ๋กœ์ง๊ณผ ํ•จ๊ป˜ ๊ตฌํ˜„ํ•ด์•ผ ๊ฐ€๋Šฅํ•˜๋‹ค.
 
์ด๋ฅผ ์œ„ํ•ด ๋จผ์ € ์šฐ๋ฆฌ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ํŒŒ๋“œ๋ฅผ ์ข…๋ฃŒํ•  ๋•Œ ์–ด๋–ค ๋‹จ๊ณ„๋กœ ์ข…๋ฃŒ๋˜๋Š”์ง€๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ํŒŒ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด "kubectl delete $POD_NAME" ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ–ˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๋‹ค๋งŒ ์ด ํŒŒ๋“œ๋Š” ๋ ˆํ”Œ๋ฆฌ์นด์…‹์œผ๋กœ ์ƒ์„ฑ๋œ ์ƒํƒœ์ด๊ณ , ์„œ๋น„์Šค์˜ ๋ผ์šฐํŒ… ๋Œ€์ƒ์— ํฌํ•จ๋œ ํŒŒ๋“œ๋ผ๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

 

  1. ํŒŒ๋“œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์‚ญ์ œ๋  ์˜ˆ์ •์ด๋ผ๋Š” ์˜๋ฏธ์˜ deletionTimestamp ๊ฐ’์ด ํŒŒ๋“œ์˜ ๋ฐ์ดํ„ฐ์— ์ถ”๊ฐ€๋˜๊ณ , ํŒŒ๋“œ๋ฅผ STATUS๊ฐ€ Terminating ์œผ๋กœ ๋ฐ”๋€œ
  2. ์•„๋ž˜ 3๊ฐ€์ง€ ์ž‘์—…์ด ๋™์‹œ์— ์‹คํ–‰๋จ
    • ํŒŒ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— preStop ๋ผ์ดํ”„์‚ฌ์ดํด ํ›…์ด ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด preStop์ด ์‹คํ–‰
    • ์†ํ–ˆ๋˜ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์˜ ๊ด€๋ฆฌ ์˜์—ญ์—์„œ ํ•ด๋‹น ํŒŒ๋“œ๊ฐ€ ๋ฒ—์–ด๋‚˜๋ฉฐ, ๋ ˆํ”Œ๋ฆฌ์นด์…‹์€ ์ด์ œ ์ƒˆ๋กœ์šด ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๊ณ  ์‹œ๋„
    • ์„œ๋น„์Šค ๋ผ์šฐํŒ… ๋Œ€์ƒ์—์„œ ํ•ด๋‹น ํŒŒ๋“œ๋Š” ์ œ์™ธ
  3. preStop ํ›…์ด ์™„๋ฃŒ๋˜๋ฉด ๋ฆฌ๋ˆ…์Šค ์‹œ๊ทธ๋„ ์ค‘ SIGTERM์ด ํŒŒ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ์— ์ „๋‹ฌ๋จ. ๊ทธ๋ฆฌ๊ณ  ํŒŒ๋“œ์˜ init ํ”„๋กœ์„ธ์Šค๋Š” SIGTERM์„ ์ˆ˜์‹ ํ•˜๊ณ  ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋จ
  4. ํŒŒ๋“œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ SIGTERM์„ ์ˆ˜์‹ ํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋ชจ์ข…์˜ ์ด์œ ๋กœ ํŠน์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ์—ฌ์ „ํžˆ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด SIGKILL ์‹œ๊ทธ๋„์€ ์ „๋‹ฌ. ์—ฌ๊ธฐ์„œ 'ํŠน์ • ๊ธฐ๊ฐ„'์ด๋ผ ํ•จ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ 30์ดˆ๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉฐ ํŒŒ๋“œ์˜ terminationGracePeriodSeconds ํ•ญ๋ชฉ์„ ํ†ตํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ

์œ„ ์ˆœ์„œ์—์„œ ๋“ฑ์žฅํ•œ preStop์€ ์‚ฌ์‹ค [2-2-2. ๋ชฉ์ฐจ]์—์„œ ๋ฐฐ์šด postStart ํ›…๊ณผ ๊ธฐ๋Šฅ์ด ๋™์ผํ•˜๋˜ ์–ธ์ œ ์‹คํ–‰๋˜๋Š๋ƒ์˜ ์ˆœ์„œ์˜ ์ฐจ์ด๋‹ค. postStart๋Š” ํŒŒ๋“œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ๋’ค์— ์‹คํ–‰๋˜๊ณ , preStop์€ ํŒŒ๋“œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ ๋ฟ์ด๋‹ค. preStop์„ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ๋ช…์‹œํ•˜๋Š” ๋ฐฉ๋ฒ• ๋˜ํ•œ postStart์™€ ๋™์ผํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์„  ๋ณ„๋„๋กœ ์ž‘์„ฑํ•˜์ง€๋Š” ์•Š๊ฒ ๋‹ค. ์ด preStop์ด ๋ฐ”๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ Graceful ์ข…๋ฃŒ๋ฅผ ์œ„ํ•ด ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
 
์ด์ œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ง๊ณ  ํŒŒ๋“œ ์ปจํ…Œ์ด๋„ˆ ์ฆ‰, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์˜ ์†Œ์Šค์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ Graceful ์ข…๋ฃŒ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ์œ„ ๋‹จ๊ณ„์—์„œ ํžŒํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ 3๋ฒˆ ๋‹จ๊ณ„์ด๋‹ค. 3๋ฒˆ ๋‹จ๊ณ„์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ํŒŒ๋“œ ์ปจํ…Œ์ด๋„ˆ์— SIGTERM ์‹œ๊ทธ๋„์„ ์†ก์‹ ํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์—์„œ๋Š” ์ด SIGTERM ์‹œ๊ทธ๋„์„ ์ˆ˜์‹ ๋ฐ›์•˜์„ ๋•Œ Graceful ์ข…๋ฃŒ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•œ ๋กœ์ง(์˜ˆ๋ฅผ ๋“ค์–ด, ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋˜ ์š”์ฒญ์„ ๋งˆ๋ฌด๋ฆฌํ•œ๋‹ค๋˜์ง€ ๋“ฑ..)์„ ์†Œ์Šค์ฝ”๋“œ ๋ ˆ๋ฒจ๋กœ ๊ตฌํ˜„ํ•ด๋†“์œผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
 
๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋กœ, ํŒŒ์ด์ฌ์˜ ๋Œ€ํ‘œ์ ์ธ WSGI ํ”„๋ ˆ์ž„์›Œํฌ์ธ gunicorn์—์„œ๋Š” ์‹ค์งˆ์ ์ธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์›Œ์ปค ํ”„๋กœ์„ธ์Šค์— TERM ์ด๋ผ๋Š” ์‹œ๊ทธ๋„์„ ๋ณด๋‚ด๋ฉด Graceful ์ข…๋ฃŒ๋ฅผ ํ•˜๋„๋ก ์ž‘์„ฑ๋˜์–ด ์žˆ์Œ์„  ๊ณต์‹๋ฌธ์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

3. ํŒŒ๋“œ์˜ ์ƒํƒœ๋ฅผ ๋ณด๊ณ  Auto Scaling์„ ์ˆ˜ํ–‰ํ•˜์ž! : HPA

HPA(Horizontal Pod AutoScaler)๋Š” ํŒŒ๋“œ์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์˜ ํŒŒ๋“œ ๊ฐœ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์กฐ์ ˆํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ง์ „๊นŒ์ง€ ํŒŒ๋“œ์˜ ์ƒ์• ์ฃผ๊ธฐ๋ฅผ ์„ค๋ช…ํ•˜๋‹ค๊ฐ€ ์ด HPA๊ฐ€ ์™œ ๋œฌ๊ธˆ์—†์ด ๋“ฑ์žฅํ–ˆ์„๊นŒ? ์ด์œ ๋Š” ์ด HPA๋„ ํŒŒ๋“œ์˜ ์ƒํƒœ๋ฅผ ๋ณด๊ณ  ์˜คํ†  ์Šค์ผ€์ผ๋ง์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋‹ค๋งŒ, HPA๊ฐ€ ๋ณด๋Š” ์ƒํƒœ๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด Running, Completed, Error, Terminating๊ณผ ๊ฐ™์€ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ํŒŒ๋“œ์˜ CPU, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ  ์ƒํƒœ๋ฅผ ๋ณธ๋‹ค.
 
์‚ฌ์‹ค HPA๊ฐ€ ํŒŒ๋“œ์˜ CPU, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์„ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ž์ฒด๊ฐ€ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— metrics-server ๋ผ๊ณ  ํ•˜๋Š” ๋ณ„๋„์˜ ๋ฆฌ์†Œ์Šค ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘ ๋„๊ตฌ๋ฅผ ์„ค์น˜ํ•ด์•ผ๋งŒ ํ•œ๋‹ค. ์ด๋Š” ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๊ด€๋ จ๋œ ๋‚ด์šฉ์ด๋ผ ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ถ”ํ›„ k8s ๋ชจ๋‹ˆํ„ฐ๋ง ํฌ์ŠคํŒ…์—์„œ ์†Œ๊ฐœํ•  ์˜ˆ์ •์ด๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” metrics-server๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , HPA๊ฐ€ ์–ด๋–ป๊ฒŒ ์˜คํ†  ์Šค์ผ€์ผ๋ง์„ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์ค‘์ ์ ์œผ๋กœ ์†Œ๊ฐœํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.
 
์ผ๋‹จ HPA๋ผ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์˜ˆ์ œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž.
 

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-sample-test
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: deployment-sample-test
  targetCPUUtilizationPercentage: 50
  maxReplicas: 5
  minReplicas: 1

 
HPA๊ฐ€ ์˜คํ†  ์Šค์ผ€์ผ๋งํ•  ๋Œ€์ƒ์„ ์ง€์ •ํ•˜๋Š”๋ฐ, ์œ„ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋ณด๋ฉด ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋ฆฌ์†Œ์Šค๋ฅผ ์ง€์ •ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ํŒŒ๋“œ๋“ค์˜ CPU ์‚ฌ์šฉ๋ฅ ์ด 50%๊ฐ€ ๋„˜์„ ๊ฒฝ์šฐ, ํŒŒ๋“œ๋ฅผ ์ตœ๋Œ€ 5๊ฐœ ๋งŒํผ ์˜คํ†  ์Šค์ผ€์ผ๋งํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
 
๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ CPU ์‚ฌ์šฉ๋ฅ ์„ ์ง€์ •ํ•˜๋Š” targetCPUUtilizationPercentage์˜ ๋‹จ์œ„์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ์ด 50%๊ฐ€ ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐ๋œ 50%์ผ๊นŒ? ๋ฐ”๋กœ ํŒŒ๋“œ์— ํ• ๋‹น๋œ request ๋Œ€๋น„ ์–ผ๋งˆ๋‚˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‚ผ๋Š”๋‹ค. ๋จผ์ € ์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด์ž.
 

 
ํ˜„์žฌ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ํŒŒ๋“œ์˜ request.cpu ๊ฐ’์€ 1000m ๋ผ๊ณ  ํ•ด๋ณด์ž. ๊ทธ๋ฆฌ๊ณ  ํ˜„์žฌ ํŒŒ๋“œ๊ฐ€ 1๊ฐœ์ผ ๋•Œ์˜ ์‚ฌ์šฉ๋Ÿ‰์ด 600m์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  HPA์˜ targetCPUUtilizationPercentage ๊ฐ’์ด 50(%)์ด๋ผ๊ณ  ๋ช…์‹œ๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด๋ฅผ ์œ„ ์ž๋ฃŒ ์†์— ๋นจ๊ฐ„์ƒ‰ ๊ธ€์”จ๋กœ ๋ช…์‹œ๋˜์–ด ์žˆ๋Š” ๊ณต์‹์„ ์ด์šฉํ•ด ๊ณ„์‚ฐ์„ ํ•œ๋‹ค.
 

600 / 1000 * 100 = 60

 
๊ฐ ์ˆซ์ž๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • 600 : ํ˜„์žฌ 1๊ฐœ์˜ ํŒŒ๋“œ๋กœ ์šด์˜ํ•  ๋•Œ์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰
  • 1000 : ํ•ด๋‹น ํŒŒ๋“œ์˜ request.cpu ์— ๋ช…์‹œ๋œ ๊ฐ’
  • 100 : ๋ฐฑ๋ถ„์œจ๋กœ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ๊ณฑํ•˜๋Š” ๊ฐ’

๊ณ„์‚ฐํ•œ ๊ฐ’์ด 60์ด๋‹ค. ์ด 60์€ targetCPUUtilizationPercentage์— ๋ช…์‹œ๋œ 50๋ณด๋‹ค ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์˜คํ†  ์Šค์ผ€์ผ๋ง ๋Œ€์ƒ์ด ๋œ๋‹ค. ์˜คํ†  ์Šค์ผ€์ผ๋ง์„ ์ˆ˜ํ–‰ํ•ด์„œ ํŒŒ๋“œ๊ฐ€ 2๊ฐœ๊ฐ€ ๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ๊ถ๊ธˆํ•œ ์ ์€ ์˜คํ†  ์Šค์ผ€์ผ๋ง ์‹œ, ํŒŒ๋“œ๋ฅผ ๋ช‡ ๊ฐœ๊นŒ์ง€ ๋Š˜๋ฆด์ง€๋Š” ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •์ด ๋ ๊นŒ? ์ฆ‰, ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” 2๊ฐœ๋กœ ํŒŒ๋“œ ๊ฐœ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๊ธด ํ–ˆ์ง€๋งŒ, ํŒŒ๋“œ๋ฅผ 3๊ฐœ, 4๊ฐœ, ..., 10๊ฐœ๋กœ ๋Š˜๋ฆฌ๋ฉด ์•ˆ๋ ๊นŒ? ์ด๋ ‡๊ฒŒ ํŒŒ๋“œ๋ฅผ ๋ช‡ ๊ฐœ๊นŒ์ง€ ๋Š˜๋ฆด์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ธฐ์ค€๋„ ์œ„ ์ž๋ฃŒ์˜ ๋นจ๊ฐ„์ƒ‰ ๊ธ€์”จ์˜ ๊ณต์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹ค๋งŒ, ์˜คํ†  ์Šค์ผ€์ผ๋ง ๋˜์—ˆ์„ ๋•Œ์˜ ํŒŒ๋“œ ๊ฐœ์ˆ˜๋กœ ๋‚˜๋ˆ„์–ด ํ‰๊ท  ๊ฐ’์„ ์ ์šฉํ•˜์—ฌ ๊ฒฐ์ •ํ•œ๋‹ค.
 
์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„์ฒ˜๋Ÿผ ํŒŒ๋“œ๋ฅผ 2๊ฐœ๋กœ ์˜คํ† ์Šค์ผ€์ผ๋ง ํ–ˆ์„ ๊ฒฝ์šฐ, ๊ณ„์‚ฐ ๊ณต์‹์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์žฌ๊ณ„์‚ฐ๋œ๋‹ค.
 

(300 + 300) / 1000 / 2 * 100 = 30

 
์œ„ ๊ณ„์‚ฐ์‹๋„ ๊ฐ ์ˆซ์ž๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • (300 + 300) : 2๊ฐœ์˜ ํŒŒ๋“œ๋กœ ์šด์˜ํ•  ๋•Œ์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ํ•ฉ(1๊ฐœ์˜ ํŒŒ๋“œ ๋‹น 300m ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉ์ค‘)
  • 1000 : ํ•ด๋‹น ํŒŒ๋“œ์— request.cpu์— ๋ช…์‹œ๋œ ๊ฐ’
  • 2 : ํŒŒ๋“œ ๊ฐœ์ˆ˜
  • 100 : ๋ฐฑ๋ถ„์œจ๋กœ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ๊ณฑํ•˜๋Š” ๊ฐ’

์ด์ฒ˜๋Ÿผ ํŒŒ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ผ๋•Œ ๊ณ„์‚ฐํ•˜๋Š” ๊ณต์‹์€ ์—ฌ๋Ÿฌ ๊ฐœ์ˆ˜์˜ ํŒŒ๋“œ๋กœ ์šด์˜ํ•˜๊ณ  ์žˆ์„ ๋•Œ ์˜คํ†  ์Šค์ผ€์ผ๋ง์„ ์ ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ๋•Œ๋„ ๊ณ„์‚ฐ ๋กœ์ง์€ ๋™์ผํ•˜๋‹ค. ์ฆ‰, ๊ทธ๋ฆผ์œผ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

 
๋งˆ์ง€๋ง‰์œผ๋กœ, ์ง์ „์—์„œ HPA๊ฐ€ ์˜คํ†  ์Šค์ผ€์ผ๋ง์„ ํ•˜๋Š” ๊ธฐ์ค€์œผ๋กœ ๋ฐ”๋ผ๋ณด๋Š” ํŒŒ๋“œ์˜ CPU, ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ ๊ฐ’๋“ค์„ metrics-server๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜จ๋‹ค๊ณ  ํ–ˆ๋‹ค. ์ด ๋ง์€ ๊ฒฐ๊ตญ HPA๊ฐ€ metrics-server๋กœ๋ถ€ํ„ฐ ์ƒํƒœ ๊ฐ’๋“ค์„ ๋ฐ›์•„์˜ค๋Š” ํ…€์ด ๊ธธ์–ด์ง€๊ฒŒ ๋˜๋ฉด HPA๋Š” ์˜คํ†  ์Šค์ผ€์ผ๋ง์ด ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ๋น ๋ฅด๊ฒŒ ๋ฐ˜์˜ํ•˜๋Š” ์†๋„๊ฐ€ ๋Šฆ์–ด์ง„๋‹ค๋Š” ์…ˆ์ด๋‹ค. ์‹ค์ œ HPA๊ฐ€ metrics-server๋กœ๋ถ€ํ„ฐ ์ƒํƒœ ๊ฐ’๋“ค์„ ๋ฐ›์•„์˜ค๋Š” ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 
 

 
๊ทธ๋ž˜์„œ HPA ์ž…์žฅ์—์„œ๋Š” --horizontal-pod-autoscaler-sync-period ์˜ต์…˜์œผ๋กœ metrics-server ๋กœ๋ถ€ํ„ฐ ํŒŒ๋“œ์˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ์ƒํƒœ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ์ฃผ๊ธฐ๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, metrics-server๋„ HPA์—๊ฒŒ ์ „๋‹ฌํ•ด์ฃผ๋Š” ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ์ƒํƒœ๊ฐ’๋“ค์„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ ๋…ธ๋“œ์— ๋ถ™์–ด์žˆ๋Š” kubelet์˜ CAdvisor ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด๋‹ค. CAdvisor๋กœ๋ถ€ํ„ฐ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ์ƒํƒœ๊ฐ’๋“ค์„ ๊ฐ€์ ธ์˜ค๋Š” ์ฃผ๊ธฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 60์ดˆ์ธ๋ฐ, ์ด ๋˜ํ•œ --metrics-resolution ์˜ต์…˜ ๊ฐ’์œผ๋กœ ์กฐ์ ˆ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์ง€๋งŒ kubelet์˜ CAdvisor๋„ ์‹ค์ œ ํŒŒ๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ƒํƒœ๊ฐ’๋“ค์„ ๊ฐ€์ ธ์˜ค๋Š” ์ฃผ๊ธฐ๊ฐ€ 15์ดˆ๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ --metrics-resolution์„ 15์ดˆ ์ดํ•˜๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒŒ ์‚ฌ์‹ค ์ƒ ์˜๋ฏธ๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ๋‹ค. 
 
์ด ๋ชจ๋‹ˆํ„ฐ๋ง ๊ตฌ์กฐ ๋ถ€๋ถ„์€ ์ถ”ํ›„์— ๋ฐฐ์šธ ๋ชจ๋‹ˆํ„ฐ๋ง ์ฆ‰, Prometheus, Grafana ๊ฐœ๋…์„ ๋ฐฐ์šธ ๋•Œ ๋„์›€์ด ๋  ๋‚ด์šฉ์ด๋ฏ€๋กœ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ ๊ทธ๋ƒฅ ๊ฐ€๋ณ๊ฒŒ ์ฝ๊ณ  ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜์ž.
 

๋ฐ˜์‘ํ˜•