준비
Istio Tasks; Traffic Management - Request Routing 의 개요까지, bookinfo 샘플 앱의 모든 요청을 v1으로 라우팅 하도록 virtualservice를 구성하고 진행해야 한다.
직전 실습, fault injection, 까지 진행했다면 다음 명령으로 virtualservices 구성을 바꾸자
$ k apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/bookinfo/networking/virtual-service-all-v1.yaml
Shell
복사
reviews 가 별점 없는 v1으로 렌더되는 것을 확인하자(사용자 jason 이든 아니든 노상관):
가중치 기반 라우팅
$ k apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
Shell
복사
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 50
- destination:
host: reviews
subset: v3
weight: 50
YAML
복사
❯ k diff -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
diff -u -N /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/LIVE-866140811/networking.istio.io.v1alpha3.VirtualService.default.reviews /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/MERGED-2776931740/networking.istio.io.v1alpha3.VirtualService.default.reviews
--- /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/LIVE-866140811/networking.istio.io.v1alpha3.VirtualService.default.reviews 2023-12-30 16:24:02.534816537 +0900
+++ /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/MERGED-2776931740/networking.istio.io.v1alpha3.VirtualService.default.reviews 2023-12-30 16:24:02.535007162 +0900
@@ -5,7 +5,7 @@
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"networking.istio.io/v1alpha3","kind":"VirtualService","metadata":{"annotations":{},"name":"reviews","namespace":"default"},"spec":{"hosts":["reviews"],"http":[{"route":[{"destination":{"host":"reviews","subset":"v1"}}]}]}}
creationTimestamp: "2023-12-27T15:00:58Z"
- generation: 5
+ generation: 6
name: reviews
namespace: default
resourceVersion: "941359"
@@ -18,3 +18,8 @@
- destination:
host: reviews
subset: v1
+ weight: 50
+ - destination:
+ host: reviews
+ subset: v3
+ weight: 50
Diff
복사
v1으로만 라우팅하던 reviews 서비스를 v1:v3이 50:50이 되도록 했다.
브라우저에서 새로고침을 여러번 하면 v3 또는 v1의 응답이 보인다.
kiali Services > reviews 에서도 실제 요청된 가중치를 확인할 수 있다. 좁은 곳에 꽉꽉 그려서 뭔가 오픈소스의 귀여움이 있다(데이터독 쓰다 그라파나 봤을 때의 느낌?.. ㅎㅎ). 나의 경우 v1:v3가 51.9:48.1로 거의 구성 값에 수렴했다.
v3 최대로!(100%)
$ k apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/bookinfo/networking/virtual-service-reviews-v3.yaml
Shell
복사
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v3
YAML
복사
❯ k diff -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/bookinfo/networking/virtual-service-reviews-v3.yaml
diff -u -N /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/LIVE-3502119672/networking.istio.io.v1alpha3.VirtualService.default.reviews /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/MERGED-1161443412/networking.istio.io.v1alpha3.VirtualService.default.reviews
--- /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/LIVE-3502119672/networking.istio.io.v1alpha3.VirtualService.default.reviews 2023-12-30 16:35:54.076056897 +0900
+++ /var/folders/4s/w6k_cdvd52s1hst64dr_yw540000gn/T/MERGED-1161443412/networking.istio.io.v1alpha3.VirtualService.default.reviews 2023-12-30 16:35:54.076287523 +0900
@@ -5,7 +5,7 @@
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"networking.istio.io/v1alpha3","kind":"VirtualService","metadata":{"annotations":{},"name":"reviews","namespace":"default"},"spec":{"hosts":["reviews"],"http":[{"route":[{"destination":{"host":"reviews","subset":"v1"},"weight":50},{"destination":{"host":"reviews","subset":"v3"},"weight":50}]}]}}
creationTimestamp: "2023-12-27T15:00:58Z"
- generation: 6
+ generation: 7
name: reviews
namespace: default
resourceVersion: "944164"
@@ -17,9 +17,4 @@
- route:
- destination:
host: reviews
- subset: v1
- weight: 50
- - destination:
- host: reviews
subset: v3
- weight: 50
Diff
복사
단순하게 가중치를 없애고 v3로만 라우팅 되도록 한다. 그 후엔 v3의 빨간 별점 만 확인할 수 있다.
습득 교훈
•
virtualservice에서 가중치 기반 버전(subset)별 라우팅을 할 수 있다.
•
트래픽 시프팅은 결국 손으로 하는거였다
◦
istio의 기능은 가중치 기반 라우팅이고 진정한(자율적인?) 트래픽 시프팅은 구현해야 하는건가 싶다.
◦
어쩌면 이런 트래픽 시프팅은 자동화의 대상이 아닐 수 있다; 어떤 메트릭을 시프팅 기준으로 삼을 수 있을까?
더 많은 걸 기대했건만…