istio 實戰 三 智能路由

系列文章


簡介

上文介紹到 istio bookinfo,瀏覽器訪問 product 服務,界面五角星顏色發生變化, 這是通過service 訪問 details、reviews 服務以及不同的版實現。

如何通過istio智能路由訪問details、review是服務的某個版本,使用 Bookinfo 示例應用,演示運行中的應用進行請求路由的動態配置以及故障注入的方法。


前提


istio 組件

  • 數據面
    • envoy
  • 控制面板
    • Pilot:服務發現、流量管理
    • Mixer:訪問控制、遙測
    • Citadel:終端用戶認證、流量加密

istio 管理基礎概念

  • Gateway: 類似於k8s ingress, HTTP/TCP 流量配置負載均衡器,流量入口
  • VirtualService: 定義路由規則,控制流量路由到服務上的各種行爲
  • DestinationRule: 在 VirtualService 路由生效後,配置應用與請求的策略集
  • ServiceEntry: 網格內部請求外部服務的策略

任務

在這裏插入圖片描述

    1. 流量全部導向 reviews 服務的 v1 版本。(reviews:v1 不包含星級評分功能的版本)
    1. 特定用戶的請求發送給 v2 版本,其他用戶則不受影響(reviews:v2 是包含星級評分功能的版本)

任務一操作步驟

1.1 yaml 解析

virtual-service-all-v1.yaml

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: productpage
spec:
  hosts:
  - productpage
  http:
  - route:
    - destination:
        host: productpage
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: details
spec:
  hosts:
  - details
  http:
  - route:
    - destination:
        host: details
        subset: v1
---

  • 該配置中流量的目標主機是 reviews,如果該服務和規則部署在 Kubernetes 的 default namespace 下的話,對應於 Kubernetes 中的服務的 DNS 名稱就是 reviews.default.svc.cluster.local。
  • 我們在 hosts 配置了服務的名字只是表示該配置是針對 reviews.default.svc.cluster.local 的服務的路由規則,但是具體將對該服務的訪問的流量路由到哪些服務的哪些實例上,就是要通過 destination 的配置了。
  • 我們看到上面的 VirtualService 的 HTTP 路由中還定義了一個 destination。destination 用於定義在網絡中可尋址的服務,請求或連接在經過路由規則的處理之後,就會被髮送給 destination。destination.host 應該明確指向服務註冊表中的一個服務。Istio 的服務註冊表除包含平臺服務註冊表中的所有服務(例如 Kubernetes 服務、Consul 服務)之外,還包含了 ServiceEntry 資源所定義的服務。VirtualService 中只定義流量發送給哪個服務的路由規則,但是並不知道要發送的服務的地址是什麼,這就需要 DestinationRule 來定義了。
  • subset 配置流量目的地的子集,下文會講到。VirtualService 中其實可以除了 hosts 字段外其他什麼都不配置,路由規則可以在 DestinationRule 中單獨配置來覆蓋此處的默認規則。

1.2 應用 virtual service

kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

1.3 測試

瀏覽器中打開http://ingressip:port/productpage 刷新
v1版本的服務不訪問星級評分服務,無論您刷新多少次,頁面的評論部分都不會顯示評級星標。
此時已經成功的將所有流量路由到版本 reviews:v1。
在這裏插入圖片描述

任務二 操作步驟

2.1 yaml解析

virtual-service-reviews-test-v2.yaml 主要增加了用戶檢測

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1

2.2 應用 virtual service

kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml

2.3 測試

  • 在 Bookinfo 應用程序的 /productpage 上,以用戶 jason 身份登錄。
    刷新瀏覽器。你看到了什麼?星級評分顯示在每個評論旁邊。
  • 以其他用戶身份登錄(選擇您想要的任何名稱)。
    刷新瀏覽器。現在星星消失了。這是因爲除了 Jason 之外,所有用戶的流量都被路由到 reviews:v1。

您已成功配置 Istio 以根據用戶身份路由流量。
在這裏插入圖片描述

github地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章