如何解决 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。
存在一些缩进问题。我参考以下链接解决了它
您的问题是您创建了一个包含 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 服务子集之间差异的标签。
对于以下文件,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。
存在一些缩进问题。我参考以下链接解决了它
您的问题是您创建了一个包含 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 服务子集之间差异的标签。