以下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的产品页面,没有匹配条件的含义!
您需要通过ingressgateway
致电评论服务。如果你不这样做,有两种方法可以解决问题:
curl <ingress url>/productpage -H "foo: bar"
),则没有任何逻辑可以将foo: bar
标头从productpage传播到评论服务。 user-agent
的例子是有效的,因为user-agent
会自动传播(特殊情况)。如果你想使用foo: bar
,你必须在产品页面服务中添加逻辑以获取foo
标题并将其发送到评论服务。ingressgateway
。如果您没有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
替换为与路由的header属性匹配的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
:
curl http://$INGRESS_GATEWAY/hello
第4步:测试它:
curl -H "foo: bar" http://$INGRESS_GATEWAY/hello
输出:
您好版本:v1,实例:helloworld-v1-fd9b784bb-wcnj9