外部源网络地址转换 (SNAT) - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

外部源网络地址转换 (SNAT)

VPC 内的通信(如 Pod 到 Pod)在私有 IP 地址之间是直接的,无需源网络地址转换 (SNAT)。当 IP 流量发往 VPC 外部的 IPv4 地址时,在默认情况下,适用于 Kubernetes 的 Amazon VPC CNI 插件会将每个容器的私有 IP 地址转换为分配给该容器运行所在的 Amazon EC2 节点的主弹性网络接口的主要私有 IP 地址。IPv6 流量无法进行源网络地址转换,因此本主题中的任何选项都不适用于 IPv6 流量。

弹性网络接口在 Amazon Web Services Management Console 以及 Amazon EC2 API 中被称为网络接口。因此,我们在本文档中使用“网络接口”,而不是“弹性网络接口”。本文档中的“网络接口”术语始终表示“弹性网络接口”。SNAT:

  • 使 Pod 能够与互联网进行双向通信。节点必须位于公有子网中,并且已向其主网络接口的主私有 IP 地址分配一个公有弹性 IP 地址。流量在公有或弹性 IP 地址之间进行转换,并通过互联网网关与 Internet 之间进行路由,如下图所示。

    SNAT 是必需的,因为互联网网关只能在主私有与公有或弹性 IP 地址之间进行转换(这些地址已分配给在其上运行 Pod 的 Amazon EC2 实例节点的主弹性网络接口)。

  • 阻止其他私有 IP 地址空间(例如,VPC 对等连接中转 VPCDirect Connect)中的设备直接与如下 Pod 进行通信:未向此 Pod 分配 Amazon EC2 实例节点的主网络接口的主私有 IP 地址。

如果 Internet 或其他私有 IP 地址空间中的设备需要与某个 Pod(未向此 Pod 分配主私有 IP 地址,而此地址分配给 Pod 在其上运行的 Amazon EC2 实例节点的主网络接口)进行通信,则:

  • 节点必须部署在具有通往公有子网中的 NAT 设备的路由的私有子网中。

  • 您需要使用以下命令在 CNI 插件 aws-node 守护进程集中启用外部 SNAT:

    kubectl set env daemonset -n kube-system aws-node AWS_VPC_K8S_CNI_EXTERNALSNAT=true

启用外部 SNAT 后,当流量发送的目标为 VPC 外部的地址时,CNI 插件不会将 Pod 的私有 IP 地址转换为主私有 IP 地址(此地址分配给 Pod 正在其上运行的 Amazon EC2 实例节点的主网络接口)。来自 Pod 私有 IP 地址的流量由 NAT 设备转换为 NAT 设备的公有 IP 地址,并通过 Internet 网关路由在 Internet 之间路由,如下图所示。