外部源网络地址转换 (SNAT)
VPC 内的通信(如 Pod 到 Pod)在私有 IP 地址之间是直接的,无需源网络地址转换 (SNAT)。当 IP 流量发往 VPC 外部的 IPv4 地址时,在默认情况下,适用于 Kubernetes 的 Amazon VPC CNI 插件
弹性网络接口在 Amazon Web Services Management Console 以及 Amazon EC2 API 中被称为网络接口。因此,我们在本文档中使用“网络接口”,而不是“弹性网络接口”。本文档中的“网络接口”术语始终表示“弹性网络接口”。SNAT:
-
使 Pod 能够与互联网进行双向通信。节点必须位于公有子网中,并且已向其主网络接口的主私有 IP 地址分配一个公有或弹性 IP 地址。流量在公有或弹性 IP 地址之间进行转换,并通过互联网网关与 Internet 之间进行路由,如下图所示。
SNAT 是必需的,因为互联网网关只能在主私有与公有或弹性 IP 地址之间进行转换(这些地址已分配给在其上运行 Pod 的 Amazon EC2 实例节点的主弹性网络接口)。
-
阻止其他私有 IP 地址空间(例如,VPC 对等连接、中转 VPC 或 Direct 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 之间路由,如下图所示。
