如何解决Istio交通路由错误?

时间:2018-11-19 10:41:39

标签: kubernetes istio spinnaker

对于以下文件,ISTIO仅在第一个v1应用程序中显示输出。如果更改v1的版本,则输出将更改。因此,流量根本不会转移到其他版本。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sampleweb
  namespace: default
spec:
  hosts:
  - "web.xyz.com"
  gateways:
  - http-gateway
  http:
  - route:
    - destination:
        port:
          number: 8080
        host: web
        subset: v1
      weight: 30
  - route:
    - destination:
        port:
          number: 8080
        host: web
        subset: v2
      weight: 30
  - route:
    - destination:
        port:
          number: 8080
        host: web
        subset: v3
      weight: 40

---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: samplewebdr
  namespace: default
spec:
  host: web
  subsets:
  - name: v1
    labels:
      app: web
      version: prod
  - name: v2
    labels:
      app: web
      version: baseline
  - name: v3
    labels:
      app: web
      version: canary
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

您的问题是您创建了一个包含3条规则的VirtualService。因此,没有特定匹配条件的第一个规则始终是被调用的规则。当VirtualService中有多个规则时,您需要注意按here所述正确地排序它们。

也就是说,在您的情况下,您实际上并不需要多个规则,而是一个具有多个加权目标的单个规则,如下所示:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: sampleweb
  namespace: default
spec:
  hosts:
  - "web.xyz.com"
  gateways:
  - http-gateway
  http:
  - route:
    - destination:
        port:
          number: 8080
        host: web
        subset: v1
      weight: 30
    - destination:
        port:
         number: 8080
        host: web
        subset: v2
      weight: 30
    - destination:
        port:
          number: 8080
        host: web
        subset: v3
      weight: 40

顺便说一句,尽管无害,但您不需要在app: web子集中包含DestinationRule标签。您只需要用于唯一标识Web服务子集之间差异的标签。

答案 1 :(得分:0)

答案 2 :(得分:-1)

我认为问题在于,对于所有版本,您都具有相同的标签app: web,因此istio将流量引导到带有这些标签的Pod,而它们恰好是同一Pod。您需要为vor v2等不同版本指定不同的标签,对于v2-version: v1,标签为version: v2,并且还需要使用这些标签创建广告连播。