我在Minikube,Foo
和Bar
上有两个服务。当我访问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