基于 headers 用户代理的 Istio 路由规则不起作用



我在Minikube,FooBar上有两个服务。当我访问Foo服务时,请要求Bar服务检索一些数据。Bar服务有2个版本"1.0""2.0"。我已经设置了使用istio设置默认的RouteRule配置,以将所有请求路由到"1.0"

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
  name: bar-default
spec:
  destination:
    name: bar-server
  precedence: 1
  route:
  - labels:
      version: "1.0"

它可以正常工作,我可以看到所有请求都转发到"1.0"。现在,我想根据标题添加另一个RouteRule,因此Chrome浏览器的所有请求都将转发到"2.0"

apiVersion: config.istio.io/v1alpha2
kind: RouteRule
metadata:
  name: bar-v2
spec:
  destination:
    name: bar-server
  precedence: 2
  match:
    request:
      headers:
        user-agent:
          regex: ".*Chrome.*"
  route:
  - labels:
      version: "2.0"

并且它不起作用。所有请求仍将路由到"1.0"。我可以看到RouteRule是创建的:

> istioctl get routerules
NAME            KIND                    NAMESPACE
bar-default RouteRule.v1alpha2.config.istio.io  default
bar-v2      RouteRule.v1alpha2.config.istio.io  default

我可以在浏览器中的开发人员工具中看到UserAgent标头存在。我如何调试请求,看看为什么不转发到"2.0"

可能是您的foo服务不会通过浏览器获得的用户代理标头。

其他检查将是通过kubectl exec从FOO中执行curl调用bar,并在传递用户代理标头时检查该版本2.0:

curl -H "user-agent: ---Chrome---" bar-server

您可以在FOO容器中安装curl,也可以使用带有curl的单独容器,例如ISTIO Samples

最新更新