Kubernetes 同节点 Pod 无法通过 Service 访问
2025年1月15日大约 1 分钟
问题
最近在折腾 Flink on k8s 时遇到了这样一个问题,Kubernetes 集群内部的 Pod 无法通过 Service 访问到同一节点上的 Pod,而通过 Pod IP 可以正常访问,并且也可以通过 Service 和不同 Node 的 Pod 互访。在此记录一下解决方案。
解决方案
确保 kube-proxy 运行在 iptables 模式下,将 kube-proxy 的 masquerade-all
配置设置为 true
,即可解决此问题。
原因
Service 没有对访问它的流量做 SNAT ,被访问的 Pod 直接以访问者的 Pod IP 为目标 IP ,以自身的 Pod IP 为源 IP 进行回包。而由于两者是在同一个 Node 节点,处于同一个子网,走的是二层通信,没有经过网关,也不会有 NAT 转换。
而实际上访问者这个 Pod 其实是已经接收到了被访问 Pod 的回包,但因为回包的源IP+端口(PodIp:PodPort)和它发出去的请求的目标 IP+端口(ServiceIp:ServicePort)不一致,直接把包丢弃了。
参考: