Kubernetes Tools/ArgoCD

[Ep.35] [Argo CD ์šด์˜ ์ตœ์ ํ™” #5] Argo CD์™€ Progressive Delivery(์ ์ง„์  ๋ฐฐํฌ) ์ „๋žต

ygtoken 2025. 3. 17. 13:13
728x90

๐Ÿ”น 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๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉด ์•ˆ์ •์ ์ด๊ณ  ์œ ์—ฐํ•œ ๋ฐฐํฌ ์ „๋žต์„ ์šด์˜ํ•  ์ˆ˜ ์žˆ์Œ

 

728x90