Kubernetes集群节点共享静态公网出网IP的实现方案问询
Kubernetes集群统一公网出口IP实现方案(不使用Nginx代理)
要实现集群所有出网请求使用同一个公网IP,本质是对所有出公网的流量做源地址转换(SNAT),将源IP统一替换为目标固定公网IP即可,无需使用Nginx这类七层代理,以下是三种可行的落地方式:
方案1:CNI插件原生Egress Gateway
适用于使用Calico、Cilium这类主流CNI插件的集群,是K8s生态原生的实现方式:
- 提前预留一个固定公网IP,绑定到你指定作为出口的集群节点上
- 以Calico为例操作:
- 为现有集群开启Egress API支持,启用对应的CRD资源
- 配置
EgressGateway资源,指定出口节点以及绑定的固定公网IP - 配置
EgressPolicy资源,匹配需要走统一出口的Pod、Namespace范围,规则生效后所有匹配的流量都会从指定出口节点的公网IP发出
- 优势:通过K8s原生资源管理,性能损耗低,可按工作负载粒度灵活控制出口规则
方案2:公有云VPC NAT网关
适用于部署在阿里云、AWS、腾讯云等公有云的托管K8s集群,是成本最低、运维量最小的方案:
- 购买公网NAT网关,绑定一个固定的弹性公网IP(EIP)
- 配置VPC路由表,将K8s集群所有节点所在子网的出公网流量下一跳指向NAT网关
- 配置SNAT规则,指定整个K8s子网段的流量都通过NAT网关绑定的EIP做源地址转换
- 优势:完全不需要修改集群内部配置,云厂商托管的网关可用性高,无需自行维护组件
方案3:自建SNAT出口节点
适用于私有部署、无公有云服务的离线集群场景:
- 选择集群中一个节点作为专用出口节点,绑定固定公网IP,开启内核IP转发功能:
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf && sysctl -p - 在出口节点配置iptables SNAT规则:
iptables -t nat -A POSTROUTING -s <K8s集群Pod子网/节点子网段> -j SNAT --to-source <出口节点固定公网IP>,如果公网IP为动态获取可替换为MASQUERADE规则 - 在另外两个非出口节点配置静态路由,将所有公网目的地的流量下一跳指向出口节点的内网IP
- 可搭配kube-route、OSPF等路由协议实现出口节点高可用,避免单点故障
- 优势:无额外组件依赖,完全可控,适配离线私有部署要求
注意事项
- 如果仅需要访问特定服务商API的流量走统一出口,可在规则配置时仅匹配该服务商的公网IP段,无需全局生效,减少不必要的流量转发损耗
- 所有方案建议配置高可用策略,避免单点故障导致集群出网中断
内容的提问来源于stack exchange,提问作者Antonio González
相关产品推荐
相关产品推荐

