Amazon EKS VPC 和子网要求和注意事项 - Amazon EKS

Amazon EKS VPC 和子网要求和注意事项

在创建集群时,您将指定 VPC 以及位于不同可用区中的至少两个子网。本主题概述了 Amazon EKS 对于您用于集群的 VPC 和子网的特定要求和注意事项。如果您没有与 Amazon EKS 结合使用的 VPC,则可以使用 Amazon EKS 提供的 AWS CloudFormation 模板创建一个。如果您要在 AWS Outposts 上创建本地或扩展集群,请参阅 Amazon EKS 本地集群 VPC 及子网的要求和注意事项 而不是本主题。

VPC 要求和注意事项

在创建集群时,您指定的 VPC 必须满足以下要求和注意事项:

  • VPC 必须有足够数量的 IP 地址来供集群、任何节点和您想要创建的其他 Kubernetes 资源使用。如果要使用的 VPC 没有足够数量的 IP 地址,请尝试增加可用 IP 地址的数量。

    为此,您可以更新集群以更改该集群使用的子网和安全组。您可以从 AWS Management Console、AWS CLI 的最新版本、AWS CloudFormation 以及 eksctl 版本 v0.164.0-rc.0 或更高版本进行更新。您可能需要执行此操作,为子网提供更多可用 IP 地址,以便成功升级集群版本。

    重要

    您添加的所有子网均必须位于与创建集群时最初提供的相同一组可用区中。新子网必须满足所有其他要求,例如,它们必须有足够的 IP 地址。

    例如,假设您创建一个集群并指定四个子网。按照您指定的顺序,第一个子网位于 us-west-2a 可用区中,第二个和第三个子网位于 us-west-2b 可用区中,第四个子网位于 us-west-2c 可用区中。如果要更改子网,则必须在三个可用区中各提供至少一个子网,并且这些子网必须与原始子网位于同一个 VPC 中。

    如果您需要的 IP 地址多于 VPC 中的 CIDR 块,则可以通过将其他无类别域间路由(CIDR)块与您的 VPC 关联来添加其他 CIDR 块。您可以在创建集群之前或之后将私有(RFC 1918)和公有(非 RFC 1918)CIDR 块与您的 VPC 关联。集群识别与 VPC 关联的 CIDR 块最多可能需要五个小时的时间。

    您可以通过将中转网关与共享服务 VPC 结合使用来节省 IP 地址的使用。有关更多信息,请参阅具有共享服务的隔离 VPC混合网络中的 Amazon EKS VPC 可路由 IP 地址保护模式

  • 如果您想让 Kubernetes 分配 IPv6 地址给 Pods 和服务,请将 IPv6 CIDR 块与您的 VPC 关联。有关更多信息,请参阅《Amazon VPC 用户指南》中的IPv6 CIDR 块与您的 VPC 关联

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

  • VPC 可能需要使用 AWS PrivateLink 的 VPC 节点。有关更多信息,请参阅 子网要求和注意事项

如果您使用 Kubernetes 1.14 或更早版本创建集群,Amazon EKS 会将以下标签添加到您的 VPC 中:

kubernetes.io/cluster/my-cluster owned

此标签仅由 Amazon EKS 使用。您可以在不影响服务的情况下删除标签。它不适用于版本 1.15 或更高版本的集群。

子网要求和注意事项

在创建集群时,Amazon EKS 将在您指定的子网中创建 2–4 个弹性网络接口。这些网络接口可实现集群和 VPC 之间的通信。这些网络接口还支持 Kubernetes 功能,例如 kubectl execkubectl logs。每个 Amazon EKS 创建的网络接口的描述中都有 Amazon EKS cluster-name 文本。

当您创建集群时,Amazon EKS 可以在您指定的任何子网中创建其网络接口。创建集群后,您可以更改 Amazon EKS 在哪些子网中创建其网络接口。当您更新集群的 Kubernetes 版本时,Amazon EKS 会删除其创建的原始网络接口,然后创建新的网络接口。这些网络接口可以在与原始网络接口相同的子网中创建,也可以在与原始网络接口不同的子网中创建。要控制在哪些子网中创建网络接口,可以在创建集群时将指定的子网数限制为只有两个子网,或者在创建集群后更新子网。

