通過VirtualService定義路由規則時,如果您的服務包含很多微服務,或者您的服務包含很多路由規則,會存在維護一個龐大的VirtualService的問題。ASM引入了Delegate機制,將服務的路由規則進行拆分,降低路由規則變更帶來的風險。本文以Bookinfo服務為例,示範如何使用多個VirtualService定義Bookinfo服務的路由規則。
前提條件
已添加叢集到ASM執行個體,且ASM執行個體為1.8.6.4及以上版本。
已部署入口網關。具體操作,請參見建立入口網關。
已部署應用到ASM執行個體的叢集中。具體操作,請參見在ASM執行個體關聯的叢集中部署應用。
背景資訊
在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的路由規則合并。
步驟一:設定網關規則
登入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設定成功。