์ ํ๋ฆฌ์ผ์ด์
์ ๋ฌด์ค๋จ์ผ๋ก ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ Rolling
, Blue/Green
, Canary
๋ฐฉ์์ด ๊ฐ์ฅ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐ๋๋ค.
ํ์ฌ Kubernetes
์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ๋ ๋ฐฐํฌ ๋ฐฉ์์ Rolling
๋ฐฉ์์ผ๋ก ์๋ก์ด ์๋ฒ๊ฐ ์์ฑ๋๋ฉด ์ผ๊ด๋ก ๊ธฐ์กด ์๋ฒ๊ฐ ์ญ์ ๋๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค. ํด๋น ๋ฐฉ์๋ ๋์ ๋ฐฉ์์ ์๋์ง๋ง ์๋ก์ด ์๋ฒ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๋กค๋ฐฑํ๊ธฐ๊ฐ ๊ต์ฅํ ๋ฒ๊ฑฐ๋ก์์ง๋ค.
๋ฐ๋ผ์ ๋ณดํต ์ด์ ํ๊ฒฝ์์๋ Blue/Green ๋ฐฐํฌ์ Canary ๋ฐฐํฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์๊ณ ์๋๋ฐ ์ค๋์ ๊ทธ ์ค์์ Canary
๋ฐฐํฌ๋ฅผ AWS EKS
์ Argo CD
์ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณผ ์์ ์ด๋ค.
๋ฌด์ค๋จ ๋ฐฐํฌ ๋ฐฉ์์ ๋ํ ์ค๋ช ์ ๋ค๋ฅธ ๋ธ๋ก๊ทธ์ ์์ธํ๊ฒ ์ค๋ช ์ด ๋์ด์์ผ๋ฏ๋ก ์ ๊ฐ ์ดํด๋ดค๋ ๋ธ๋ก๊ทธ ๋งํฌ๋ง ๊ฑธ๊ณ ์ถ๊ฐ์ ์ธ ์ค๋ช ์ ํ์ง ์๊ฒ ์ต๋๋ค.
ํด๋น ๋ด์ฉ์ผ๋ก๋ ๋ถ์กฑํ๋ค๋ฉด ๊ตฌ๊ธ๋ง์ผ๋ก ๋ ์ฐพ์๋ณด์๋ฉด ๋ ๊บผ ๊ฐ์ต๋๋ค!
๋จผ์ , Argo CD
์ AWS EKS
๋ ์ค์ ์ด ์ ๋ถ ๋์ด์๋ค๋ ๊ฐ์ ์ผ๋ก ์์ํ ์์ ์
๋๋ค. ์ค์ ์ด ์๋์ด์์ผ๋ฉด ์ด์ ์น์
์ ํตํด์ ์ค์ ์ ์งํ ํ ํ ํด๋น ๋ณธ๋ฌธ์ผ๋ก ๋์์ค์๋ฉด ๋ ๊บผ ๊ฐ์ต๋๋ค.
Argo CD
์์ ๊ณต์์ผ๋ก ์ง์ํ๋ Progressive delivery
ํด์ด ์กด์ฌํฉ๋๋ค.
๊ณต์ ํํ์ด์ง ๋ด์ฉ์ ๊ธฐ๋ฐ์ผ๋ก ์ค๋ช
๋๋ฆฌ๋๋ก ํ๊ฒ ์ต๋๋ค.
๋จผ์ , AWS EKS
์ Argo CD Rollouts Controller ๋ฅผ ์ค์นํด์ค๋๋ค. ์ค์น ๋ช
๋ น์ด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yaml
๋ค์์คํ์ด์ค๋ ๋ณ๋์ ์ค์ ์ ํ์ง ์๋ ์ด์ argo-rollouts
์ผ๋ก ๊ณ ์ ํด์ ์์ฑํ๊ณ ํด๋น ๋ค์์คํ์ด์ค์ ์ค์นํด์ฃผ์
์ผ ๋ฉ๋๋ค. ๊ผญ ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ์ค์นํด์ผ ๋๋๊ฒ ์๋ ์ด์์ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ทธ๋๋ก ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
๊ทธ ๋ค์ Argo CD Rollouts ์ฌ์ฉ์ ์ข ๋ ํธ๋ฆฌํ๊ฒ ํด์ฃผ๋ kubectl
ํ๋ฌ๊ทธ์ธ์ด ์กด์ฌํ๋๋ฐ ์ ํ์ฌํญ์ด๋ผ๊ณ ๋์์์ง๋ง ๋ชจ๋ ์ค๋ช
์ด ํ๋ฌ๊ทธ์ธ ์ฌ์ฉ์ผ๋ก ๋์์์ด์ ์ค์นํด์ฃผ์๋๊ฑธ ๊ถ์ฅ๋๋ฆฝ๋๋ค. ์ค์น ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
kubectl
๋ช
๋ น์ ์ด์ฉํ๋ ์๋ฒ์ ํด๋น ํ๋ฌ๊ทธ์ธ์ ์ค์นํด์ฃผ์๋ฉด ๋ฉ๋๋ค. ์ ์ ๊ฒฝ์ฐ ๋ฐฐ์ค์ฒ ์๋ฒ๋ฅผ ํตํด์ EKS
์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ค์ฒ ์๋ฒ์ ํด๋น ํ๋ฌ๊ทธ์ธ์ ์ค์นํฉ๋๋ค. (Linux OS ๊ธฐ์ค)
โ๏ธ ๊ณต์ ํํ์ด์ง์์ ์ ์ํ๋ ์ค์น ๋ฐฉ๋ฒ
curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-darwin-amd64
chmod +x ./kubectl-argo-rollouts-darwin-amd64
sudo mv ./kubectl-argo-rollouts-darwin-amd64 /usr/local/bin/kubectl-argo-rollouts
์์ ๋ฐฉ์๋๋ก ํ๋๋ฐ Unknown command error 'argo'
๋ญ์๊ธฐ๊ฐ ๋จ์๋ฉด ์๋ ๋ฐฉ์์ผ๋ก ์ค์น๋ฅผ ํด๋ณด์๋ฉด ์ ์์ ์ผ๋ก ๋ ๊ฒ๋๋ค.
โ๏ธ ๋ด๊ฐ ์ ์ํ๋ ์ค์น ๋ฐฉ๋ฒ
curl -LO https://github.com/argoproj/argo-rollouts/releases/latest/download/kubectl-argo-rollouts-linux-amd64
sudo install -o root -g root -m 0755 kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts
๋ค๋ฅธ ๋ฒ์ ์ผ๋ก ์ค์นํ๊ณ ์ถ์ ๊ฒฝ์ฐ ํด๋น ๋งํฌ์์ ์ํ๋ ๋ฒ์ ์ผ๋ก curl ๋ช ๋ น์ ์ด์ฉํด์ ์ค์นํ์๋ฉด ๋ฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ ์ค์น๊ฐ ๋์๋์ง ํ์ธํ๊ธฐ ์ํด์ ์๋ ๋ช ๋ น์ ์ ๋ ฅํฉ๋๋ค.
$ kubectl argo rollouts version
kubectl-argo-rollouts: v1.2.0-rc2+7b69058
BuildDate: 2022-02-24T22:32:47Z
GitCommit: 7b690580f69fd491f40c15b3ff4031f13bdae332
GitTreeState: clean
GoVersion: go1.17.6
Compiler: gc
Platform: linux/amd64
์ด์ ์ค์ ์ ์ ๋ถ ๋๋๊ณ Canary๋ก ๋ฐฐํฌํ ์ ์๋๋ก YAML ํ์ผ์ ์์ฑํด์ผ ํ๋ค. ์ผ๋จ ์์ ํ์ผ์ ๋ฐํ์ผ๋ก ์ค๋ช ์ ํ ์์ ์ด๊ณ ์์ ํ์ผ์ ํด๋น ๊นํ๋ธ ํ์ด์ง์์ ๊ฐ์ ธ์์ต๋๋ค.
apiVersion: argoproj.io/v1alpha1
kind: Rollout # Rollout์ผ๋ก ์์ฑ
metadata:
name: canary-rollout
spec:
replicas: 8
revisionHistoryLimit: 2
selector:
matchLabels:
app: canary
template:
metadata:
labels:
app: canary
spec:
containers:
- name: canary-rollouts-demo
image: particule/simplecolorapi:1.0
imagePullPolicy: Always
ports:
- containerPort: 5000
# ์ด ๋ถ๋ถ์์ ์นด๋๋ฆฌ๋ก ์ง์
strategy:
canary:
maxSurge: "25%" # canary ๋ฐฐํฌ๋ก ์์ฑํ pod์ ๋น์จ
maxUnavailable: 0 # ์
๋ฐ์ดํธ ๋ ๋ ์ฌ์ฉํ ์ ์๋ pod์ ์ต๋ ์
steps:
- setWeight: 25 # ์นด๋๋ฆฌ๋ก ๋ฐฐํฌ๋ ์๋ฒ๋ก ์ ์กํด์ผ๋ ํธ๋ํฝ ๋น์จ
- pause: {} # AutoPromotion Time (ํ๋จ ์ค๋ช
์ฐธ์กฐ)
---
kind: Service
apiVersion: v1
metadata:
name: canary-service
spec:
selector:
app: canary
ports:
- protocol: TCP
port: 80
targetPort: 5000
nodePort: 30081
type: NodePort
๋ณดํต pod
๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ํด์ kind
๋ฅผ Deployment
๋ก ์์ฑํด์ ์ฌ์ฉํ์์ํ
๋ฐ Canary
๋ฐฐํฌ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด kind
๋ฅผ Rollout
์ผ๋ก ๋ณ๊ฒฝํด์ฃผ๊ณ strategy
๋ฅผ ์ค์ ํด์ฃผ์ด์ผ ํ๋ค. strategy
๊ฐ ์ถ๊ฐ๋๋ ๋ถ๋ถ ๋ง๊ณ ๋ Deployment
์์ ์์ฑํ๋ ์ค์ ์ ๊ทธ๋๋ก ์์ฑํด์ฃผ๋ฉด ๋ฉ๋๋ค.
์์ ํ์ผ์์ Auto Promotion
์ด๋ผ๋ ๋ง์ด ์๋๋ฐ, ์๋ก์ด ์๋ฒ๊ฐ maxSurge
์ ์ ํ ํผ์ผํฐ์ง์ ๋ฐ๋ผ์ ๊ทธ ์๋งํผ ๋ฐฐํฌ๊ฐ ๋๋๋ฐ, ์๋ก์ด ์๋ฒ๊ฐ Canary
๋ฐฐํฌ๋ ํ ์ผ๋ง๋ ์๊ฐ์ด ํ๋ฅธ ๋ค ์๋ก์ด ์๋ฒ๋ก ์ ๋ถ ๋ฐฐํฌํ ๊น์? ๋ผ๋ ์ค์ ์ด๋ค.
๋ฐ๋ผ์ pause์ 10๋ถ์ผ๋ก ์ค์ ํด๋๋ฉด ์๋ก์ด ์๋ฒ๊ฐ Canary
๋ก ๋ฐฐํฌ๋ ํ 10๋ถ ๋ค์ ๊ธฐ์กด ์๋ฒ๊ฐ ์ ์ง์ ์ผ๋ก ์ญ์ ๋๋ฉด์ ์๋ก์ด ์๋ฒ๊ฐ ์์ฑ๋๋ ๊ฒ์ ๋งํ๋ค.
์ถ๊ฐ๋ก pause์๋ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ์ด ๋ค์ด๊ฐ ์ ์์ต๋๋ค.
- pause: { duration: 30 } # 30์ด
- pause: { duration: 30s } # 30์ด
- pause: { duration: 30m } # 30๋ถ
- pause: { duration: 30h } # 30์๊ฐ
- pause: {} # Auto Promotion ์ต์
๋นํ์ฑํ
- pause: { duration: -10 } # ์๋ชป๋ ์ต์
๋ฐ๋ผ์ ํด๋น YAML
ํ์ผ์ Argo CD Application
์ ์์ฑํด์ ๋ฐฐํฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ชจ์ต์ ๊ฐ์ง๋๋ค.
replicas
๋ฅผ 8๋ก ์ค์ ํด๋์๊ธฐ ๋๋ฌธ์ 8๊ฐ์ pod๊ฐ ์์ฑ๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
์ฌ๊ธฐ์ YAML
ํ์ผ์ ์ด๋ฏธ์ง ํ๊ทธ ๋ฒ์ ์ ๋ณ๊ฒฝํด์ ์๋กญ๊ฒ ์๋ฒ๋ฅผ ๋์ฐ๋๋ก ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ชจ์ต์ผ๋ก ์๋ฒ๊ฐ ์์ฑ๋๋ค. (ex. container -> image ์ ์ ํ์๋ 1.0 ์ 2.0์ผ๋ก ๋ณ๊ฒฝํ๋ค.)
์์ ๋นจ๊ฐ์ ๋ถ๋ถ์ด ์๋กญ๊ฒ Canary
๋ฐฐํฌ๋ก ์์ฑ๋ ์๋ก์ด ์๋ฒ์ด๋ค. maxSurge๊ฐ 25%๋ก ์ค์ ๋์ด ์๊ณ replicas
๊ฐ 8
๋ก ๋์ด์๊ธฐ ๋๋ฌธ์ 8 * 25 / 100
์ ๊ณ์ฐํ๋ฉด 2
๊ฐ ๋์จ๋ค. ๋ฐ๋ผ์ 2๊ฐ์ ์๋ก์ด ์๋ฒ๋ง ๋์์ ธ ์๋ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
์ฌ๊ธฐ์ pause
๊ฐ์ ์๊ฐ์ด ์ ํด์ ธ ์์ผ๋ฉด ๊ทธ ์๊ฐ๋งํผ ์๊ฐ์ด ํ๋ฅธ ๋ค ์๋์ผ๋ก ํ๋์ ๋ถ๋ถ์ ์๋ ๊ธฐ์กด ์๋ฒ๋ฅผ ์ญ์ ํ๊ณ ๋นจ๊ฐ์ ๋ถ๋ถ์ ์๋ก์ด ์๋ฒ๊ฐ 8๊ฐ๋ก ์ ์ง์ ์์ฑ์ด ๋๋ค.
๋ง์ฝ ์๋์ผ๋ก promote
ํ๊ณ ์ถ์ ๊ฒฝ์ฐ ๋ค์ ๋ช
๋ น์ ์
๋ ฅํด์ promote
ํ ์ ์๋ค.
kubectl argo rollouts promote \
canary-rollout (YAML ํ์ผ์์ metadata์ ์ ์ name ๊ฐ) \
-n canary(์์ ์ด ์์ฑํ ๋ค์์คํ์ด์ค ์์น)
$ kubectl argo rollouts promote canary-rollout -n canary
rollout 'canary-rollout' promoted
์ด๋ ๊ฒ ํ๋ฉด kubernetes
์์๋ Argo CD
๋ฅผ ์ด์ฉํ์ฌ Canary
๋ฐฐํฌ๋ฅผ ์งํํ ์ ์๋ค. Blue/Green
๋ฐฐํฌ๋ ์ด์ฉํ ์ ์์ผ๋ฏ๋ก ๊ถ๊ธํ์ ๋ถ๋ค์ ๊ตฌ๊ธ๋ง์ ํตํด์ ์ฐ์ ์ดํด๋ณด์๋ฉด ๋ ๊ฑฐ ๊ฐ์ต๋๋ค!
Canary
๋ฐฐํฌ๋ก ๋ฐ๊พธ๋๋ฐ ๊ต์ฅํ ์ด๋ ค์ธ์ค ์์๋ ๋ฐ๋ฉด์ ํ๋ฌ๊ทธ์ธ์ผ๋ก ์์ฝ๊ฒ ๋ฐ๋๋ ๋ชจ์ต์ ๋ณด๊ณ ๋ ์ด์ง ๋๋ฌ๋ค. ํ์ง๋ง ์ฃผ์ํ ์ ์ผ๋ก ์๋ก์ด ์๋ฒ์ ๊ธฐ์กด ์๋ฒ๊ฐ ๊ณต์กดํ๋ ๋งํผ API ํธํ์ฑ์ ๋ํด ๋ ์ ๊ฒฝ์จ์ผ ํ ๊ฒ ๊ฐ์ ๋ณด์ธ๋ค.
์๋ก์ด ์๋ฒ์๋ v2
๋ฒ์ ์ผ๋ก API๊ฐ ์ ๋ถ ์์ฑ๋์ด์์ด์ ๊ธฐ์กด ์๋ฒ์ ์์ฑ๋ v1
์ด ํธํ๋์ง ์๋๋ค๋ฉด setWeight
์ ์ค์ ๋ 25%
ํธ๋ํฝ์์ ๋ํด์๋ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ ๋ง ์ ์ํด์ ์งํํ๋ค๋ฉด ์ข์ ๋ฐฐํฌ ๋ฐฉ์์ด ๋์ง ์์๊น ์ถ์ต๋๋ค.
์ด๋ฒ์ ๊ฐ์ฅ ํค๋งจ ๋ถ๋ถ์ด ํ๋ฌ๊ทธ์ธ ์ค์นํ๋ ๋ถ๋ถ์์ ์์ฒญ ํค๋งธ๋๋ฐ ๊ณต์ ํํ์ด์ง ๋ฐฉ์๋๋ก ์ค์นํ๋ฉด ๊ณ์ 'Unknown command'
์๋ฌ๊ฐ ๋ ์ ๊ณ์ ์ฐพ๋ค๊ฐ kubectl์ ์ด๋ป๊ฒ ์ค์นํ๋ ์ดํด๋ดค๋๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ค์นํ๊ณ ์๋๊ฑธ ์บ์นํ๊ณ ๊ทธ ๋ฐฉ์๋๋ก ํ๋๊น ์ ์ฉ์ด ๋์๋ค. (1์๊ฐ ์ ๋ ํค๋งธ๊ฑฐ ๊ฐ๋ค.)
์๋ฌด์ชผ๋ก ๋น ๋ฅด๊ฒ ๋ฐ๊ฒฌํด์ ๊ธ๋ฐฉ ํด๊ฒฐํ ์ ์์ด์ ๋คํ์ด๋ค.
๋์์๊ณ ๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด์ด ๐๐ปโโ๏ธ