基于 headers user-agent 的 Istio RouteRule 不起作用

Istio RouteRule based on headers user-agent doesn't work

我在 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"。 现在我想在 header 的基础上再添加一个 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 header 存在。 我如何调试请求以查看为什么它没有转发到 "2.0"?

可能是您的 Foo 服务没有传递从浏览器获取的 User-Agent header。

额外的检查是通过 kubectl exec 从 Foo 执行对 Bar 的 curl 调用,并检查在将 User-Agent header 传递给它时是否调用了版本 2.0 :

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

您可以在您的 Foo 容器中安装 curl,或者使用带有 curl 的单独容器,例如来自 Istio samples

的容器