通過VirtualService定義路由規則時,如果您的服務包含很多微服務,或者您的服務包含很多路由規則,會存在維護一個龐大的VirtualService的問題。ASM引入了Delegate機制,將服務的路由規則進行拆分,降低路由規則變更帶來的風險。本文以Bookinfo服務為例,演示如何使用多個VirtualService定義Bookinfo服務的路由規則。
前提條件
已添加集群到ASM實例,且ASM實例為1.8.6.4及以上版本。
已部署入口網關。具體操作,請參見創建入口網關。
已部署應用到ASM實例的集群中。具體操作,請參見在ASM實例關聯的集群中部署應用。
背景信息
在服務網格ASM中,通過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的路由規則合并。
步驟一:設置網關規則
登錄ASM控制臺。
在左側導航欄,選擇 。
在網格管理頁面,找到待配置的實例,單擊實例的名稱或在操作列中單擊管理。
在網格詳情頁面左側導航欄,選擇 ,然后在右側頁面,單擊使用YAML創建。
選擇命名空間,并將以下內容復制到文本框中,單擊創建。本文以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: - "*"
設置
number
為80
,使Bookinfo服務通過80端口接收傳入或傳出的HTTP連接。
步驟二:設置主虛擬服務
登錄ASM控制臺。
在左側導航欄,選擇 。
在網格管理頁面,找到待配置的實例,單擊實例的名稱或在操作列中單擊管理。
在網格詳情頁面左側導航欄,選擇 ,然后在右側頁面,單擊使用YAML創建。
選擇命名空間,并將以下內容復制到文本框中,單擊創建。本文以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的命名空間。
步驟三:設置子虛擬服務
登錄ASM控制臺。
在左側導航欄,選擇 。
在網格管理頁面,找到待配置的實例,單擊實例的名稱或在操作列中單擊管理。
在網格詳情頁面左側導航欄,選擇 ,然后在右側頁面,單擊使用YAML創建。
選擇命名空間,并將以下內容復制到文本框中,單擊創建。
本文以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:設置請求的過濾條件。本文設置
uri
為exact: /login
和exact: /logout
,表示可以登錄和登出Bookinfo服務。
重復執行上述步驟,選擇命名空間,并將以下內容復制到文本框中,單擊創建。
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參數。
結果驗證
在瀏覽器中輸入http://<ASM網關地址>/productpage。
顯示以下頁面,說明請求中包含
/productpage
參數訪問Bookinfo服務成功,即vs-2的VirtualService設置成功。關于如何獲取ASM網關地址,請參見獲取入口網關地址。單擊頁面右上角的Sign in,在彈出的對話框輸入任意賬號密碼,登錄Bookinfo服務。
顯示如下頁面,說明登錄Bookinfo服務成功,即vs-1的VirtualService設置成功。