基于 headers user-agent 的 Istio RouteRule 不起作用
Istio RouteRule based on headers user-agent doesn't work
我在 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"
。
现在我想在 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
的容器
我在 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"
。
现在我想在 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