以下Istio 0.8 VirtualService无法与HTTP标头匹配。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
spec:
hosts:
- reviews
http:
- match:
- headers:
foo:
exact: bar
route:
- destination:
host: reviews
subset: v2
- route:
- destination:
host: reviews
subset: v3
我已关注https://github.com/istio/issues/issues/38和Istio RouteRule based on headers user-agent doesn't work。但是我无法使其正常运作。
指针会非常有用,因为睡眠服务会返回类似于POSTMAN的产品页面而不会影响匹配条件!
答案 0 :(得分:0)
如果您没有DestinationRule
来定义您的子集(版本),则此虚拟服务本身不会起作用。
我将演示如何使用0.8版本打包的HelloWorld示例:
第1步:部署samples/helloworld/helloworld.yaml
第2步:为两个可用版本定义DestinationRule
:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: helloworld
spec:
host: helloworld
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
第3步:将默认VirtualService
替换为与路由标题属性匹配的默认值{{p}>
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: helloworld
spec:
hosts:
- "*"
gateways:
- helloworld-gateway
http:
- match:
- headers:
foo:
exact: bar
route:
- destination:
host: helloworld
subset: v2
- route:
- destination:
host: helloworld
subset: v1
第4步:测试:
没有标题:curl http://$INGRESS_GATEWAY/hello
输出:
你好版本:v1,实例:helloworld-v1-fd9b784bb-wcnj9
标题为:curl -H "foo: bar" http://$INGRESS_GATEWAY/hello
输出:
你好版本:v2,实例:helloworld-v2-56694b7d6d-gbhqb
答案 1 :(得分:0)
您需要通过ingressgateway
致电评论服务。如果你不这样做,有两种方法可以解决问题:
如果您正在调用产品页面(curl <ingress url>/productpage -H "foo: bar"
),则没有任何逻辑可以将foo: bar
标题从产品页面传播到评论服务。 user-agent
的示例有效,因为user-agent
会自动传播(特殊情况)。如果您要使用foo: bar
,则必须向产品页面服务添加逻辑以获取foo
标题并将其发送到评论服务。
您正在直接呼叫评论服务(例如,您为评论服务提供了一个节点端口)。这将失败,因为您的请求未被Istio代理路由 - 而不是由k8s服务负载均衡器处理。您需要调用Istio代理,例如ingressgateway
。