在亚马逊 EKS 中使用公网 NAT网关让集群流量共用一个出口IP
准备条件
- AWS EKS Kubernetes 1.30+
改造背景
在一个三个节点的 EKS K8S 集群,每个 node 有自己的公网 IP
名称 | 公网IP |
---|---|
eks-node1 | 11.11.11.11 |
eks-node2 | 22.22.22.22 |
eks-node3 | 33.33.33.33 |
业务 Pod 会根据默认的调度算法,随机落在任何一台 node 上。
当落在 eks-node1 上,主动出口流量就会以 eks-node1 的公网 IP 出去:
当 Pod 落在 eks-node3 上,出口 IP 就变成 33.33.33.33
那么当增加一个 node4 节点时,那么 Pod 的出口 IP 又会发生变化。
在实际的生产场景中,很多支付、第三方接口需要对固定IP开放白名单,是不允许频繁的变换出口IP的。
为了解决这个问题,需要引入 公网NAT 网关,优点有:
- eks 中的所有出口流量将通过 NAT网关的弹性EIP出去,解决了固定 IP的问题
- 回收 node 的公网IP,所有 k8s 节点将不再暴露再互联网,极大的增加了安全性。
AWS NAT网关
NAT 网关是一种网络地址转换 (NATI) 服务。您可以使用 NAT 网关,以便私有子网中的实例可以连接到 VPC 外部的服务,但外部服务无法启动与这些实例的连接。
我们的场景是要访问互联网,要选择创建 公网NAT 网关。
- 多个可用区可以共享一个 NAT 网关来节约使用成本(推荐)
- 也可以为提高故障恢复能力,在每一个可用区创建一个NAT网关
- NAT 网关支持以下协议:TCP、UDP 和 ICMP
- NAT网关分为公网NAT网关和私网NAT网关,当有要访问互联网需求要选择 “公网NAT网关”
- 您不能将安全组与 NAT 网关关联。您可以将安全组与实例相关联,以控制入站和出站流量。
更多关于 AWS NAT网关知识请参考 NAT 网关基础知识
创建NAT网关
创建一个公有 NAT网关,选择一个 子网。弹性IP可以不设置,公有NAT 网关会自动分配一个弹性IP地址。
得到 NAT网关的弹性IP地址:54.238.158.212
为 EKS node 部署 NAT网关访问互联网
集群信息
EKS 集群有三个 node 节点,分别位于三个可用区,每个 EC2 节点默认都分配了公网IP地址:
3个子网都绑定了同一个默认的路由表:
先改造D可用区的 eks 节点:
为子网 D区子网 ap-northeast-1d 创建 D区的路由表 rtb-ap-northeast-1d ,配置绑定 NAT网关为默认路由:
用D区的路由表显示地绑定 D区的的子网:
绑定完成后立即生效,登录 D区的 eks-node3 节点,使用命令即可看到出口IP变成了 NAT的弹性IP,路由成功!
$ curl ifconfig.me
54.238.158.212
回收节点公网 IP地址
找到 eks-node3 节点的主网卡管理,选择管理 IP地址:
取消勾选 “自动分配公网IP”
重复以上步骤
对其他节点重复以上步骤,最终实现了 eks K8S 集群所有节点、Pod 共一个 公网NAT出口,同时又回收了所有节点的公网IP,极大的提高了集群的安全性。
在业务上,支付、第三方等需要白名单权限的,也只要对外统一的提供 NAT弹性IP 一个地址出去,在管理上也提供了极大的便捷。