Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.11] 2๋ถ€ ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ #5 | Canary ๋ฐฐํฌ๋ž€? ์‹ค์ „ ์ ์šฉ ๋ฐฉ๋ฒ•

ygtoken 2025. 3. 18. 11:39
728x90

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Canary ๋ฐฐํฌ ์ „๋žต์„ ํ™œ์šฉํ•œ ํŠธ๋ž˜ํ”ฝ ์ œ์–ด ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
**Canary ๋ฐฐํฌ(Canary Deployment)**๋Š” ์ผ๋ถ€ ์‚ฌ์šฉ์ž๋งŒ ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋กœ ๋ผ์šฐํŒ…ํ•˜์—ฌ ์ ์ง„์ ์œผ๋กœ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ์ „๋žต์ž…๋‹ˆ๋‹ค.
Istio์—์„œ๋Š” VirtualService์™€ DestinationRule์„ ํ™œ์šฉํ•˜์—ฌ Canary ๋ฐฐํฌ๋ฅผ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” Canary ๋ฐฐํฌ ๊ฐœ๋…, ๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜ ํŠธ๋ž˜ํ”ฝ ๋ถ„๋ฐฐ,
ํ—ค๋” ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์„ ํ™œ์šฉํ•œ Canary ๋ฐฐํฌ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 1. Canary ๋ฐฐํฌ๋ž€?

โœ… 1.1 Canary ๋ฐฐํฌ ๊ฐœ๋…

Canary ๋ฐฐํฌ๋Š” ๊ธฐ์กด ์„œ๋น„์Šค(Stable)์™€ ์ƒˆ๋กœ์šด ์„œ๋น„์Šค(Canary)๋ฅผ ๋™์‹œ์— ์šด์˜ํ•˜๋ฉด์„œ,
์ผ๋ถ€ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฐํฌ ์ „๋žต์ž…๋‹ˆ๋‹ค.

Canary ๋ฐฐํฌ์˜ ํŠน์ง•

  • ์ ์ง„์ ์ธ ๋ฐฐํฌ ์ง„ํ–‰ ๊ฐ€๋Šฅ
  • ์ผ๋ถ€ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ Canary ๋ฒ„์ „ ์ œ๊ณต ๊ฐ€๋Šฅ
  • ๋ฐฐํฌ ํ›„ ์ด์ƒ ์—ฌ๋ถ€๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฐ์ง€ ๊ฐ€๋Šฅ
  • ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ Canary ๋ฒ„์ „๋งŒ ๋กค๋ฐฑ ๊ฐ€๋Šฅ

Canary ๋ฐฐํฌ์˜ ํ๋ฆ„

  1. Canary(์‹ ๊ทœ ๋ฒ„์ „)๋ฅผ ๋ฐฐํฌํ•˜์ง€๋งŒ, ๊ธฐ๋ณธ์ ์œผ๋กœ Stable(๊ธฐ์กด ๋ฒ„์ „)๋งŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณต
  2. ์ผ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ Canary ๋ฒ„์ „์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ํ…Œ์ŠคํŠธ ์ง„ํ–‰
  3. Canary ๋ฒ„์ „์ด ์•ˆ์ •์ ์ด๋ฉด ํŠธ๋ž˜ํ”ฝ์„ ์ ์ง„์ ์œผ๋กœ ์ฆ๊ฐ€
  4. ์™„์ „ํžˆ Canary ๋ฒ„์ „์œผ๋กœ ์ „ํ™˜ ํ›„, Stable ๋ฒ„์ „ ์ œ๊ฑฐ

๐Ÿ”น 2. Istio์—์„œ Canary ๋ฐฐํฌ ์ ์šฉ ๋ฐฉ๋ฒ•

โœ… 2.1 Canary ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ DestinationRule ์„ค์ •

์•„๋ž˜ YAML์€ Stable(v1)๊ณผ Canary(v2)๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” DestinationRule ์„ค์ •์ž…๋‹ˆ๋‹ค.

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: my-service
spec:
  host: my-service  # ๋Œ€์ƒ ์„œ๋น„์Šค ์ด๋ฆ„
  subsets:
    - name: v1  # Stable ๋ฒ„์ „ (๊ธฐ์กด ์„œ๋น„์Šค)
      labels:
        version: v1
    - name: v2  # Canary ๋ฒ„์ „ (์‹ ๊ทœ ์„œ๋น„์Šค)
      labels:
        version: v2
  trafficPolicy:
    loadBalancer:
      simple: ROUND_ROBIN  # ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ์‹์œผ๋กœ ํŠธ๋ž˜ํ”ฝ ๋ถ„๋ฐฐ

์„ค๋ช…:

  • subsets.name: v1 → ๊ธฐ์กด Stable ๋ฒ„์ „ ์„œ๋น„์Šค ์ •์˜
  • subsets.name: v2 → ์‹ ๊ทœ Canary ๋ฒ„์ „ ์„œ๋น„์Šค ์ •์˜
  • loadBalancer.simple: ROUND_ROBIN → ์„œ๋ฒ„ ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์„ ๊ณจ๊ณ ๋ฃจ ๋ถ„๋ฐฐ

โœ… 2.2 ๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜ Canary ๋ฐฐํฌ (VirtualService ์ ์šฉ)

