Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.12] 2๋ถ€ ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ #6 | A/B ํ…Œ์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•œ ํŠธ๋ž˜ํ”ฝ ๋ถ„ํ•  ์ „๋žต

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

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Istio๋ฅผ ํ™œ์šฉํ•œ A/B ํ…Œ์ŠคํŠธ ์ „๋žต์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
A/B ํ…Œ์ŠคํŠธ๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ„์–ด ์„œ๋กœ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์˜ ํšจ๊ณผ๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜์‚ฌ ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” A/B ํ…Œ์ŠคํŠธ ๊ฐœ๋…, Istio์—์„œ A/B ํ…Œ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•,
๊ทธ๋ฆฌ๊ณ  VirtualService์™€ DestinationRule์„ ํ™œ์šฉํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ํŠน์ • ์‚ฌ์šฉ์ž ๊ทธ๋ฃน์— ๋งž๊ฒŒ ๋ถ„๋ฐฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 1. A/B ํ…Œ์ŠคํŠธ๋ž€?

โœ… 1.1 A/B ํ…Œ์ŠคํŠธ ๊ฐœ๋…

A/B ํ…Œ์ŠคํŠธ๋Š” ๋‘ ๊ฐ€์ง€ ์ด์ƒ์˜ ๋ฒ„์ „์„ ์šด์˜ํ•˜๋ฉด์„œ, ์‚ฌ์šฉ์ž ๋ฐ˜์‘์„ ๋น„๊ต ๋ถ„์„ํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.
์ด ๋ฐฉ์‹์€ ์ฃผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋ชจ๋ฐ”์ผ ์•ฑ, API ์—”๋“œํฌ์ธํŠธ ๋ณ€๊ฒฝ์„ ํ‰๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

A/B ํ…Œ์ŠคํŠธ์˜ ์ฃผ์š” ํŠน์ง•

  • ์‚ฌ์šฉ์ž๋ฅผ ํŠน์ • ๊ทธ๋ฃน(A, B)์œผ๋กœ ๋‚˜๋ˆ„์–ด ์„œ๋กœ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ์ œ๊ณต
  • A ๊ทธ๋ฃน(๊ธฐ์กด ๋ฒ„์ „), B ๊ทธ๋ฃน(์ƒˆ๋กœ์šด ๋ฒ„์ „) ๊ฐ„ ์„ฑ๋Šฅ ๋น„๊ต ๊ฐ€๋Šฅ
  • ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์˜ ๊ฐœ์„  ๋ฐฉํ–ฅ ๋„์ถœ ๋ฐ ์˜์‚ฌ ๊ฒฐ์ • ์ตœ์ ํ™”

โœ… 1.2 Istio์—์„œ A/B ํ…Œ์ŠคํŠธ ํ™œ์šฉ ๋ฐฉ์‹

Istio์—์„œ๋Š” VirtualService์™€ DestinationRule์„ ํ™œ์šฉํ•˜์—ฌ A/B ํ…Œ์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • VirtualService → ์š”์ฒญ ํ—ค๋” ๊ฐ’(์˜ˆ: User-Agent, Cookie)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠน์ • ๋ฒ„์ „์œผ๋กœ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ…
  • DestinationRule → A/B ๊ทธ๋ฃน์„ ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค ์„œ๋ธŒ์…‹(Subset)์œผ๋กœ ์„ค์ •

๐Ÿ”น 2. Istio A/B ํ…Œ์ŠคํŠธ ๊ตฌํ˜„

โœ… 2.1 A/B ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ DestinationRule ์„ค์ •

์•„๋ž˜ DestinationRule ์˜ˆ์ œ์—์„œ๋Š” ์„œ๋น„์Šค ๋ฒ„์ „(v1, v2)์„ ์„œ๋ธŒ์…‹(Subset)์œผ๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

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

์„ค๋ช…:

  • subsets.name: v1 → ๊ธฐ์กด ์„œ๋น„์Šค(A ๊ทธ๋ฃน)
  • subsets.name: v2 → ์ƒˆ๋กœ์šด ์„œ๋น„์Šค(B ๊ทธ๋ฃน)
  • trafficPolicy.loadBalancer.simple: ROUND_ROBIN → ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ์‹ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์ ์šฉ

โœ… 2.2 VirtualService๋ฅผ ํ™œ์šฉํ•œ A/B ํ…Œ์ŠคํŠธ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ…

