全部產品
Search
文件中心

Alibaba Cloud Service Mesh:在ASM中使用VirtualService的Delegate能力

更新時間:Jun 30, 2024

通過VirtualService定義路由規則時,如果您的服務包含很多微服務,或者您的服務包含很多路由規則,會存在維護一個龐大的VirtualService的問題。ASM引入了Delegate機制,將服務的路由規則進行拆分,降低路由規則變更帶來的風險。本文以Bookinfo服務為例,示範如何使用多個VirtualService定義Bookinfo服務的路由規則。

前提條件

背景資訊

Service MeshASM中,通過VirtualService定義路由規則,控制流程量路由到服務上的各種行為 。實際使用過程中,會遇到維護一個龐大的VirtualService的問題。服務的路由升級都要修改這個VirtualService規則,同時升級經常會導致服務路由更新衝突,路由配置冗餘和耦合。任何的規則配置錯誤,都會影響資料平面叢集下的服務,甚至影響所有的服務訪問。

ASM通過擴充VirtualService引入了Delegate機制,使服務的路由規則無需耦合在一個VirtualService中。您可以將VirtualService拆分為主VirtualService和子VirtualService。主VirtualService定義了服務的總規則,子VirtualService定義了服務的詳細路由規則。主VirtualService由管理員統一維護,子VirtualService由服務維護者進行維護,可以大大降低服務路由規則變更帶來的風險,提高服務獨立部署和升級的效率。

注意事項

  • ASM不支援對Delegate進行嵌套,只允許在主VirtualService設定Delegate參數,例如主VirtualService和子VirtualService都設定了Delegate參數,則該主VirtualService和子VirtualService將不會生效。

  • 子VirtualService的HTTPMatchRequest為主VirtualService的子集,否則會發生衝突,HTTPRoute將不會生效。

  • 當主VirtualService的Route和Redirect為空白時,才可以指定Delegate。子VirtualService的Hosts必須為空白。子VirtualService的路由規則會和主VirtualService的路由規則合并。

步驟一:設定網關規則

  1. 登入ASM控制台

  2. 在左側導覽列,選擇服務網格 > 網格管理

  3. 網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理

  4. 在網格詳情頁面左側導覽列,選擇ASM網關 > 網關規則,然後在右側頁面,單擊使用YAML建立

  5. 選擇命名空間,並將以下內容複寫到文字框中,單擊建立。本文以default命名空間為例。

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: ingressgateway # use istio default controller
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"

    設定number80,使Bookinfo服務通過80連接埠接收傳入或傳出的HTTP串連。

步驟二:設定主虛擬服務

  1. 登入ASM控制台

  2. 在左側導覽列,選擇服務網格 > 網格管理

  3. 網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理

  4. 在網格詳情頁面左側導覽列,選擇流量管理中心 > 虛擬服務,然後在右側頁面,單擊使用YAML建立

  5. 選擇命名空間,並將以下內容複寫到文字框中,單擊建立。本文以default命名空間為例。

    以下內容建立了vs-1和vs-2的delegate,其中vs-1要求請求中必須包含/log才能訪問Bookinfo服務,vs-2要求請求中必須包含/才能訪問Bookinfo服務。

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: bookinfo
      namespace: default
    spec:
      gateways:
        - bookinfo-gateway
      hosts:
        - '*'
      http:
        - delegate:
            name: vs-1
            namespace: ns1
          match:
            - uri:
                prefix: /log
        - delegate:
            name: vs-2
            namespace: ns1
          match:
            - uri:
                prefix: /

    delegate下的參數解釋:

    • name:delegate的名稱。

    • namespace:delegate的命名空間。

步驟三:設定子虛擬服務

  1. 登入ASM控制台

  2. 在左側導覽列,選擇服務網格 > 網格管理

  3. 網格管理頁面,找到待配置的執行個體,單擊執行個體的名稱或在操作列中單擊管理

  4. 在網格詳情頁面左側導覽列,選擇流量管理中心 > 虛擬服務,然後在右側頁面,單擊使用YAML建立

  5. 選擇命名空間,並將以下內容複寫到文字框中,單擊建立

    本文以ns1命名空間為例。關於如何建立命名空間,請參見管理全域命名空間

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-1
      namespace: ns1
    spec:
      http:
        - match:
            - uri:
                exact: /login
            - uri:
                exact: /logout
          route:
            - destination:
                host: productpage.default.svc.cluster.local
                port:
                  number: 9080
    • metadata:與主VirtualService的delegate參數保持一致,用於綁定delegate參數。本文與vs-1的delegate參數一致,表示綁定vs-1的delegate參數。

    • match:佈建要求的過濾條件。本文設定uriexact: /loginexact: /logout,表示可以登入和登出Bookinfo服務。

  6. 重複執行上述步驟,選擇命名空間,並將以下內容複寫到文字框中,單擊建立

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: vs-2
      namespace: ns1
    spec:
      http:
        - match:
            - uri:
                exact: /productpage
            - uri:
                prefix: /static
            - uri:
                prefix: /api/v1/products
          route:
            - destination:
                host: productpage.default.svc.cluster.local
                port:
                  number: 9080
    • metadata:與主VirtualService的delegate參數保持一致,用於綁定delegate參數。本文與vs-2的delegate參數一致,表示綁定vs-2的delegate

    • match:佈建要求的過濾條件。本文佈建要求中必須包含/productpage/static/api/v1/products參數。

結果驗證

  1. 在瀏覽器中輸入http://<ASM網關地址>/productpage

    顯示以下頁面,說明請求中包含/productpage參數訪問Bookinfo服務成功,即vs-2的VirtualService設定成功。關於如何擷取ASM網關地址,請參見擷取入口網關地址服務

  2. 單擊頁面右上方的Sign in,在彈出的對話方塊輸入任意帳號密碼,登入Bookinfo服務。

    顯示如下頁面,說明登入Bookinfo服務成功,即vs-1的VirtualService設定成功。登入