Skip to main content

在亚马逊 EKS 中使用公网 NAT网关让集群流量共用一个出口IP

准备条件

  • AWS EKS Kubernetes 1.30+

改造背景

在一个三个节点的 EKS K8S 集群,每个 node 有自己的公网 IP

名称公网IP
eks-node111.11.11.11
eks-node222.22.22.22
eks-node333.33.33.33

业务 Pod 会根据默认的调度算法,随机落在任何一台 node 上。

当落在 eks-node1 上,主动出口流量就会以 eks-node1 的公网 IP 出去:

当 Pod 落在 eks-node3 上,出口 IP 就变成 33.33.33.33

那么当增加一个 node4 节点时,那么 Pod 的出口 IP 又会发生变化。

在实际的生产场景中,很多支付、第三方接口需要对固定IP开放白名单,是不允许频繁的变换出口IP的。

为了解决这个问题,需要引入 公网NAT 网关,优点有:

  1. eks 中的所有出口流量将通过 NAT网关的弹性EIP出去,解决了固定 IP的问题
  2. 回收 node 的公网IP,所有 k8s 节点将不再暴露再互联网,极大的增加了安全性。

AWS NAT网关

NAT 网关是一种网络地址转换 (NATI) 服务。您可以使用 NAT 网关,以便私有子网中的实例可以连接到 VPC 外部的服务,但外部服务无法启动与这些实例的连接。

我们的场景是要访问互联网,要选择创建 公网NAT 网关。

NAT网关总结
  1. 多个可用区可以共享一个 NAT 网关来节约使用成本(推荐)
  2. 也可以为提高故障恢复能力,在每一个可用区创建一个NAT网关
  3. NAT 网关支持以下协议:TCP、UDP 和 ICMP
  4. NAT网关分为公网NAT网关和私网NAT网关,当有要访问互联网需求要选择 “公网NAT网关”
  5. 您不能将安全组与 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 一个地址出去,在管理上也提供了极大的便捷。

参考文档