# Kubernetes 同节点 Pod 无法通过 Service 访问

随笔 1 / 8
阅读约需 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 )不一致,直接把包丢弃了。


参考:Kubernetes 同一个 Node 节点内的 Pod 不能通过 Service 互访

下一篇: Kubernetes 基础
写下此篇时暂时不是懒狗的星语

这是开发的责任感和前瞻性的问题。不兼容的改变不应该轻易被加入到有许多依赖代码的软件中。升级所付出的代价可能是巨大的。
—— 《语义化版本》


随笔 系列