在 Kubernetes 中为入口/出口使用静态 IP

Vik*_*ahl 5 udp nat google-cloud-platform kubernetes google-kubernetes-engine

我有一个试图在 Kubernetes 集群中运行的程序。该程序是一个使用基于 UDP 的非标准协议的服务器。该协议主要由短的请求/回复对组成,类似于 DNS。与 DNS 的一个主要区别是“服务器”和“客户端”都可以发送请求,即。通信可以由任何一方发起。

客户端是使用服务器 IP 地址配置的嵌入式设备。客户端将他们的请求发送到这个 IP。他们还检查传入消息是否来自该 IP,丢弃来自其他 IP 的消息。

我的问题是如何使用 Kubernetes 来设置服务器,以便

  1. 服务器接受特定 IP 上的传入 UDP 消息。
  2. 服务器可以看到真实的客户端源 IP。
  3. 服务器发送的任何回复(或其他消息)都具有与其源相同的 IP(以便客户端接受它们)。

我尝试过但不起作用的一件事是设置一个Servicewithtype: LoadBalancerexternalTrafficPolicy: Local(后者为要求 2 保留源 IP)。此设置满足上面的要求 1 和 2,但由于出站消息不通过负载均衡器,因此它们的源 IP 是包含服务器的 pod 正在运行的任何节点的源 IP。

我在 Google Cloud Platform (GKE) 上运行 Kubernetes。

Mar*_*ark -2

请按照以下内容验证解决方案:
1. Kubernetes.., c) Type=LoadBalancer
的服务的源 IP - 将部署公开为:--type=LoadBalancer - set service.spec.externalTrafficPolicy: '{"spec":{"externalTrafficPolicy “:“当地的”}}'


使用示例“echoserver”中描述的图像返回我的公共地址。

  • 当传出消息是对最近传入消息的回复时,传出流量确实会通过负载均衡器。然而,当LB后面的Pod决定向某个客户端发送消息而长时间没有收到该客户端的消息时,源IP是错误的。当发送到我们最近收到消息的客户端时,传出源 IP 是正确的(即客户端仍然有一个 conntrack 条目,我认为大约 30 秒)。当我们在长时间的沉默后决定与客户沟通时,传出的来源是错误的。 (2认同)
  • 我对此很感兴趣。在任何外部连接上,只有负载均衡器的地址必须显示为出站对等点,即使已经过去很长时间了。您能告诉我是否可以解决这个问题吗?另外,哪个 IP 地址作为出站发送而不是 LB 地址? (2认同)