通过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设置成功。