适用于 pods 的 SNAT - Amazon EKS

适用于 pods 的 SNAT

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

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

由于此行为:

  • 使用 VPC 对等中转 VPCDirect Connect 连接到您的集群 VPC 的网络或 VPC 中的资源无法启动与您的 pods 的通信。但是您的 pods 可以启动与这些资源的通信并接收他们的响应。

  • 您的 pods 只有在运行它们的节点具有一个分配到它的公有弹性 IP 地址且处于公有子网时,才会与您的互联网资源双向通信。公有子网的关联路由表具有指向互联网网关的路由。私有子网的关联路由表不具有指向互联网网关的路由。我们建议尽可能将节点部署到私有子网。

如果您有以下任一要求,则需要更改适用于 Kubernetes 的 Amazon VPC CNI 插件的默认配置:

  • 您具有使用 VPC 对等中转 VPCDirect Connect 连接到您的集群 VPC 的网络或 VPC 中的资源,它们需要使用 IPv4 地址启动与您的 pods 的通信。

  • 您的节点位于私有子网中。

使用以下命令更改默认配置。

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

如果您希望 pods 在更改设置后与 Internet 通信,则与私有子网关联的路由表必须包含指向公有 NAT 网关的路由。互联网上的资源无法启动与私有子网中的 pods 的通信,除非您已将负载均衡器或入口部署到 VPC 中的公有子网。负载均衡器或入口可以将流量路由到 pods 的私有 IP 地址。有关创建网络负载均衡器和入口(应用程序负载均衡器)的详细信息,请参阅 Amazon EKS 上的网络负载均衡Amazon EKS 上的应用程序负载均衡

*如果 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 核心