๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ Istio์ VirtualService์ DestinationRule์ ํ์ฉํ ๊ณ ๊ธ ํธ๋ํฝ ๋ผ์ฐํ
๊ธฐ๋ฒ์ ๋ค๋ฃน๋๋ค.
Istio์ VirtualService์ DestinationRule์ ํ์ฉํ๋ฉด,
๋จ์ํ ์๋น์ค ๊ฐ ์ฐ๊ฒฐ์ ๋์ด ์ธ๋ฐํ ํธ๋ํฝ ๊ด๋ฆฌ, A/B ํ
์คํธ, Canary ๋ฐฐํฌ ๋ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
์ด ๊ธ์์๋ VirtualService์ DestinationRule์ ๊ฐ๋
, ์ค์ ์ฌ์ฉ ๋ฐฉ๋ฒ,
๊ทธ๋ฆฌ๊ณ ์ค์ YAML ์์ ๋ฅผ ํตํด ํธ๋ํฝ์ ์ ์ฐํ๊ฒ ์ ์ดํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๐น 1. VirtualService์ DestinationRule์ด๋?
โ 1.1 VirtualService๋?
VirtualService๋ Istio์์ ํธ๋ํฝ์ ํน์ ์๋น์ค๋ก ๋ผ์ฐํ
ํ๋ ๋ฆฌ์์ค์
๋๋ค.
์ด๋ฅผ ํตํด ๋จ์ํ ์๋น์ค ์ฐ๊ฒฐ์ ๋์ด์ ๊ฒฝ๋ก ๊ธฐ๋ฐ ๋ผ์ฐํ
, ํธ๋ํฝ ๋ถ๋ฐฐ, ๋ฆฌํธ๋ผ์ด ๋ฐ ์ฅ์ ๋์ ๋ฑ์ ์ค์ ํ ์ ์์ต๋๋ค.
VirtualService์ ์ฃผ์ ๊ธฐ๋ฅ
- ํธ๋ํฝ ๋ถ๋ฐฐ: ์๋น์ค ๋ฒ์ (v1, v2) ๊ฐ ํธ๋ํฝ์ ๊ฐ์ค์น ๊ธฐ๋ฐ์ผ๋ก ๋ถ๋ฐฐ
- ๊ฒฝ๋ก ๊ธฐ๋ฐ ๋ผ์ฐํ : ํน์ URL ํจํด์ ๋ฐ๋ผ ๋ค๋ฅธ ์๋น์ค๋ก ๋ผ์ฐํ ๊ฐ๋ฅ
- Fault Injection(์ฅ์ ํ ์คํธ): ๋คํธ์ํฌ ์ฅ์ ์๋ฎฌ๋ ์ด์ ๊ฐ๋ฅ
โ 1.2 DestinationRule์ด๋?
DestinationRule์ ํน์ ์๋น์ค์ ํธ๋ํฝ ์ ์ฑ
์ ์ ์ํ๋ ๋ฆฌ์์ค์
๋๋ค.
VirtualService์ ํจ๊ป ์ฌ์ฉํ์ฌ, ํธ๋ํฝ์ ์ต์ข
๋ชฉ์ ์ง์์ ์ด๋ค ์ ์ฑ
์ ์ ์ฉํ ์ง ๊ฒฐ์ ํฉ๋๋ค.
DestinationRule์ ์ฃผ์ ๊ธฐ๋ฅ
- ์๋ธ์ (Subset) ์ ์: ํน์ ์๋น์ค ๋ฒ์ (v1, v2) ๊ฐ ํธ๋ํฝ์ ๊ตฌ๋ถ
- ๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฐฉ์ ์ค์ : Round Robin, Least Connection ๋ฑ
- ์ํท ๋ธ๋ ์ด์ปค ์ ์ฉ: ์์ฒญ ์คํจ์จ์ด ๋์ผ๋ฉด ํธ๋ํฝ์ ์๋ ์ฐจ๋จ
๐น 2. VirtualService & DestinationRule ์์
โ 2.1 VirtualService: ๊ธฐ๋ณธ์ ์ธ ํธ๋ํฝ ๋ผ์ฐํ ์ค์
์๋ ์์ ์์๋ VirtualService๋ฅผ ํ์ฉํ์ฌ ํธ๋ํฝ์ ๋ ๊ฐ์ ์๋น์ค(v1, v2)๋ก ๋ถ๋ฐฐํฉ๋๋ค.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService # ํธ๋ํฝ ๋ผ์ฐํ
์ ์ ์ํ๋ ๋ฆฌ์์ค
metadata:
name: my-service
spec:
hosts:
- my-service # ํธ๋ํฝ์ ์ ๋ฌํ ์๋น์ค ์ด๋ฆ
http:
- route:
- destination:
host: my-service # ๋์ ์๋น์ค ์ด๋ฆ
subset: v1 # v1 ๋ฒ์ ์ผ๋ก ํธ๋ํฝ ์ ๋ฌ
weight: 80 # 80%์ ํธ๋ํฝ์ v1์ผ๋ก ์ ๋ฌ
- destination:
host: my-service
subset: v2 # v2 ๋ฒ์ ์ผ๋ก ํธ๋ํฝ ์ ๋ฌ
weight: 20 # 20%์ ํธ๋ํฝ์ v2๋ก ์ ๋ฌ
์ค๋ช :
- VirtualService → ํน์ ์๋น์ค์ ๋ํ ํธ๋ํฝ ๋ผ์ฐํ ๊ท์น์ ์ ์
- destination.host → ํธ๋ํฝ์ ์ ๋ฌํ ์๋น์ค ์ด๋ฆ ์ง์
- subset → ์๋น์ค์ ํน์ ๋ฒ์ (v1, v2)์ผ๋ก ํธ๋ํฝ์ ๋ถ๋ฐฐ
- weight → ํธ๋ํฝ ๋ถ๋ฐฐ ๋น์จ ์ค์ (v1: 80%, v2: 20%)
โ 2.2 DestinationRule: ์๋น์ค ๋ฒ์ ๊ด๋ฆฌ ๋ฐ ๋ก๋ ๋ฐธ๋ฐ์ฑ
์๋ ์์ ์์๋ DestinationRule์ ํ์ฉํ์ฌ ์๋น์ค์ ์๋ธ์ (subset)๊ณผ ๋ก๋ ๋ฐธ๋ฐ์ฑ ์ ์ฑ ์ ์ค์ ํฉ๋๋ค.
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule # ํธ๋ํฝ ์ ์ฑ
์ ์ ์ํ๋ ๋ฆฌ์์ค
metadata:
name: my-service
spec:
host: my-service # ๋์ ์๋น์ค ์ด๋ฆ
subsets:
- name: v1 # v1 ๋ฒ์ ์๋ธ์
์ ์
labels:
version: v1
- name: v2 # v2 ๋ฒ์ ์๋ธ์
์ ์
labels:
version: v2
trafficPolicy:
loadBalancer:
simple: LEAST_CONN # ๊ฐ์ฅ ์ ์ ์ฐ๊ฒฐ์ ๊ฐ์ง ์๋ฒ๋ก ํธ๋ํฝ ์ ๋ฌ
์ค๋ช :
- DestinationRule → ์๋น์ค์ ํธ๋ํฝ ์ ์ฑ ์ ์ ์
- subsets → ํน์ ์๋น์ค ๋ฒ์ (v1, v2) ๊ตฌ๋ถ ๊ฐ๋ฅ
- trafficPolicy.loadBalancer.simple: LEAST_CONN →
→ ๊ฐ์ฅ ์ ์ ์ฐ๊ฒฐ์ ๊ฐ์ง ์๋ฒ๋ก ํธ๋ํฝ์ ๋ถ๋ฐฐํ๋ ๋ฐฉ์
โ 2.3 VirtualService + DestinationRule์ ํ์ฉํ Canary ๋ฐฐํฌ
์๋ ์์ ์์๋ Canary ๋ฐฐํฌ๋ฅผ ์ํด ์ ์ง์ ์ผ๋ก v2 ์๋น์ค๋ก ํธ๋ํฝ์ ์ฆ๊ฐ์ํค๋ ์ ๋ต์ ์ ์ฉํฉ๋๋ค.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: canary-deployment
spec:
hosts:
- my-service
http:
- route:
- destination:
host: my-service
subset: v1 # ๊ธฐ์กด v1 ์๋น์ค
weight: 90 # 90%์ ํธ๋ํฝ์ v1 ์๋น์ค๋ก ์ ๋ฌ
- destination:
host: my-service
subset: v2 # ์ ๊ท v2 ์๋น์ค
weight: 10 # 10%์ ํธ๋ํฝ์ v2 ์๋น์ค๋ก ์ ๋ฌ
์ค๋ช :
- weight: 90, weight: 10 → ์ด๊ธฐ์ 10%๋ง v2๋ก ๋ณด๋ด๊ณ ์ ์ง์ ์ผ๋ก ์ฆ๊ฐ ๊ฐ๋ฅ
- Canary ๋ฐฐํฌ ๋ฐฉ์์ผ๋ก, v2 ์๋น์ค์ ์์ ์ฑ์ด ํ์ธ๋๋ฉด ์ ์ง์ ์ผ๋ก ํธ๋ํฝ์ ์ฆ๊ฐ
โ 2.4 VirtualService๋ฅผ ํ์ฉํ ๊ฒฝ๋ก ๊ธฐ๋ฐ ๋ผ์ฐํ
์๋ ์์ ์์๋ ํน์ URL ๊ฒฝ๋ก(/api/v2)์ ๋ฐ๋ผ ํธ๋ํฝ์ v2 ์๋น์ค๋ก๋ง ๋ผ์ฐํ ํ๋ ์ค์ ์ ๋๋ค.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: path-based-routing
spec:
hosts:
- my-service
http:
- match:
- uri:
prefix: "/api/v2" # "/api/v2" ๊ฒฝ๋ก๋ก ๋ค์ด์ค๋ ํธ๋ํฝ์ v2 ์๋น์ค๋ก ์ ๋ฌ
route:
- destination:
host: my-service
subset: v2
- route:
- destination:
host: my-service
subset: v1 # ๋๋จธ์ง๋ v1 ์๋น์ค๋ก ์ ๋ฌ
์ค๋ช :
- /api/v2 ๊ฒฝ๋ก๋ก ๋ค์ด์ค๋ ์์ฒญ๋ง v2 ์๋น์ค๋ก ์ ๋ฌ
- ๊ทธ ์ธ ๋ชจ๋ ์์ฒญ์ ๊ธฐ๋ณธ v1 ์๋น์ค๋ก ์ ๋ฌ
๐ ๊ฒฐ๋ก
- VirtualService๋ ํธ๋ํฝ์ ํน์ ์๋น์ค๋ก ๋ผ์ฐํ ํ๊ณ , ๊ฒฝ๋ก ๊ธฐ๋ฐ ๋ผ์ฐํ , ๊ฐ์ค์น ๊ธฐ๋ฐ ํธ๋ํฝ ๋ถ๋ฐฐ, ์ฅ์ ํ ์คํธ(Fault Injection) ๋ฑ์ ์ํํ ์ ์์ต๋๋ค.
- DestinationRule์ ์๋น์ค์ ์๋ธ์ ์ ์ ์ํ๊ณ , ๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฐฉ์ ๋ฐ ์ํท ๋ธ๋ ์ด์ปค ์ ์ฑ ์ ์ค์ ํ ์ ์์ต๋๋ค.
- VirtualService + DestinationRule์ ์กฐํฉํ๋ฉด, A/B ํ ์คํธ ๋ฐ Canary ๋ฐฐํฌ์ ๊ฐ์ ๊ณ ๊ธ ํธ๋ํฝ ์ ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
- ๊ฒฝ๋ก ๊ธฐ๋ฐ ๋ผ์ฐํ ์ ํ์ฉํ๋ฉด, ํน์ API ๋ฒ์ ์ ๋ฐ๋ผ ํธ๋ํฝ์ ๋๋๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.