๐ ํด๋น ํฌ์คํ
์ ์์ํ์ธ์! ๋์ปค/์ฟ ๋ฒ๋คํฐ์ค ์์ ์ ์ฝ๊ณ ๊ฐ์ธ์ ์ธ ๋ชฉ์ ํ์ ์์ฑ๋๋ ๊ธ์
๋๋ค. ํฌ์คํ
์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์๋ฃ๋ ์ ๊ฐ ์ง์ ์ฌ๊ตฌ์ฑํ์์์ ์๋ฆฝ๋๋ค.
![](https://blog.kakaocdn.net/dn/Cm9qL/btsKDR4HB3K/FodOTdV9oRXNNYZMW2p1Wk/img.png)
์ฟ ๋ฒ๋คํฐ์ค์์๋ ํ๋๋ฅผ ๊ด๋ฆฌํ ๋, ํ๋์ ์ํ๊ฐ์ ๋ฐ๋ผ ๊ด๋ฆฌํ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ํ๋์ ์ํ๋ ํ๋์ ์์ ์ฃผ๊ธฐ(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์ ๋กค๋ง ์
๋ฐ์ดํธ์ ์ฐจ์ด์ ์ ๋ํด์ ๋์ํ ํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
![](https://blog.kakaocdn.net/dn/bzWZ7N/btsKC2FRuD4/euzMbrF92zTu0rmqS8brTk/img.png)
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 ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ ๋ค์ด ํ์์ด ์๋ ๊ฒ์ ๋ณด์ฅํ๋ค. ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
![](https://blog.kakaocdn.net/dn/cvVIqV/btsKCZoNneb/jUqjAYKfitnBkDhLWsgiP0/img.png)
๊ทธ๋ฆผ์ ๋ณด๋ฉด 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์ ๋ํ ๊ฐ๋
์ ์ข ๋ ๋ช
ํํ๊ฒ ์ดํดํ๊ธฐ ์ํด ์๊น ์์์ ์ดํด๋ณธ ๊ทธ๋ฆผ์ ๊ฐ์ง๊ณ ์ดํดํด๋ณด๋๋ก ํ์.
![](https://blog.kakaocdn.net/dn/FRHWE/btsKCvIPFUc/6txLNovOiQ3waEGjKsEQfk/img.png)
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๊ฐ์ง ๋ฒ์ ์ ํ๋๊ฐ ๊ณต์กดํ๋ค๋ ์ ๋ ํด๊ฒฐํ๊ณ ๋ค์ดํ์์ด ์๋๋ก ํ ์ ์๋ ๋ธ๋ฃจ ๊ทธ๋ฆฐ ๋ฐฐํฌ ๋ฐฉ์์ด๋ผ๋ ๊ฒ๋ ์กด์ฌํ๋ค. ๋ธ๋ฃจ ๊ทธ๋ฆฐ ๋ฐฐํฌ๋ ๊ธฐ์กด ๋ฒ์ ์ ํ๋๋ฅผ ๊ทธ๋๋ก ๋๋ ์ํ์์ ์๋ก์ด ๋ฒ์ ์ ํ๋๋ฅผ ๋ฏธ๋ฆฌ ๋ชจ๋ ์์ฑํด๋๊ณ , ์๋น์ค ๋ฆฌ์์ค ์ค๋ธ์ ํธ์ ๋ผ์ฐํ
๋ง ๊ธฐ์กด ๋ฒ์ ์์ ์๋ก์ด ๋ฒ์ ์ผ๋ก ๋ณ๊ฒฝํ๋ ๋ฐฐํฌ ๋ฐฉ์์ ์๋ฏธํ๋ค. ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ์๋์ ๊ฐ๋ค.
![](https://blog.kakaocdn.net/dn/M4Y89/btsKD3DQfLH/dXbDl0738YEoKmpX8Vs7dK/img.png)
์ฟ ๋ฒ๋คํฐ์ค์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ธ๋ฃจ ๊ทธ๋ฆฐ ๋ฐฐํฌ ๋ฐฉ์์ ์ ๊ณตํ์ง๋ ์๋๋ค. ํ์ง๋ง ์ธ๋ถ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ์ง์ ๋งค๋ํ์คํธ๋ฅผ ์ฌ์ฉ์๊ฐ ์์ ํจ์ผ๋ก์จ ์ ์ฉํด๋ณผ ์ ์๋ค. ์ฆ, ์๋ก์ด ๋ฒ์ ์ ๋ํ๋ก์ด๋จผํธ๋ฅผ ๋ชจ๋ ์์ฑํด๋์ ๋ค, 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 ์ํ๋ก ์ ํ๋์์ง๋ง ํด๋ผ์ด์ธํธ์ ์์ฒญ๊น์ง ์ฒ๋ฆฌํ ์ํ๊น์ง ๋์๋์ง ํ์ธํ๊ธฐ ์ํ ์ฉ๋์ด๋ค. ์ด์ ๋ํด ํท๊ฐ๋ฆด ๊ฒ ๊ฐ์ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ณด์๋ค.
![](https://blog.kakaocdn.net/dn/bAXSSQ/btsKNqk0G3S/TLmVCFZySvIyKhgvSKsogK/img.png)
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๊ฐ์ง ๊ธฐ๋ฅ์ด ๋์ํ๋ ์์๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
![](https://blog.kakaocdn.net/dn/bBy1io/btsKMY99sRZ/jUGz8RlKrIYNy1i57vuu9k/img.png)
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" ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ๋ค๊ณ ํด๋ณด์. ๋ค๋ง ์ด ํ๋๋ ๋ ํ๋ฆฌ์นด์
์ผ๋ก ์์ฑ๋ ์ํ์ด๊ณ , ์๋น์ค์ ๋ผ์ฐํ
๋์์ ํฌํจ๋ ํ๋๋ผ๊ณ ๊ฐ์ ํ๋ค. ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
![](https://blog.kakaocdn.net/dn/cKuGJj/btsKLiWm1eX/VL4yvbmbtzt5gszLzKrZa0/img.png)
- ํ๋ ๋ฆฌ์์ค๊ฐ ์ญ์ ๋ ์์ ์ด๋ผ๋ ์๋ฏธ์ deletionTimestamp ๊ฐ์ด ํ๋์ ๋ฐ์ดํฐ์ ์ถ๊ฐ๋๊ณ , ํ๋๋ฅผ STATUS๊ฐ Terminating ์ผ๋ก ๋ฐ๋
- ์๋ 3๊ฐ์ง ์์
์ด ๋์์ ์คํ๋จ
- ํ๋ ๋งค๋ํ์คํธ์ preStop ๋ผ์ดํ์ฌ์ดํด ํ ์ด ์ค์ ๋์ด ์๋ค๋ฉด preStop์ด ์คํ
- ์ํ๋ ๋ ํ๋ฆฌ์นด์ ์ ๊ด๋ฆฌ ์์ญ์์ ํด๋น ํ๋๊ฐ ๋ฒ์ด๋๋ฉฐ, ๋ ํ๋ฆฌ์นด์ ์ ์ด์ ์๋ก์ด ํ๋๋ฅผ ์์ฑํ๋ ค๊ณ ์๋
- ์๋น์ค ๋ผ์ฐํ ๋์์์ ํด๋น ํ๋๋ ์ ์ธ
- preStop ํ ์ด ์๋ฃ๋๋ฉด ๋ฆฌ๋ ์ค ์๊ทธ๋ ์ค SIGTERM์ด ํ๋์ ์ปจํ ์ด๋์ ์ ๋ฌ๋จ. ๊ทธ๋ฆฌ๊ณ ํ๋์ init ํ๋ก์ธ์ค๋ SIGTERM์ ์์ ํ๊ณ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋จ
- ํ๋ ์ปจํ
์ด๋๊ฐ SIGTERM์ ์์ ํ์์๋ ๋ถ๊ตฌํ๊ณ ๋ชจ์ข
์ ์ด์ ๋ก ํน์ ๊ธฐ๊ฐ ๋์ ์ฌ์ ํ ํ๋ก์ธ์ค๊ฐ ์ข
๋ฃ๋์ง ์์ผ๋ฉด SIGKILL ์๊ทธ๋์ ์ ๋ฌ. ์ฌ๊ธฐ์ 'ํน์ ๊ธฐ๊ฐ'์ด๋ผ ํจ์ ๊ธฐ๋ณธ์ ์ผ๋ก 30์ด๋ก ์ค์ ๋์ด ์์ผ๋ฉฐ ํ๋์ terminationGracePeriodSeconds ํญ๋ชฉ์ ํตํด ์ค์ ํ ์ ์์
- ์ฐธ๊ณ ๋ก ์ด terminationGracePeriodSeconds์ 0์ผ๋ก ์ค์ ํ๋ค๋ ๊ฒ์ 1~3๋ฒ ๋จ๊ณ๋ ์ํ๋์ง ์๊ณ ,๋ฐ๋ก ๊ฐ์ ์ข ๋ฃํ๋ค๋ ์๋ฏธ๋ค. ์ด๋ ๊ถ์ฅ๋์ง ์๋ ๋ฐฉ์์ด๋ค. ์ด์ ๋ํด์๋ SIGKILL ์๊ทธ๋์ด ์๋ฏธํ๋ ๋ฐ๋ฅผ ์๋ฉด๋๋๋ฐ, SIGKILL์ ๋ํด ๊ฐ๋จํ ์ค๋ช ํ ์์ ํฌ์คํ ๋ชฉ์ฐจ 1๋ฒ ๋ง์ง๋ง์ ์ฐธ์กฐํด๋ณด์.
์ ์์์์ ๋ฑ์ฅํ 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 ๋๋น ์ผ๋ง๋ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๋์ง๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ๋๋ค. ๋จผ์ ์๋ ๊ทธ๋ฆผ์ ๋ณด์.
![](https://blog.kakaocdn.net/dn/bJtbzK/btsKMkeY0b8/jpuCrTUAkHgBASzt4dMfk0/img.png)
ํ์ฌ ๋ํ๋ก์ด๋จผํธ์์ ๊ด๋ฆฌํ๋ ํ๋์ 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 : ๋ฐฑ๋ถ์จ๋ก ๊ณ์ฐํ๊ธฐ ์ํด ๊ณฑํ๋ ๊ฐ
์ด์ฒ๋ผ ํ๋๊ฐ ์ฌ๋ฌ ๊ฐ์ผ๋ ๊ณ์ฐํ๋ ๊ณต์์ ์ฌ๋ฌ ๊ฐ์์ ํ๋๋ก ์ด์ํ๊ณ ์์ ๋ ์คํ ์ค์ผ์ผ๋ง์ ์ ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ ๋๋ ๊ณ์ฐ ๋ก์ง์ ๋์ผํ๋ค. ์ฆ, ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
![](https://blog.kakaocdn.net/dn/bcHc16/btsKNctzH9o/5ljf4A2ctyP8TTx8awqiw0/img.png)
๋ง์ง๋ง์ผ๋ก, ์ง์ ์์ HPA๊ฐ ์คํ ์ค์ผ์ผ๋ง์ ํ๋ ๊ธฐ์ค์ผ๋ก ๋ฐ๋ผ๋ณด๋ ํ๋์ CPU, ๋ฉ๋ชจ๋ฆฌ ์ํ ๊ฐ๋ค์ metrics-server๋ก๋ถํฐ ๋ฐ์์จ๋ค๊ณ ํ๋ค. ์ด ๋ง์ ๊ฒฐ๊ตญ HPA๊ฐ metrics-server๋ก๋ถํฐ ์ํ ๊ฐ๋ค์ ๋ฐ์์ค๋ ํ
์ด ๊ธธ์ด์ง๊ฒ ๋๋ฉด HPA๋ ์คํ ์ค์ผ์ผ๋ง์ด ๋ฆฌ์์ค ์ฌ์ฉ๋์ ๋น ๋ฅด๊ฒ ๋ฐ์ํ๋ ์๋๊ฐ ๋ฆ์ด์ง๋ค๋ ์
์ด๋ค. ์ค์ HPA๊ฐ metrics-server๋ก๋ถํฐ ์ํ ๊ฐ๋ค์ ๋ฐ์์ค๋ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
![](https://blog.kakaocdn.net/dn/buXYPy/btsKMaRgQGw/Jbjedy6gIoZtViVuvj5pYK/img.png)
๊ทธ๋์ 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 ๊ฐ๋
์ ๋ฐฐ์ธ ๋ ๋์์ด ๋ ๋ด์ฉ์ด๋ฏ๋ก ์ด๋ฒ ํฌ์คํ
์์ ๊ทธ๋ฅ ๊ฐ๋ณ๊ฒ ์ฝ๊ณ ๋์ด๊ฐ๋๋ก ํ์.