适用于 Pods 的 SNAT - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

适用于 Pods 的 SNAT

如果您使用 IPv6 系列部署集群,那么本主题中的信息不适用于您的集群,因为 IPv6 地址未进行网络转换。有关集群使用 IPv6 的详细信息,请参阅 教程:将 IPv6 地址分配给 Pods 和 services

默认情况下,您的集群中的每个 Pod 都从无类别域间路由(CIDR)块中分配到一个私有 IPv4 地址,该块与 Pod 部署在其中的 VPC 关联。相同 VPC 中的 Pods 使用这些私有 IP 地址作为端点来相互通信。当 Pod 与不在与您的 VPC 关联的 CIDR 块内的任何 IPv4 地址通信时,Amazon VPC CNI 插件(适用于 LinuxWindows)会将 Pod's IPv4 地址转换为 Pod 运行所在的节点的主弹性网络接口的主私有 IPv4 地址,默认为 *

注意

对于 Windows 节点,还有其他详细信息需要考虑。默认情况下,适用于 Windows 的 VPC CNI 插件使用网络配置进行定义,该配置下 SNAT 不包括同一 VPC 内向目标发送的流量。这意味着内部 VPC 通信已禁用 SNAT,分配给 Pod 的 IP 地址可在 VPC 内路由。但是向 VPC 以外目标发送的流量会将源 Pod IP 经 SNAT 处理到实例 ENI 的主 IP 地址。适用于 Windows 的此默认配置可确保容器组(pod)能像主机实例一样访问您的 VPC 之外的网络。

由于此行为:

  • 只有当运行互联网资源的节点分配了公共弹性 IP 地址并且位于公共子网中时,您的 Pods 才能与互联网资源通信。公有子网的关联路由表具有指向互联网网关的路由。我们建议尽可能将节点部署到私有子网。

  • 对于 1.8.0 之前的插件版本,如果网络或 VPC 中的资源使用 VPC 对等中转 VPCAmazon Direct Connect 连接到您的集群 VPC,则无法在辅助弹性网络接口后启动与 Pods 的通信。但是您的 Pods 可以启动与这些资源的通信并接收它们的响应。

如果以下任一陈述在您的环境中成立,则使用以下命令更改默认配置。

  • 您在网络或 VPC 中有资源使用 VPC 对等中转 VPCAmazon Direct Connect 连接到您的集群 VPC,它们需要使用 IPv4 地址启动与 Pods 的通信,并且您的插件版本早于 1.8.0

  • 您的 Pods 位于私有子网中,需要向互联网进行出站通信。子网具有通往 NAT 网关的路由。

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

AWS_VPC_K8S_CNI_EXTERNALSNATAWS_VPC_K8S_CNI_EXCLUDE_SNAT_CIDRS CNI 配置变量不适用于 Windows 节点。Windows 不支持禁用 SNAT。至于从 SNAT 中排除 IPv4 CIDR 列表,您可以通过在 Windows 引导脚本中指定 ExcludedSnatCIDRs 参数来定义。有关使用该参数的更多信息,请参阅 引导脚本配置参数

*如果 Pod's 规范包含 hostNetwork=true(默认值为 false),那么它的 IP 地址不会转换为其他地址。对于在您的集群上运行的 kube-proxy 和 Amazon VPC CNI plugin for Kubernetes Pods,默认情况便是如此。对于这些 Pods,IP 地址与节点的主 IP 地址相同,因此 Pod's IP 地址未转换。有关的 Pod's hostNetwork 设置的更多信息,请参阅 Kubernetes API 参考中的 PodSpec v1 核心