使用Istio服務網格實現流量映象

banq發表於2018-12-31

Istio除了支援不同服務版本之間的更多“傳統”流量路由,包括可以基於各種傳入請求屬性,例如URL的部分,標頭值,請求方法等,Istio還支援流量映象。
當您不想釋出新版本並向其公開使用者時,可以使用流量映象,但您仍然希望部署它並觀察其工作原理,收集遙測資料並比較新舊服務的效能和功能。
您可能會問 - 這種部署和釋出有什麼區別?當我們談論將服務“部署”到生產時,我們只是將可執行程式碼(二進位制檔案,容器,程式碼所需的任何形式)移動到生產環境中,但不向它傳送任何生產流量。服務就在那裡,但它不會(希望如此!)影響它旁邊執行的任何現有服務。這是部署而不釋出。
釋出服務涉及獲取已部署的服務並開始將生產流量路由到該服務。此時,我們轉移到生產的程式碼正在執行,它可能會影響其他服務和終端使用者。
在兩個版本之間路由流量,執行藍綠色版本是有用的,但是存在風險 - 如果服務中斷或出現故障會怎樣?即使服務僅接收1%的生產流量,它仍然會對許多使用者產生負面影響。

流量映象背後的想法是將使用者暴露給潛在的錯誤服務的風險最小化。我們不是部署,釋放流量並將流量路由到新服務,而是部署新服務,然後只映象那些傳送到已釋出版本服務的生產流量。(類似模擬複流量)

然後,可以觀察服務接收映象流量的錯誤,但不會影響任何生產流量。除了對部署的服務版本執行各種測試之外,您現在還可以使用實際的生產流量並增加測試覆蓋率,這可以讓您更有信心並最大限度地降低釋出錯誤服務的風險。

以下是有關如何使用Istio開啟流量映象的快速摘錄:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
    name: greeter-service
spec:
    hosts:
        - greeter-service
    http:
    - route:
      - destination:
          host: greeter-service
          port:
            number: 3000
          subset: v1
        weight: 100
      mirror:
        host: greeter-service
        port:
            number: 3000


以上是將greeter-service的v1子集流量對映到v2子集

上面的虛擬服務將100%的流量路由到v1版本,同時還將相同的流量映象到v2版本。檢視此操作的最快方法是在向v1版本的服務傳送一些請求時,從v2服務中檢視日誌。

您將在網頁上看到的響應將來自服務的v1版本,但是,您還會看到傳送到v2版本的請求:

$ kubectl logs greeter-service-v2–78fc64b995-krzf7 -c svc -f
> greeter-service@2.0.0 start /app
> node server.js
Listening on port 3000
GET /hello 200 9.303 ms — 59
GET /hello 200 0.811 ms — 59
GET /hello 200 0.254 ms — 59
GET /hello 200 3.563 ms — 59


 

相關文章