Istio VirtualService HTTP标头匹配问题

问题描述 投票:2回答:2

以下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的产品页面,没有匹配条件的含义!

istio
2个回答
0
投票

您需要通过ingressgateway致电评论服务。如果你不这样做,有两种方法可以解决问题:

  1. 如果您正在调用productpage(curl <ingress url>/productpage -H "foo: bar"),则没有任何逻辑可以将foo: bar标头从productpage传播到评论服务。 user-agent的例子是有效的,因为user-agent会自动传播(特殊情况)。如果你想使用foo: bar,你必须在产品页面服务中添加逻辑以获取foo标题并将其发送到评论服务。
  2. 您正在直接呼叫评论服务(例如,您为评论服务提供了节点端口)。这将失败,因为您的请求未被Istio代理路由 - 而不是由k8s服务负载均衡器处理。你需要调用一个Istio代理,比如ingressgateway

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替换为与路由的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
  • 标题:qazxswpoi 输出: 您好版本:v2,实例:helloworld-v2-56694b7d6d-gbhqb
© www.soinside.com 2019 - 2024. All rights reserved.