集群的子网要求

您在创建或更新集群时指定的子网必须满足以下要求:

  • 每个子网必须至少有六个 IP 地址以供 Amazon EKS 使用。但是,我们建议至少使用 16 个 IP 地址。

  • 子网不能驻留在 AWS Outposts、AWS Wavelength 或 AWS 本地区域中。但是,如果您的 VPC 中有这些子网,则可以向这些类型的子网部署自行管理的节点和 Kubernetes 资源。

  • 子网可以是公有子网或私有子网。但是,如果可能,我们建议您指定私有子网。公有子网是指包含路由表的子网,这个路由表中包含指向互联网网关的路由,而私有子网是指具有一个其中不包含指向互联网网关的路由的路由表的子网。

  • 子网不能位于以下可用区中:

    AWS 区域 区域名称 不允许使用的可用区 ID
    us-east-1 美国东部(弗吉尼亚北部) use1-az3
    us-west-1 美国西部(北加利福尼亚) usw1-az2
    ca-central-1 加拿大(中部) cac1-az3

按组件划分的 IP 地址系列使用情况

下表包含 Amazon EKS 的每个组件所使用的 IP 地址系列。您可以使用网络地址转换(NAT)或其他兼容性系统从具有表条目 "No" 值的系列中的源 IP 地址连接到这些组件。

根据集群的 IP family(ipFamily)设置,功能可能会有所不同。此设置会更改 Kubernetes 分配给 Services 的 CIDR 数据块所使用的 IP 地址类型。设置值为 IPv4 的集群被称为 IPv4 cluster,设置值为 IPv6 的集群被称为 IPv6 cluster。

组件 仅限 IPv4 地址 仅限 IPv6 地址 双堆栈地址
EKS API 公用端点 支持 不支持
EKS API VPC 端点 支持 不支持
EKS Auth API 公用端点 1 1 1
EKS Auth API VPC 端点 1 1 1
EKS 集群公用端点 支持 不支持
EKS 集群私有端点 2 2 不支持
EKS 集群子网 2 2
节点主 IP 地址 2 2
Service IP 地址的集群 CIDR 范围 2 2 不支持
来自 VPC CNI 的 Pod IP 地址 2 2 不支持
注意

1 端点是双堆栈,同时包含 IPv4IPv6 地址。AWS 外部的应用程序、集群的节点以及集群内的容器组(pod)可以通过 IPv4IPv6 到达此端点。

2 当您创建集群时,您可以在集群的 IP family(ipFamily)设置中在 IPv4 集群和 IPv6 集群之间进行选择,这是无法更改的。相反,在创建另一个集群并迁移工作负载时,您必须选择不同的设置。

节点的子网要求

