一般来说,我所做的是,如果是 tcp 流量,我创建一个虚拟服务来侦听 tcp 网关并将其路由到正确的主机。就像这样-
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
creationTimestamp: "2024-03-19T17:17:44Z"
generation: 2
name: tcp-test-virtual-service
namespace: default
resourceVersion: "1076485"
uid: 9cc94534-2dec-4165-8dec-4a8fb66087ea
spec:
gateways:
- tcp-test
hosts:
- '*'
tcp:
- match:
- port: 2057
route:
- destination:
host: tcp-test
port:
number: 2057
但是k8s中的virtualservice资源不允许
spec:
udp:
它返回此错误 -
denied the request: configuration is invalid: http, tcp or tls must be provided in virtual service
那么将传入 udp 网关的流量路由到的正确方法是什么?
基于 stackoverflow 中发布的此链接,istio 不支持 UDP。然而,在同一个链接中,其中一个答案提到将会有一个更新,其中将支持 UDP 协议。
但是,查看 istio VirtualService 的文档,似乎仍然没有 UDP 端口的配置。
但是在搜索这个问题时,我遇到了这个文档,标题为“在 Istio 中公开基于 TCP 和 UDP 的服务 - 简单的方法”,基于文档,其中场景是已经创建了一个服务,他们对其进行编辑并添加 TCP 。但据说它也可以做UDP端口。
从例子来看
KUBE_EDITOR="nano" kubectl edit svc -n istio-system istio-ingressgateway
# Add this within the ports section of the svc.
...
- name: redis
port: 6379
protocol: TCP #can be also UDP for udp service
targetPort: 6379
…
从带有 # 的注释中可以看到,它提到它也可以更改为 UDP 以提供 UDP 服务。对于这个问题,请确保您的服务公开 UDP 端口。