基于标题用户代理的Istio RouteRule不起作用

时间:2018-02-26 09:20:54

标签: kubernetes kubectl minikube istio

我在minikube上运行了两项服务,FooBar。当我访问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"

1 个答案:

答案 0 :(得分:3)

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

进一步检查是通过const BusinessNetworkConnection = require('composer-client').BusinessNetworkConnection; let businessNetworkConnection = new BusinessNetworkConnection(); return businessNetworkConnection.connect('admin@health-network') .then(() => { return businessNetworkConnection.getParticipantRegistry('org.acme.health'); }) .then((participantRegistry) => { let factory = businessNetworkConnection.getFactory(); let participant = factory.newResource('org.acme.health', 'Patient', '10'); participant.firstName = 'Mae'; participant.lastName = 'Smith'; participant.email ='smith@gmail.com' return participantRegistry.add(participant); }) .then(() => { return businessNetworkConnection.disconnect(); }) .catch((error) => { console.error(error); process.exit(1); }); 从Foo执行对{Bar}的curl调用,并在向User-Agent标头传递时检查版本2.0是否已被调用:

kubectl exec

您可以在Foo容器中安装curl -H "user-agent: ---Chrome---" bar-server ,也可以使用带curl的单独容器,例如来自Istio样本https://github.com/istio/istio/blob/master/samples/sleep/sleep.yaml的容器。