請求路由
此任務示範如何動態地將請求路由到微服務的多個版本。
開始之前
關於此任務
Istio 的 Bookinfo 範例包含四個獨立的微服務,每個微服務都有多個版本。其中一個微服務 reviews
已部署三個不同版本,且同時執行中。為了說明這造成的問題,請在瀏覽器中存取 Bookinfo 應用程式的 /productpage
並多次重新整理。URL 為 http://$GATEWAY_URL/productpage
,其中 $GATEWAY_URL
是入口的外部 IP 位址,如Bookinfo 文件中所述。
您會注意到,有時候書籍評論輸出包含星等評分,有時候則沒有。這是因為在沒有明確的預設服務版本可供路由的情況下,Istio 會以循環方式將請求路由到所有可用的版本。
此任務的最初目標是套用規則,將所有流量路由到微服務的 v1
(版本 1)。稍後,您將套用一條規則,根據 HTTP 請求標頭的值來路由流量。
路由到版本 1
若要僅路由到一個版本,您需要設定路由規則,將流量發送到微服務的預設版本。
- 執行以下命令來建立路由規則
Istio 使用虛擬服務來定義路由規則。執行以下命令來套用虛擬服務,將所有流量路由到每個微服務的 v1
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
由於設定傳播最終是一致的,請等待幾秒鐘,讓虛擬服務生效。
$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- name: reviews-v1
port: 9080
EOF
- 使用以下命令顯示已定義的路由
$ kubectl get virtualservices -o yaml
- apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
hosts:
- details
http:
- route:
- destination:
host: details
subset: v1
- apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
hosts:
- productpage
http:
- route:
- destination:
host: productpage
subset: v1
- apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
hosts:
- ratings
http:
- route:
- destination:
host: ratings
subset: v1
- apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
您也可以使用以下命令顯示對應的 subset
定義
$ kubectl get destinationrules -o yaml
$ kubectl get httproute reviews -o yaml
...
spec:
parentRefs:
- group: gateway.networking.k8s.io
kind: Service
name: reviews
port: 9080
rules:
- backendRefs:
- group: ""
kind: Service
name: reviews-v1
port: 9080
weight: 1
matches:
- path:
type: PathPrefix
value: /
status:
parents:
- conditions:
- lastTransitionTime: "2022-11-08T19:56:19Z"
message: Route was valid
observedGeneration: 8
reason: Accepted
status: "True"
type: Accepted
- lastTransitionTime: "2022-11-08T19:56:19Z"
message: All references resolved
observedGeneration: 8
reason: ResolvedRefs
status: "True"
type: ResolvedRefs
controllerName: istio.io/gateway-controller
parentRef:
group: gateway.networking.k8s.io
kind: Service
name: reviews
port: 9080
在資源狀態中,請確保 reviews
父系的 Accepted
條件為 True
。
您已設定 Istio 來路由到 Bookinfo 微服務的 v1
版本,最重要的是 reviews
服務版本 1。
測試新的路由配置
您可以再次重新整理瀏覽器中 Bookinfo 應用程式的 /productpage
來輕鬆測試新的設定。請注意,無論您重新整理多少次,頁面的評論部分都不會顯示星等評分。這是因為您設定了 Istio 將所有針對評論服務的流量路由到版本 reviews:v1
,而此版本的服務不會存取星等評分服務。
您已成功完成此任務的第一部分:將流量路由到服務的一個版本。
根據使用者身分路由
接下來,您將變更路由設定,以便將來自特定使用者的所有流量路由到特定的服務版本。在此案例中,來自名為 Jason 的使用者的所有流量將路由到服務 reviews:v2
。
此範例之所以可行,是因為 productpage
服務會將自訂的 end-user
標頭新增至所有發送到評論服務的出站 HTTP 請求。
Istio 也支援根據入口閘道上強驗證的 JWT 進行路由,詳細資訊請參閱基於 JWT 聲明的路由。
請記住,reviews:v2
是包含星等評分功能的版本。
- 執行以下命令以啟用基於使用者的路由
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml@
您可以使用以下命令確認已建立規則
$ kubectl get virtualservice reviews -o yaml
apiVersion: networking.istio.io/v1
kind: VirtualService
...
spec:
hosts:
- reviews
http:
- match:
- headers:
end-user:
exact: jason
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v1
$ kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: reviews
spec:
parentRefs:
- group: ""
kind: Service
name: reviews
port: 9080
rules:
- matches:
- headers:
- name: end-user
value: jason
backendRefs:
- name: reviews-v2
port: 9080
- backendRefs:
- name: reviews-v1
port: 9080
EOF
在 Bookinfo 應用程式的
/productpage
中,以使用者jason
登入。重新整理瀏覽器。您看到什麼?每個評論旁邊都會顯示星等評分。
以其他使用者登入(選擇您想要的任何名稱)。
重新整理瀏覽器。現在星等消失了。這是因為除了 Jason 之外,所有使用者的流量都會路由到
reviews:v1
。
您已成功設定 Istio 以根據使用者身分路由流量。
了解發生了什麼事
在此任務中,您使用 Istio 將 100% 的流量發送到每個 Bookinfo 服務的 v1
版本。然後,您設定了一條規則,根據 productpage
服務新增至請求的自訂 end-user
標頭,有選擇性地將流量發送到 reviews
服務的 v2
版本。
請注意,Kubernetes 服務(例如此任務中使用的 Bookinfo 服務)必須遵守某些限制,才能利用 Istio 的 L7 路由功能。詳細資訊請參閱Pod 和服務的需求。
在流量轉移任務中,您將遵循您在此處學到的相同基本模式,設定路由規則以逐漸將流量從服務的一個版本發送到另一個版本。
清理
- 移除應用程式路由規則
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
$ kubectl delete httproute reviews
- 如果您不打算探索任何後續任務,請參閱Bookinfo 清理說明以關閉應用程式。