0

我在 minikube 上运行了两个服务,Foo并且Bar. 当我访问该Foo服务时,它会请求Bar服务以检索一些数据。Bar服务有 2 个版本"1.0""2.0". 我已经设置了默认RouteRule配置,istio将所有请求路由到"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"

4

1 回答 1

3

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

额外的检查是curl从 Foo 执行对 Bar 的调用,kubectl exec并检查在传递 User-Agent 标头时是否调用了 2.0 版:

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

您可以安装curl在您的 Foo 容器中,也可以使用带有 的单独容器curl,例如Istio 示例中的这个

于 2018-02-26T17:25:33.177 回答