在K8s网络中,为什么UDP数据包被内核丢弃?

在K8s网络中,为什么UDP数据包被内核丢弃?
  1. 在 Azure 中我有两个 k8s 服务:serviceA 和 serviceB。serviceA 的类型是 LoadBalancer,并设置 externalTrafficPolicy=Local
  2. 客户端向服务A发送UDP数据包,服务A通过用户空间的代码将其传输给服务B,服务B的pod需要直接向客户端发送响应数据包。
  3. serviceA的一个pod(podA)和serviceB的一个pod(podB)可以安排在同一个host上。
  4. 为了做到这一点,我在 podB 中有一个初始容器,用于在主机中设置 SNAT 规则。SNAT 规则是:将 UDP 数据包(podB 发出的)的源 IP 从其 pod IP 更改为负载均衡器的浮动 IP。例如
iptables -t nat -D POSTROUTING -p udp -s 10.224.0.157 --sport 9999 -j SNAT --to-source 20.225.34.72:9999 
  1. 如果 podA 和 podB 位于同一主机,则数据包被丢弃,否则将数据包发送出去。

主机中的 iptables 规则(执行 iptables-save)

nettrace工具的跟踪结果

在 Azure 和本地 K8s 中尝试过,结果相同。如果 podA 和 podB 位于同一主机中,则数据包会被丢弃。我希望数据包发送到客户端的方式就像它们由位于单独主机中的 podB 发送一样。

相关内容