如何在Istio VirtualService正则表达式中实现逻辑OR



问题

管道字符在Istio的VirtualService中似乎不起作用。

下面的示例旨在基于user-agent报头来路由请求。来自移动设备的请求应转到myapp,来自桌面用户的请求应转至deskt-app,由下一个匹配块处理。当我使用以下正则表达式时,<REGEX>字段有效:

  • ^.*bMobileb.*$

但是这些功能需要一个更复杂的正则表达式来识别移动用户。当我使用这些时,我的路由完全中断:

  • ^.*b(iPhone|Pixel)b.*$
  • ^.*b(iPhone|Pixel)+b.*$
  • ^.*biPhone|Pixelb.*$

预期行为

使用带有管道的正则表达式(逻辑OR),当我有一个包含单词"iPhone"或"Pixel"的user-agent标头时,我希望被路由到myapp

实际行为

我被安排到deskt-app

问题

如何在IstioVirtualService正则表达式模式中实现逻辑OR?这是我的问题,还是我忽略了一些显而易见的东西?


示例VirtualService

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
...
...
http:
- match:
- headers:
user-agent:
regex: "<REGEX>"    <------
uri:
prefix: /foo/bar
route:
- destination:
host: myapp
port:
number: 80
- match:
- uri:
prefix: /foo/bar
route:
- destination:
host: deskt-app
port:
number: 80

编辑:Github问题

您的配置是正确的,所以问题一定是Regex,或者用户代理的内容不同,请尝试'^.*(iPhone|Pixel).*$'

刚刚验证了当标题包含android或iphone:时,下面的配置是否正确路由

- match:
- headers: 
user-agent: 
regex: '^.*(Android|iPhone).*$'

并使用进行测试

[match]curl-H"用户代理:Mozilla/5.0(Linux;U;iPhone 4.4.2;en-us;)"。。。

[no-match]curl-H"用户代理:Mozilla/5.0(Linux;U;Iphne 4.4.2;en-us;)"。。。

最新更新