Istio VirtualService HTTP标头匹配问题

时间:2018-06-04 14:29:52

标签: istio

以下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/38Istio RouteRule based on headers user-agent doesn't work。但是我无法使其正常运作。

指针会非常有用,因为睡眠服务会返回类似于POSTMAN的产品页面而不会影响匹配条件!

2 个答案:

答案 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致电评论服务。如果你不这样做,有两种方法可以解决问题:

  1. 如果您正在调用产品页面(curl <ingress url>/productpage -H "foo: bar"),则没有任何逻辑可以将foo: bar标题从产品页面传播到评论服务。 user-agent的示例有效,因为user-agent会自动传播(特殊情况)。如果您要使用foo: bar,则必须向产品页面服务添加逻辑以获取foo标题并将其发送到评论服务。

  2. 您正在直接呼叫评论服务(例如,您为评论服务提供了一个节点端口)。这将失败,因为您的请求未被Istio代理路由 - 而不是由k8s服务负载均衡器处理。您需要调用Istio代理,例如ingressgateway