如何解决 Istio 流量路由错误?

How to resolve Istio traffic routing bug?

对于以下文件,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

任何人都可以帮忙吗?

我认为问题在于,对于所有版本,您都有相同的标签 app: web,因此 istio 使用这些标签将流量定向到 pods,它们恰好是同一个 pod。您需要为不同的版本指定不同的标签,例如 vor v2,标签是 version: v1,对于 v2 - version: v2,您还需要使用这些标签创建 pods。

存在一些缩进问题。我参考以下链接解决了它

https://raw.githubusercontent.com/istio/istio/release-1.0/samples/bookinfo/networking/destination-rule-all-mtls.yaml

您的问题是您创建了一个包含 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

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