天天看點

阿裡雲Kubernetes Service Mesh實踐進行時(3): 智能路由

概述

注意:在使用阿裡雲Kubernetes容器服務Istio 1.0的過程中,如果遇到類似CRD版本問題,請參考我們提供的

問題分析

。 我們會持續更新遇到的問題及其解決方法。

上一篇文章通過一個官方示例示範了如何部署應用到上述Istio環境中,本文使用此示例來嘗試 Istio 的流量路由、故障注入、流量轉移等功能。

阿裡雲Kubernetes Service Mesh實踐進行時(1): Istio初體驗 阿裡雲Kubernetes Service Mesh實踐進行時(2): 通過示例深入Istio 阿裡雲Kubernetes Service Mesh實踐進行時(3): 智能路由 阿裡雲Kubernetes Service Mesh實踐進行時(4): 分布式追蹤 阿裡雲Kubernetes Service Mesh實踐進行時(5): 遙測資料收集、查詢及可視化 阿裡雲Kubernetes Service Mesh實踐進行時(6): 故障診斷與檢測工具Weave Scope 阿裡雲Kubernetes Service Mesh實踐進行時(7): 可觀測性分析服務Kiali

快速回顧一下這個官方示例,具體可以參見:

https://istio.io/docs/guides/bookinfo

如下所示,包括了四個獨立的微服務,由不同語言編寫,這些服務與 Istio 本身沒有任何依賴關系。

阿裡雲Kubernetes Service Mesh實踐進行時(3): 智能路由

請求路由

BookInfo示例部署了三個版本的reviews服務,是以需要設定一個預設路由。否則當多次通路該應用程式時,會發現有時輸出會包含帶星級的評價内容,有時又沒有。出現該現象的原因是當沒有為應用顯式指定預設路由時,Istio會将請求随機路由到該服務的所有可用版本上。

将所有微服務的預設版本設定為v1

通過運作如下指令,将所有微服務的預設版本設定為v1:

istioctl create -f samples/bookinfo/routing/route-rule-all-v1.yaml           

可以通過下面的指令來顯示所有以建立的路由規則:

istioctl get virtualservices -o yaml           

由于路由規則是通過異步方式分發到代理的,過一段時間後規則才會同步到所有pod上。是以需要等幾秒鐘後再嘗試通路應用。

在浏覽器中打開BookInfo應用程式的URL:

http://

{EXTERNAL-IP}/productpage

如何擷取EXTERNAL-IP,請參照上一篇文章的介紹。

可以看到BookInfo應用程式的productpage頁面,顯示的内容中不包含帶星的評價資訊,這是因為reviews:v1服務不會通路ratings服務。

阿裡雲Kubernetes Service Mesh實踐進行時(3): 智能路由

将來自特定使用者的請求路由到reviews:v2

通過運作如下指令,把來自測試使用者"jason"的請求路由到reviews:v2,以啟用ratings服務。

kubectl replace -f samples/bookinfo/routing/route-rule-reviews-test-v2.yaml           

可以通過如下指令确認規則是否建立:

kubectl  get virtualservice reviews -o yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  clusterName: ""
  creationTimestamp: 2018-06-04T10:49:53Z
  generation: 0
  name: reviews
  namespace: default
  resourceVersion: "2596548"
  selfLink: /apis/networking.istio.io/v1alpha3/namespaces/default/virtualservices/reviews
  uid: 03528fd9-67e5-11e8-af82-00163e0c19c2
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        cookie:
          regex: ^(.*?;)?(user=jason)(;.*)?$
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1           

确認規則已建立之後,在浏覽器中打開BookInfo應用程式的URL:

以"jason"使用者登入productpage頁面,應該可以在每條評價後面看到星級資訊。

阿裡雲Kubernetes Service Mesh實踐進行時(3): 智能路由
了解背後的機制: 首先使用Istio将100%的請求流量都路由到了BookInfo服務的v1版本,然後再設定了一條路由規則;該路由規則基于請求的header(例如一個使用者cookie)選擇性地将特定的流量路由到了reviews服務的v2版本。

故障注入

為了測試BookInfo微服務應用的彈性,我們計劃針對"jason"使用者在reviews:v2和ratings服務之間 注入7秒的延遲 。由于 reviews:v2 服務針對調用ratings服務設定了10秒的逾時,是以期望端到端的流程能無錯持續。

HTTP Delay

使用HTTP Delay建立一個故障注入規則,延遲來自使用者jason的流量:

kubectl replace -f samples/bookinfo/routing/route-rule-ratings-test-delay.yaml           

以"jason"使用者登入productpage頁面,應該可以看到如下畫面:

阿裡雲Kubernetes Service Mesh實踐進行時(3): 智能路由
整個review服務失敗的原因:productpage和review服務之間的逾時小于(3秒加上一次重試,總共6秒)review服務和rating服務之間的逾時(10秒)。在由不同開發團隊負責獨立開發不同微服務的典型企業應用中,這類bug就會發生。Istio的故障注入規則有助于識别這些異常,而無需影響到最終使用者。

HTTP Abort

類似地,使用HTTP Abort建立一個故障注入規則:

kubectl replace -f samples/bookinfo/routing/route-rule-ratings-test-abort.yaml           
阿裡雲Kubernetes Service Mesh實踐進行時(3): 智能路由

流量轉移

除了基于内容的路由,Istio還支援基于權重的路由規則。

首先,将所有微服務的預設版本設定為v1:

kubectl replace -f samples/bookinfo/routing/route-rule-all-v1.yaml           

其次,使用下面的指令把50%的流量從reviews:v1轉移到reviews:v3:

kubectl replace -f samples/bookinfo/routing/route-rule-reviews-50-v3.yaml           

在浏覽器中多次重新整理productpage頁面,大約有50%的幾率會看到頁面中出現帶紅星的評價内容。

注意該方式和使用容器編排平台的部署特性來進行版本遷移是完全不同的。容器編排平台使用了執行個體scaling來對流量進行管理。而通過Istio,兩個版本的reviews服務可以獨立地進行scale up和scale down,并不會影響這兩個版本服務之間的流量分發。

總結

我們可以利用阿裡雲Kubernetes容器服務,快速搭建一套用于連接配接、管理以及安全化微服務的開放平台Istio,為應用引入和配置多個相關服務。本文通過一個官方示例來嘗試了Istio 的流量路由、故障注入、流量轉移等功能。歡迎大家使用阿裡雲上的容器服務,快速搭建微服務的開放治理平台Istio,比較簡單地內建到自己項目的微服務開發中。

繼續閱讀