์•„๋ž˜ VirtualService๋Š” ํŠน์ • ์ฟ ํ‚ค ๊ฐ’(user=group-b)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ v2 ์„œ๋น„์Šค๋กœ ๋ผ์šฐํŒ…ํ•ฉ๋‹ˆ๋‹ค.

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ab-testing
spec:
  hosts:
    - my-service
  http:
    - match:
        - headers:
            cookie:
              regex: ".*user=group-b.*"  # ํŠน์ • ์ฟ ํ‚ค๋ฅผ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๋งŒ v2 ์„œ๋น„์Šค๋กœ ๋ผ์šฐํŒ…
      route:
        - destination:
            host: my-service
            subset: v2  # ์ƒˆ๋กœ์šด ๋ฒ„์ „(B ๊ทธ๋ฃน)์œผ๋กœ ํŠธ๋ž˜ํ”ฝ ์ „๋‹ฌ
    - route:
        - destination:
            host: my-service
            subset: v1  # ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ์กด ๋ฒ„์ „(A ๊ทธ๋ฃน)์œผ๋กœ ํŠธ๋ž˜ํ”ฝ ์ „๋‹ฌ

์„ค๋ช…:

  • match.headers.cookie.regex: ".*user=group-b.*"
    → user=group-b ์ฟ ํ‚ค๋ฅผ ํฌํ•จํ•œ ์‚ฌ์šฉ์ž๋งŒ v2๋กœ ๋ผ์šฐํŒ…
  • route.destination.subset: v1 → ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ธฐ์กด ์„œ๋น„์Šค(A ๊ทธ๋ฃน)๋กœ ํŠธ๋ž˜ํ”ฝ ์ „๋‹ฌ

๐Ÿ”น 3. A/B ํ…Œ์ŠคํŠธ ์ ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

1๏ธโƒฃ ๊ธฐ๋ณธ ์ƒํƒœ:

  • ๋ชจ๋“  ์‚ฌ์šฉ์ž๋Š” ๊ธฐ์กด ์„œ๋น„์Šค(v1)๋กœ ์ ‘์†

2๏ธโƒฃ A/B ๊ทธ๋ฃน ์„ค์ •:

  • user=group-b ์ฟ ํ‚ค๊ฐ€ ์„ค์ •๋œ ์‚ฌ์šฉ์ž๋Š” v2(์ƒˆ๋กœ์šด ๋ฒ„์ „)๋กœ ์ ‘์†

3๏ธโƒฃ ํ…Œ์ŠคํŠธ ์ง„ํ–‰:

  • A/B ๊ทธ๋ฃน ์‚ฌ์šฉ์ž๋“ค์˜ ๋ฐ˜์‘, ์„ฑ๋Šฅ, ์˜ค๋ฅ˜์œจ ๋“ฑ์„ ๋ถ„์„

4๏ธโƒฃ ๊ฒฐ๊ณผ ๋ถ„์„ ํ›„ ์ตœ์ข… ๊ฒฐ์ •:

  • v2 ์„œ๋น„์Šค๊ฐ€ ์•ˆ์ •์ ์ด๊ณ  ํšจ๊ณผ๊ฐ€ ๋†’๋‹ค๋ฉด, ์ „์ฒด ํŠธ๋ž˜ํ”ฝ์„ v2๋กœ ์ด๋™
  • ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ฆ‰์‹œ v1์œผ๋กœ ๋กค๋ฐฑ ๊ฐ€๋Šฅ

๐Ÿ“Œ ๊ฒฐ๋ก 

  • A/B ํ…Œ์ŠคํŠธ๋Š” ํŠน์ • ์‚ฌ์šฉ์ž ๊ทธ๋ฃน์„ ๋Œ€์ƒ์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ , ํšจ๊ณผ๋ฅผ ๋น„๊ต ๋ถ„์„ํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • Istio์˜ VirtualService์™€ DestinationRule์„ ํ™œ์šฉํ•˜๋ฉด A/B ํ…Œ์ŠคํŠธ๋ฅผ ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ํ—ค๋” ๊ฐ’(์ฟ ํ‚ค, User-Agent ๋“ฑ)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠน์ • ์‚ฌ์šฉ์ž๋งŒ ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ์„œ๋น„์Šค๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๋ถ„์„ํ•œ ํ›„, ์‹ ๊ทœ ์„œ๋น„์Šค(v2)๋กœ ์ „์ฒด ํŠธ๋ž˜ํ”ฝ์„ ์ด๋™ํ•˜๊ฑฐ๋‚˜, ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ธฐ์กด ์„œ๋น„์Šค(v1)๋กœ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
728x90