์•„๋ž˜ VirtualService๋Š” 90%์˜ ํŠธ๋ž˜ํ”ฝ์„ ๊ธฐ์กด ์„œ๋น„์Šค(v1), 10%๋ฅผ ์‹ ๊ทœ ์„œ๋น„์Šค(v2)๋กœ ๋ถ„๋ฐฐํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-service
spec:
  hosts:
    - my-service
  http:
    - route:
        - destination:
            host: my-service
            subset: v1  # ๊ธฐ์กด ์„œ๋น„์Šค (Stable)
          weight: 90  # 90% ํŠธ๋ž˜ํ”ฝ์„ ๊ธฐ์กด ๋ฒ„์ „์œผ๋กœ ์ „๋‹ฌ
        - destination:
            host: my-service
            subset: v2  # ์‹ ๊ทœ ์„œ๋น„์Šค (Canary)
          weight: 10  # 10% ํŠธ๋ž˜ํ”ฝ์„ ์‹ ๊ทœ ๋ฒ„์ „์œผ๋กœ ์ „๋‹ฌ

์„ค๋ช…:

  • weight: 90 → ๊ธฐ์กด Stable ๋ฒ„์ „(v1)์œผ๋กœ 90% ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋ƒ„
  • weight: 10 → ์‹ ๊ทœ Canary ๋ฒ„์ „(v2)์œผ๋กœ 10% ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋ƒ„
  • Canary ๋ฒ„์ „์ด ์•ˆ์ •์ ์ด๋ฉด ์ ์ง„์ ์œผ๋กœ ํŠธ๋ž˜ํ”ฝ ๋น„์œจ์„ ์ฆ๊ฐ€์‹œํ‚ด

๐Ÿ”น 3. ํ—ค๋” ๊ธฐ๋ฐ˜ Canary ๋ฐฐํฌ

โœ… 3.1 ํŠน์ • ์‚ฌ์šฉ์ž๋งŒ Canary ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •

๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹Œ, ํŠน์ • ํ—ค๋” ๊ฐ’์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋งŒ Canary ๋ฒ„์ „์œผ๋กœ ๋ผ์šฐํŒ…ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, X-Canary-User: true ํ—ค๋”๊ฐ€ ํฌํ•จ๋œ ์š”์ฒญ๋งŒ Canary ๋ฒ„์ „์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-service
spec:
  hosts:
    - my-service
  http:
    - match:
        - headers:
            X-Canary-User:
              exact: "true"  # ํŠน์ • ํ—ค๋”๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ Canary ๋ฒ„์ „์œผ๋กœ ๋ผ์šฐํŒ…
      route:
        - destination:
            host: my-service
            subset: v2
    - route:
        - destination:
            host: my-service
            subset: v1  # ๊ธฐ๋ณธ์ ์œผ๋กœ Stable ๋ฒ„์ „์œผ๋กœ ๋ผ์šฐํŒ…

์„ค๋ช…:

  • headers.X-Canary-User.exact: "true" → ํŠน์ • ํ—ค๋” ๊ฐ’์ด **"true"**์ธ ์š”์ฒญ๋งŒ Canary ๋ฒ„์ „(v2)์œผ๋กœ ์ „๋‹ฌ
  • ๋‚˜๋จธ์ง€ ๋ชจ๋“  ์š”์ฒญ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Stable ๋ฒ„์ „(v1)์œผ๋กœ ์ „๋‹ฌ

๐Ÿ”น 4. Canary ๋ฐฐํฌ ์ง„ํ–‰ ๋ฐฉ๋ฒ•

1๏ธโƒฃ ์ดˆ๊ธฐ ๋ฐฐํฌ ์ƒํƒœ

  • ๊ธฐ์กด Stable ๋ฒ„์ „(v1)์œผ๋กœ ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์ด ์ „๋‹ฌ๋จ
  • ์‹ ๊ทœ Canary ๋ฒ„์ „(v2) ๋ฐฐํฌ ํ›„, Canary ํŠธ๋ž˜ํ”ฝ์€ 0%

2๏ธโƒฃ Canary ํŠธ๋ž˜ํ”ฝ ์ ์ง„์  ์ฆ๊ฐ€

  • 10% → 25% → 50% → 100% ์ˆœ์œผ๋กœ ํŠธ๋ž˜ํ”ฝ ์ฆ๊ฐ€

3๏ธโƒฃ Canary ์•ˆ์ •์„ฑ ๊ฒ€์ฆ

  • Canary ๋ฒ„์ „(v2)์ด ์ •์ƒ์ ์œผ๋กœ ์šด์˜๋˜๋ฉด, 100% ํŠธ๋ž˜ํ”ฝ์„ Canary ๋ฒ„์ „์œผ๋กœ ์ด๋™

4๏ธโƒฃ Stable ๋ฒ„์ „(v1) ์ œ๊ฑฐ

  • Canary ๋ฒ„์ „(v2)์ด ์™„์ „ํžˆ ์šด์˜๋˜๋ฉด Stable ๋ฒ„์ „(v1) ์ œ๊ฑฐ

5๏ธโƒฃ ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ๋กค๋ฐฑ

  • ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด VirtualService๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ 100% ํŠธ๋ž˜ํ”ฝ์„ ๊ธฐ์กด Stable ๋ฒ„์ „(v1)์œผ๋กœ ์ฆ‰์‹œ ๋ณต๊ตฌ ๊ฐ€๋Šฅ

๐Ÿ“Œ ๊ฒฐ๋ก 

  • Canary ๋ฐฐํฌ๋Š” ์ผ๋ถ€ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ ์ง„์  ๋ฐฐํฌ ์ „๋žต์ž…๋‹ˆ๋‹ค.
  • ๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜ ํŠธ๋ž˜ํ”ฝ ๋ถ„๋ฐฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ ์ง„์ ์œผ๋กœ ์‹ ๊ทœ ๋ฒ„์ „์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ด๋™ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ํ—ค๋” ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์„ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์‚ฌ์šฉ์ž ๊ทธ๋ฃน๋งŒ Canary ๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ๊ธฐ์กด Stable ๋ฒ„์ „์œผ๋กœ ๋น ๋ฅด๊ฒŒ ๋กค๋ฐฑ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ์•ˆ์ •์ ์ธ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
728x90