請求路由

此任務示範如何動態地將請求路由到微服務的多個版本。

開始之前

關於此任務

Istio 的 Bookinfo 範例包含四個獨立的微服務,每個微服務都有多個版本。其中一個微服務 reviews 已部署三個不同版本,且同時執行中。為了說明這造成的問題,請在瀏覽器中存取 Bookinfo 應用程式的 /productpage 並多次重新整理。URL 為 http://$GATEWAY_URL/productpage,其中 $GATEWAY_URL 是入口的外部 IP 位址,如Bookinfo 文件中所述。

您會注意到,有時候書籍評論輸出包含星等評分,有時候則沒有。這是因為在沒有明確的預設服務版本可供路由的情況下,Istio 會以循環方式將請求路由到所有可用的版本。

此任務的最初目標是套用規則,將所有流量路由到微服務的 v1(版本 1)。稍後,您將套用一條規則,根據 HTTP 請求標頭的值來路由流量。

路由到版本 1

若要僅路由到一個版本,您需要設定路由規則,將流量發送到微服務的預設版本。

  1. 執行以下命令來建立路由規則

Istio 使用虛擬服務來定義路由規則。執行以下命令來套用虛擬服務,將所有流量路由到每個微服務的 v1

壓縮
$ kubectl apply -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@

由於設定傳播最終是一致的,請等待幾秒鐘,讓虛擬服務生效。

  1. 使用以下命令顯示已定義的路由
$ 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

您已設定 Istio 來路由到 Bookinfo 微服務的 v1 版本,最重要的是 reviews 服務版本 1。

測試新的路由配置

您可以再次重新整理瀏覽器中 Bookinfo 應用程式的 /productpage 來輕鬆測試新的設定。請注意,無論您重新整理多少次,頁面的評論部分都不會顯示星等評分。這是因為您設定了 Istio 將所有針對評論服務的流量路由到版本 reviews:v1,而此版本的服務不會存取星等評分服務。

您已成功完成此任務的第一部分:將流量路由到服務的一個版本。

根據使用者身分路由

接下來,您將變更路由設定,以便將來自特定使用者的所有流量路由到特定的服務版本。在此案例中,來自名為 Jason 的使用者的所有流量將路由到服務 reviews:v2

此範例之所以可行,是因為 productpage 服務會將自訂的 end-user 標頭新增至所有發送到評論服務的出站 HTTP 請求。

Istio 也支援根據入口閘道上強驗證的 JWT 進行路由,詳細資訊請參閱基於 JWT 聲明的路由

請記住,reviews:v2 是包含星等評分功能的版本。

  1. 執行以下命令以啟用基於使用者的路由
壓縮
$ 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
  1. 在 Bookinfo 應用程式的 /productpage 中,以使用者 jason 登入。

    重新整理瀏覽器。您看到什麼?每個評論旁邊都會顯示星等評分。

  2. 以其他使用者登入(選擇您想要的任何名稱)。

    重新整理瀏覽器。現在星等消失了。這是因為除了 Jason 之外,所有使用者的流量都會路由到 reviews:v1

您已成功設定 Istio 以根據使用者身分路由流量。

了解發生了什麼事

在此任務中,您使用 Istio 將 100% 的流量發送到每個 Bookinfo 服務的 v1 版本。然後,您設定了一條規則,根據 productpage 服務新增至請求的自訂 end-user 標頭,有選擇性地將流量發送到 reviews 服務的 v2 版本。

請注意,Kubernetes 服務(例如此任務中使用的 Bookinfo 服務)必須遵守某些限制,才能利用 Istio 的 L7 路由功能。詳細資訊請參閱Pod 和服務的需求

流量轉移任務中,您將遵循您在此處學到的相同基本模式,設定路由規則以逐漸將流量從服務的一個版本發送到另一個版本。

清理

  1. 移除應用程式路由規則
壓縮
$ kubectl delete -f @samples/bookinfo/networking/virtual-service-all-v1.yaml@
  1. 如果您不打算探索任何後續任務,請參閱Bookinfo 清理說明以關閉應用程式。
此資訊是否對您有幫助?
您有任何改進建議嗎?

感謝您的回饋!