集群 VPC 和子网注意事项 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

集群 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 地址。如果您要部署使用 IPv4 系列的集群,我们建议为 Amazon EKS 创建的网络接口创建小型 (/28) 专用子网,并且仅将这些子网指定为集群创建的一部分。其他资源(如节点和负载均衡器)应在不同于集群创建期间指定的子网的子网中启动。

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

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

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

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

  • 向现有集群添加 CIDR 块而导致的更新范围可能需要五个小时才能显示。

  • 如果想要 Kubernetes 将 IPv6 地址分配给容器和服务,则必须将 IPv4 和 IPv6 CIDR 块分配给您的 VPC 和子网。有关更多信息,请参阅 Amazon VPC 用户指南中的关联 IPv6 CIDR 块与 VPC。您的路由表和安全组还必须包含 IPv6 地址。有关更多信息,请参阅 Amazon VPC 用户指南中的迁移到 IPv6

  • 节点必须能够与控制层面和其他Amazon服务通信。如果节点部署在私有子网中,并且您想要容器拥有 Internet 的出站访问权限,则私有子网必须满足以下要求之一:

    • 只有 IPv4 CIDR 块的子网必须具有指向 NAT 网关的默认路由。必须向 NAT 网关分配一个公有 IPv4 地址,以便为节点提供 Internet 访问。

      具有 IPv6 CIDR 块的子网必须具有指向仅出口互联网网关的默认路由。

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

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

VPC IP 寻址

如果想要部署到公有子网中节点的容器拥有出站 Internet 访问权限,则您的公有子网必须配置为自动分配公有 IPv4 地址或 IPv6 地址。使用以下命令确定您的公有子网配置为自动分配公有 IPv4 地址还是 IPv6 地址。将 example values 替换为您自己的值。

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

输出

IPv4
"MapPublicIpOnLaunch": true, "SubnetId": "subnet-ID1", "MapPublicIpOnLaunch": false, "SubnetId": "subnet-ID2", ...
IPv6
"SubnetId": "subnet-ID1", "AssignIpv6AddressOnCreation": true, "SubnetId": "subnet-ID2", "AssignIpv6AddressOnCreation": false, ...

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

IPv4
aws ec2 modify-subnet-attribute --subnet-id subnet-ID2 --map-public-ip-on-launch
IPv6
aws ec2 modify-subnet-attribute --subnet-id subnet-ID2 --assign-ipv6-address-on-creation
重要

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

您可以在用于 Amazon EKS 集群的 VPC 内定义私有 (RFC 1918) 和公有(非 RFC 1918)无类域间路由 (CIDR) IPv4 范围。有关更多信息,请参阅 Amazon VPC 用户指南中的向 VPC 中添加 IPv4 CIDR 块。为 VPC 和子网选择 CIDR 块时,请确保这些块包含足够的 IPv4 地址以用于您计划部署的所有 Amazon EC2 节点和容器。您的每个 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 上的网络负载均衡

增加可用的 VPC IPv4 地址

如果您的 Amazon VPC 的 IPv4 地址不足,则可以将辅助 CIDR 与现有 VPC 关联。有关更多信息,请参阅《Amazon VPC 用户指南》中的向 VPC 中添加 IPv4 CIDR 块。有了新的关联 CIDR,您就可以使用新关联的 CIDR 的子集创建子网。创建新子网后,您可以创建其他使用新关联的 CIDR 和子网的托管或自管的节点组。