我之前是这样做的,TCP UDP 都可以让 POD 内的东西无感获取到真实的源 IP ,但是有点破坏原生的 K8S Service 结构。
你的需求和我的原始需求有点区别,正常情况下网络插件是可以将 IP 透传到 POD 中的啊,iptables DNAT 转发不改变源 IP 。
我说下我的做法吧,最开始我是用 NodePort 暴露服务的,这种情况下只能改成宿主机网络的 Gateway 了。
我写了一个部署在 Host Network 模式的 Gateway ,暴露宿主机端口并且绑定到一个 POD Service 地址。
将每个连接代理的时候添加 PROXY Protocol Header 添加源 IP 的信息。
然后将 POD 中注入一个 Sidecar 做透明代理和流量卸载,借鉴下面这个项目。
https://github.com/path-network/go-mmproxy这样 POD 的 Sidecar 拦截流量,并且解析 Proxy Protocol Header 知道原始 IP 地址,并且使用 IP Transparent 方式和策略路由拦截 localhost 流量组合的方式欺骗 POD 服务,将真正地址透传给他,并且拦截回包改写为真正地址。
这个有点类似于 istio 的透明代理的实现。
另外我的需求和你不太一样,我是要支持宿主机的策略路由,不得已必须使用宿主机网络监听,从而不得已解决这个源 IP 透传问题。 在我使用宿主机网络之前,我直接使用 K8S 的网络 POD 都是可以获取真实源 IP 的啊,你要不先调下 Service 的选项试试