我在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"
?
答案 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的容器。