您可以将节点和 Kubernetes 资源部署到您在创建集群时指定的相同子网。但是,这并不是必要的。这是因为,您还可以将节点和 Kubernetes 资源部署到您在创建集群时未指定的子网。如果您将节点部署到不同的子网,Amazon EKS 不会在这些子网中创建集群网络接口。您向其中部署节点和 Kubernetes 资源的任何子网必须满足以下要求:

  • 子网必须有足够的可用 IP 地址才能将所有节点和 Kubernetes 资源部署到其中。

  • 如果您想让 Kubernetes 分配 IPv6 地址到 Pods 和服务,您必须拥有一个 IPv6 CIDR 块和一个与您的子网相关联的 IPv4 CIDR 块。有关更多信息,请参阅《Amazon VPC 用户指南》中的IPv6 CIDR 块与您的子网关联。与子网关联的路由表必须包含到 IPv4IPv6 地址的路由。有关更多信息,请参阅《Amazon VPC 用户指南》中的路由。容器组(pod)只分配了 IPv6 地址。但是,Amazon EKS 为您的集群和您的节点创建的网络接口被分配了 IPv4IPv6 地址。

  • 如果您需要从互联网入站访问您的 Pods,请确保至少有一个公有子网具有足够的可用 IP 地址,以便将负载均衡器和入口部署到其中。您可以将负载均衡器部署到公有子网。负载均衡器可以对私有或公有子网中的 Pods 进行负载均衡。我们建议尽可能将节点部署到私有子网。

  • 如果您计划将节点部署到公有子网,则该子网必须自动分配 IPv4 公有地址IPv6 地址。如果您将节点部署到具有关联的 IPv6 CIDR 块的私有子网,则该私有子网还必须自动分配 IPv6 地址。如果您使用 Amazon EKS AWS CloudFormation 模板在 2020 年 3 月 26 日之后部署您的 VPC,此设置已启用。如果您在此日期之前使用模板部署 VPC,或者您使用自己的 VPC,则必须手动启用此设置。有关更多信息,请参阅《Amazon VPC 用户指南》中的修改您的子网的公有 IPv4 寻址属性修改您的子网的 IPv6 寻址属性

  • 如果您将节点部署到的子网是私有子网,且其路由表不包含到网络地址转换(NAT)设备IPv4)或仅限出口的网关IPv6)的路由,则添加使用 AWS PrivateLink 的 VPC 端点到您的 VPC。您的节点和 Pods 需要与之通信的所有 AWS 服务 都需要 VPC 端点。示例包括 Amazon ECR、Elastic Load Balancing、Amazon CloudWatch、AWS Security Token Service 和 Amazon Simple Storage Service(Amazon S3)。端点必须包括节点所在的子网。并非所有 AWS 服务 都支持 VPC 端点。有关更多信息,请参阅什么是 AWS PrivateLink?与 AWS PrivateLink 集成的 AWS 服务。有关更多 Amazon EKS 要求的列表,请参阅 私有集群要求

  • 如果要将负载均衡器部署到子网,则子网必须具有以下标签:

    • 私有子网

      kubernetes.io/role/internal-elb 1
    • 公有子网

      kubernetes.io/role/elb 1

当创建版本为 1.18 和更低版本的 Kubernetes 集群时,Amazon EKS 会将以下标签添加到指定的所有子网。

kubernetes.io/cluster/my-cluster shared

当您创建新 Kubernetes 集群时,Amazon EKS 不会将该标签添加到您的子网中。如果标签位于以前版本低于 1.19 的集群使用的子网上,则当该集群更新为较新版本时,不会自动从子网上移除该标签。版本 2.1.1 或更低版本的 AWS Load Balancer Controller 需要此标签。如果您使用的是较新版本的负载均衡器控制器,则可以删除该标签,而不会中断您的服务。

如果您使用 eksctl 或者任一 Amazon EKS AWS CloudFormation VPC 模板部署了 VPC,则以下情况适用:

  • 2020 年 3 月 26 日或之后 – 公有子网将公有 IPv4 地址自动分配给部署到公有子网的新节点。

  • 2020 年 3 月 26 之前 – 公有子网不会将公有 IPv4 地址自动分配给部署到公有子网的新节点。

此更改通过以下方式影响部署到公有子网的新节点组:

共享子网要求和注意事项

您可以使用 VPC 共享与同一 AWS Organizations 中的其他 AWS 账户共享子网。您可以在共享子网中创建 Amazon EKS 集群,但要注意以下几点:

  • VPC 子网的拥有者必须与参与者账户共享一个子网,该账户才能在其中创建 Amazon EKS 集群。

  • 您不能使用 VPC 的默认安全组启动资源,因为此安全组属于拥有者。此外,参与者无法使用其他参与者或拥有者拥有的安全组启动资源。

  • 在共享子网中,参与者和拥有者分别控制各自账户中的安全组。子网拥有者可以看到参与者创建的安全组,但不能对其执行任何操作。如果子网拥有者想要删除或修改安全组,则创建安全组的参与者必须执行该操作。

  • 如果集群是由参与者创建的,则要注意以下几点:

  • 共享 VPC 拥有者无法查看、更新或删除参与者在共享子网中创建的集群。这是对每个账户具有不同访问权限的 VPC 资源的补充。有关更多信息,请参阅 Amazon VPC 用户指南中的拥有者和参与者的责任和权限

  • 如果您使用 Amazon VPC CNI plugin for Kubernetes 的自定义网络功能,则需要使用拥有者账户中列出的可用区 ID 映射来创建每个 ENIConfig 可用区。有关更多信息,请参阅 容器组(pod)的自定义网络

有关 VPC 子网共享的更多信息,请参阅 Amazon VPC 用户指南中的与其他账户共享 VPC