集群 VPC 注意事项 - Amazon EKS

集群 VPC 注意事项

Amazon EKS 建议使用同时带有公有子网和私有子网的 VPC,以便 Kubernetes 可以在公有子网中创建公有负载均衡器,进而将流量负载平衡到在私有子网中的节点上运行的 Pod。但此配置并不是必需配置。您可以在仅具有私有子网或仅公有子网的 VPC 中运行集群,具体取决于您的联网和安全要求。有关部署到仅具有私有子网的 VPC 的集群的更多信息,请参阅 私有集群

创建 Amazon EKS 集群时,您可以指定 Amazon EKS 可以放置弹性网络接口的 VPC 子网。Amazon EKS 要求至少两个可用区中的子网,并跨这些子网创建多达四个网络接口,以便于控制层面与节点通信。此通信渠道支持 kubectl execkubectl logs 等 Kubernetes 功能。Amazon EKS 创建集群安全组,并且您在创建集群时指定的任何附加安全组将应用到这些网络接口。各个 Amazon EKS 创建的网络接口的描述中都有 Amazon EKS <cluster name>

请确保您在集群创建期间指定的子网对于 Amazon EKS 创建的网络接口具有足够可用的 IP 地址。我们建议为 Amazon EKS 创建的网络接口创建小型 (/28) 专用子网,并且仅将这些子网指定为集群创建的一部分。其他资源(如节点和负载均衡器)应在不同于集群创建期间指定的子网的子网中启动。

重要
  • 节点和负载均衡器可以在集群 VPC 的任意子网中启动,包括在集群创建期间未向 Amazon EKS 注册的子网。子网不需要节点的任何标签。要使 Kubernetes 负载均衡自动发现功能工作,必须按照 为子网添加标签 中的说明对子网进行标记。

  • 创建集群后,便无法更改与集群关联的子网。如果您需要准确控制将 Amazon EKS 创建的网络接口放置在哪些子网中,您可以在集群创建期间仅指定两个子网,每个子网位于不同的可用区域中。

  • 一个已知的问题是,对于在来自于首次创建集群后添加到 VPC 的其他 CIDR 块的子网中启动的节点,Amazon EKS 无法与它们通信。如果您遇到此问题,请提交支持工单,以便 Amazon EKS 可以手动更新您的集群,以识别添加到 VPC 的其他 CIDR 块。

  • 创建集群时,请勿选择 AWS Outposts、AWS Wavelength 或AWS本地区域中的子网。

  • 使用 v1.14 或更早版本创建的集群包含您 VPC 上的“kubernetes.io/cluster/<cluster-name>”标签。此标签仅由 Amazon EKS 使用,可以安全地删除。

您的 VPC 必须具有 DNS 主机名和 DNS 解析支持,否则您的节点无法向集群注册。有关更多信息,请参阅 Amazon VPC 用户指南中的在您的 VPC 中使用 DNS

VPC IP 寻址

节点必须能够与控制层面和其他AWS服务通信。如果节点部署在私有子网中,则子网必须满足以下要求之一:

  • 有一个到 NAT 网关的默认路由。必须向 NAT 网关分配一个公有 IP 地址,以便为节点提供 Internet 访问。

  • 配置了 私有集群 中的必要设置和要求。

如果自行管理的节点部署到公有子网,则必须将子网配置为自动分配公有 IP 地址。否则,必须在启动节点实例时向它们分配一个公有 IP 地址。有关更多信息,请参阅 Amazon VPC 用户指南中的在实例启动期间分配公有 IPv4 地址。如果托管的节点部署到公有子网,则必须将子网配置为自动分配公有 IP 地址。如果子网未配置为自动分配公有 IP 地址,则不会向节点分配公有 IP 地址。使用以下命令确定您的公有子网是否配置为自动分配公有 IP 地址。将 <example values>(包括 <>)替换为您自己的值。

aws ec2 describe-subnets \ --filters "Name=vpc-id,Values=<VPC-ID>" | grep 'SubnetId\|MapPublicIpOnLaunch'

输出

"MapPublicIpOnLaunch": <false>,"SubnetId": "<subnet-aaaaaaaaaaaaaaaaa>","MapPublicIpOnLaunch": <false>,"SubnetId": "<subnet-bbbbbbbbbbbbbbbbb>",

对于已将 MapPublicIpOnLaunch 设置为 false 的任何子网 ,请将设置更改为 true

aws ec2 modify-subnet-attribute --map-public-ip-on-launch --subnet-id <subnet-aaaaaaaaaaaaaaaaa>
重要

如果您在 2020 年 3 月 26 日之前使用 Amazon EKSAWS AWS CloudFormation 模板部署您的 VPC,则需要更改您的公有子网的设置。

您可以在用于 Amazon EKS 集群的 VPC 内定义私有 (RFC 1918) 和公有(非 RFC 1918)无类域间路由 (CIDR) 范围。有关更多信息,请参阅 Amazon VPC 用户指南中的向 VPC 中添加 IPv4 CIDR 块。为 VPC 和子网选择 CIDR 块时,请确保这些块包含足够的 IP 地址以用于您计划部署的所有 Amazon EC2 节点和 Pod。您的每个 Pod 应至少有一个 IP 地址。您可以通过使用共享服务 VPC 实施转换网关来节省 IP 地址的使用。有关更多信息,请参阅具有共享服务的隔离 VPC混合网络中的 Amazon EKS VPC 可路由 IP 地址保护模式

为子网添加标签

对于 1.18 及更早版本的集群,Amazon EKS 会向集群创建过程中传入的所有子网添加以下标签。Amazon EKS 不会向创建 1.19 集群时传入的子网添加标签。如果在 1.19 之前版本上创建的集群所用的子网上存在有标签,而且您已将集群更新到了 1.19,则不会从子网中删除该标签。

  • 密钥kubernetes.io/cluster/<cluster-name>

  • shared

除了使用自动预置的 Elastic Load Balancer 所需的子网标签之外,您还可以选择使用此标记来控制 Elastic Load Balancer 的预置位置。有关负载均衡器子网标记的更多信息,请参阅 Amazon EKS 上的应用程序负载均衡Amazon EKS 上的网络负载均衡