๐น Progressive Delivery๋?
Progressive Delivery(์ ์ง์ ๋ฐฐํฌ) ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ฐฐํฌํ ๋ ํธ๋ํฝ์ ์ ์ง์ ์ผ๋ก ์ด๋์ํค๋ฉด์ ์์ ์ฑ์ ๋ณด์ฅํ๋ ๋ฐฐํฌ ์ ๋ต์
๋๋ค.
Argo CD์ Argo Rollouts๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด Canary ๋ฐฐํฌ, A/B ํ
์คํธ, Feature Flag๋ฅผ ํ์ฉํ ์ ์ง์ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
โ Progressive Delivery๊ฐ ํ์ํ ์ด์
โ ์ ๊ท ๋ฒ์ ์ ์ ์ง์ ์ผ๋ก ๋ฐฐํฌํ์ฌ ์๋น์ค ์์ ์ฑ ๋ณด์ฅ
โ ์ค์ ์ฌ์ฉ์ ํผ๋๋ฐฑ์ ๋ฐ์ ๊ธฐ๋ฅ์ ์ ์ง์ ์ผ๋ก ํ์ฑํ
โ ๋ฐฐํฌ ์ค ์ค๋ฅ ๋ฐ์ ์ ๋น ๋ฅด๊ฒ ๋กค๋ฐฑ ๊ฐ๋ฅ
โ Blue-Green, Canary, A/B ํ
์คํธ ๋ฑ ๋ค์ํ ๋ฐฐํฌ ์ ๋ต ์ ์ฉ ๊ฐ๋ฅ
โ Argo CD์ Progressive Delivery ์ฐ๊ณ ๋ฐฉ์
์ ๋ต | ์ค๋ช |
Canary ๋ฐฐํฌ | ์๋ก์ด ๋ฒ์ ์ ํธ๋ํฝ์ ์ ์ง์ ์ผ๋ก ์ฆ๊ฐ์ํค๋ฉด์ ๋ชจ๋ํฐ๋ง |
A/B ํ ์คํธ | ์๋ก ๋ค๋ฅธ ๋ฒ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํน์ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ๋ฐฐํฌ |
Feature Flag | ํน์ ๊ธฐ๋ฅ์ ๋จ๊ณ์ ์ผ๋ก ํ์ฑํํ์ฌ ๋ฐฐํฌ ์ํฅ ์ต์ํ |
๐น 1. Argo CD์์ Canary ๋ฐฐํฌ๋ฅผ ํ์ฉํ Progressive Delivery
Argo Rollouts๋ฅผ ํ์ฉํ์ฌ Canary ๋ฐฐํฌ๋ฅผ ์ ์ง์ ์ผ๋ก ์งํํ๋ฉด์ ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค.
โ Canary ๋ฐฐํฌ๋ฅผ ์ ์ฉํ Rollout ์์
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: example-canary
namespace: example
spec:
replicas: 3
strategy:
canary:
steps:
- setWeight: 10 # ์ ๊ท ๋ฒ์ ์ 10% ํธ๋ํฝ ํ ๋น
- pause: {duration: 1m} # 1๋ถ ๋๊ธฐ ํ ๋ค์ ๋จ๊ณ ์งํ
- setWeight: 50 # ์ ๊ท ๋ฒ์ ์ 50% ํธ๋ํฝ ํ ๋น
- pause: {} # ์๋ ์น๊ฒฉ ํ์
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
containers:
- name: example
image: ghcr.io/example/app:v2
ports:
- containerPort: 80
โ
์ค๋ช
:
โ setWeight: 10 → ์ด๊ธฐ Canary ํธ๋ํฝ 10% ํ ๋น
โ pause: {duration: 1m} → 1๋ถ ๋์ ์ํ ๋ชจ๋ํฐ๋ง ํ ๋ค์ ๋จ๊ณ ์งํ
โ setWeight: 50 → 50% ํธ๋ํฝ์ Canary ๋ฒ์ ์ ํ ๋น
โ pause: {} → ์ฌ์ฉ์๊ฐ ์ง์ ์น๊ฒฉํ ๋๊น์ง ๋๊ธฐ (์๋ ์ ํ X)
โ ๋ฐฐํฌ ์งํ ์ํ ํ์ธ
kubectl argo rollouts get rollout example-canary -n example
โ ์ถ๋ ฅ ์์:
NAME STRATEGY STATUS STEP
example-canary Canary Progressing 2/4
โ ์๋์ผ๋ก ์น๊ฒฉํ์ฌ 100% ์ ํ
kubectl argo rollouts promote example-canary -n example
โ ๋กค๋ฐฑ(๊ธฐ์กด ๋ฒ์ ์ผ๋ก ๋ณต๊ตฌ)
kubectl argo rollouts undo example-canary -n example
๐น 2. Argo CD์์ A/B ํ ์คํธ๋ฅผ ํ์ฉํ Progressive Delivery
A/B ํ
์คํธ ๋ฐฐํฌ๋ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ๋ฐ๋ผ ์๋ก ๋ค๋ฅธ ๋ฒ์ ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ๊ณตํ๋ ๋ฐฉ์์
๋๋ค.
Argo CD์ Service Mesh(Istio, Linkerd)๋ฅผ ์ฐ๋ํ๋ฉด ํธ๋ํฝ์ ํน์ ๋ฒ์ ์ผ๋ก ๋ผ์ฐํ
ํ ์ ์์ต๋๋ค.
โ Istio๋ฅผ ํ์ฉํ A/B ํ ์คํธ ์์
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: example-ab-test
namespace: example
spec:
hosts:
- example.com
http:
- match:
- headers:
user-agent:
regex: ".*Chrome.*" # ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์ฌ์ฉ์์๊ฒ Canary ๋ฒ์ ์ ๊ณต
route:
- destination:
host: example-app
subset: canary
- route:
- destination:
host: example-app
subset: stable
โ
์ค๋ช
:
โ headers.user-agent.regex: ".*Chrome.*" → Chrome ๋ธ๋ผ์ฐ์ ์ฌ์ฉ์์๊ฒ Canary ๋ฒ์ ์ ๊ณต
โ route.destination.subset: canary → ์ผ๋ถ ์ฌ์ฉ์๋ง Canary ๋ฒ์ ์ ์ฌ์ฉํ๋๋ก ์ค์
โ route.destination.subset: stable → ๋๋จธ์ง ์ฌ์ฉ์๋ ๊ธฐ์กด Stable ๋ฒ์ ์ฌ์ฉ
โ Istio์ DestinationRule ์ค์ ์์
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: example-app
namespace: example
spec:
host: example-app
subsets:
- name: stable
labels:
version: v1
- name: canary
labels:
version: v2
โ
์ค๋ช
:
โ subsets.name: stable → ๊ธฐ์กด ๋ฒ์ (v1)๊ณผ Canary ๋ฒ์ (v2)์ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌ
โ ํน์ ์ฌ์ฉ์ ๊ทธ๋ฃน์๋ง ์๋ก์ด ๊ธฐ๋ฅ์ ์ ๊ณต ๊ฐ๋ฅ
โ A/B ํ ์คํธ ๋ฐฐํฌ ์ ์ฉ ํ ํธ๋ํฝ ๋ถ๋ฐฐ ํ์ธ
kubectl get virtualservice -n example
๐น 3. Feature Flag๋ฅผ ํ์ฉํ Progressive Delivery
Feature Flag๋ฅผ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ๋ฐฐํฌ ํ ํน์ ๊ธฐ๋ฅ์ ์ ์ง์ ์ผ๋ก ํ์ฑํํ ์ ์์ต๋๋ค.
โ Feature Flag๋ฅผ ์ ์ฉํ ์ ํ๋ฆฌ์ผ์ด์ ์ค์ ์์
apiVersion: v1
kind: ConfigMap
metadata:
name: feature-flags
namespace: example
data:
FEATURE_NEW_UI: "true" # ์ ๊ท UI ๊ธฐ๋ฅ ํ์ฑํ
FEATURE_EXPERIMENTAL: "false" # ์คํ ๊ธฐ๋ฅ ๋นํ์ฑํ
โ
์ค๋ช
:
โ FEATURE_NEW_UI: "true" → ์๋ก์ด UI ๊ธฐ๋ฅ ํ์ฑํ
โ FEATURE_EXPERIMENTAL: "false" → ์คํ์ ์ธ ๊ธฐ๋ฅ์ ๋นํ์ฑํ
โ ConfigMap์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ์ ํ์ฌ Feature Flag ์ ์ฉ
env:
- name: FEATURE_NEW_UI
valueFrom:
configMapKeyRef:
name: feature-flags
key: FEATURE_NEW_UI
โ Feature Flag ๋ณ๊ฒฝ ํ Argo CD์์ ์๋ ๋๊ธฐํ
kubectl edit configmap feature-flags -n example
โ ์๋ก์ด ๊ธฐ๋ฅ์ด ํ์ฑํ๋์๋์ง ํ์ธ
kubectl get configmap feature-flags -n example -o yaml
๐น 4. Progressive Delivery ์ด์ ์ ๊ณ ๋ คํ ์
โ
1๏ธโฃ Canary ๋ฐฐํฌ ์ ๋ชจ๋ํฐ๋ง ํ์
โ ์ ๊ท ๋ฒ์ ์ ์ฑ๋ฅ ๋ฐ ์ค๋ฅ๋ฅผ ๋ชจ๋ํฐ๋งํ์ฌ ์๋ ๋กค๋ฐฑ ์ค์ ํ์
โ
2๏ธโฃ A/B ํ
์คํธ์ ์ฌ์ฉ์ ๊ทธ๋ฃน ์ ์
โ Istio, Linkerd ๋ฑ์ ์๋น์ค ๋ฉ์ฌ๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ์ธ๋ถํ ๊ฐ๋ฅ
โ
3๏ธโฃ Feature Flag ์ ์ฉ ํ ๋กค๋ฐฑ ๊ฐ๋ฅํ๋๋ก ๊ตฌ์ฑ
โ ConfigMap ๋ณ๊ฒฝ ์ ์ด์ ์ํ๋ก ๋ณต๊ตฌํ ์ ์๋๋ก GitOps ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌ
๐น ๊ฒฐ๋ก : ์ด๋ฒ ๊ธ์์ ๋ฐฐ์ด ํต์ฌ ๋ด์ฉ ์ ๋ฆฌ
๐ข Argo Rollouts๋ฅผ ํ์ฉํ๋ฉด Canary ๋ฐฐํฌ๋ฅผ ํตํด ์ ์ง์ ์ธ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅ
๐ข A/B ํ
์คํธ๋ฅผ ์ ์ฉํ๋ฉด ํน์ ์ฌ์ฉ์ ๊ทธ๋ฃน์๊ฒ๋ง ์๋ก์ด ๊ธฐ๋ฅ์ ์ ๊ณต ๊ฐ๋ฅ
๐ข Feature Flag๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋ ๋ฐฐํฌ ํ ํน์ ๊ธฐ๋ฅ์ ๋์ ์ผ๋ก ํ์ฑํ ๊ฐ๋ฅ
๐ข Argo CD์ Progressive Delivery๋ฅผ ๊ฒฐํฉํ๋ฉด ์์ ์ ์ด๊ณ ์ ์ฐํ ๋ฐฐํฌ ์ ๋ต์ ์ด์ํ ์ ์์