选择最优的 Amazon EC2 节点实例类型 - Amazon EKS

帮助改进此页面

要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。

选择最优的 Amazon EC2 节点实例类型

Amazon EC2 提供 Worker 节点的各种不同的实例类型。每种实例类型提供不同的计算、内存、存储和网络功能。每个实例也按照这些功能分组到实例系列。有关列表,请参阅《Amazon EC2 用户指南》中的可用实例类型。Amazon EKS 发布了多种 Amazon EC2 AMI 的变体以启用支持。要确保您选择的实例类型与 Amazon EKS 兼容,请考虑以下标准。

  • 所有 Amazon EKS AMI 当前均不支持 mac 系列。

  • Arm 和非加速 Amazon EKS AMI 不支持 g3g4infp 系列。

  • 加速 Amazon EKS AMI 不支持 achpcmt 系列。

  • 对于基于 Arm 的实例,Amazon Linux 2023(AL2023)仅支持使用 Graviton2 或更高版本处理器的实例类型。AL2023 不支持 A1 实例。

在选择 Amazon EKS 支持的实例类型时,请考虑每种类型的以下功能。

节点组中的实例数

一般来说,数量较少、规模较大的实例更好,当您有很多 Daemonset 时更是如此。每个实例都需要对 API 服务器进行 API 调用,因此您拥有的实例越多,API 服务器上的负载就越多。

操作系统

查看 LinuxWindowsBottlerocket 支持的实例类型。创建 Windows 实例之前,请查看在 EKS 集群上部署 Windows 节点

硬件架构

您需要 x86 还是 Arm? 部署 Arm 实例之前,请查看 Amazon EKS 优化版 Arm Amazon Linux AMI。您需要基于 Nitro System(LinuxWindows)构建的实例或是拥有加速功能的实例吗? 如果您需要加速功能,则只能将 Linux 与 Amazon EKS 结合使用。

最大容器组(pod)数量

由于每个容器组(pod)都分配到了自己的 IP 地址,因此实例类型支持的 IP 地址数量是决定可以在实例上运行的容器组(pod)数量的因素之一。要手动确定实例类型支持多少个容器组(pod),请参阅

AWS Nitro System 实例类型可选择性地支持比非 Nitro System 实例类型多得多的 IP 地址。但是,并非为实例分配的所有 IP 地址都可用于容器组(pod)。要为您的实例分配大量的 IP 地址,您必须在集群中安装 1.9.0 版或更高版本的 Amazon VPC CNI 附加组件并进行适当配置。有关更多信息,请参阅 为带前缀的 Amazon EKS 节点分配更多 IP 地址。要为实例分配最大数量的 IP 地址,您必须在集群中安装 1.10.1 版或更高版本的 Amazon VPC CNI 附加组件,然后使用 IPv6 系列部署集群。

IP 系列

您可以在将 IPv4 系列用于集群时使用任何受支持的实例类型,以便集群将私有 IPv4 地址分配到容器组(pod)和服务。但是,如果您想将 IPv6 系列用于集群,则您必须使用 AWS Nitro System 实例类型或裸机实例类型。Windows 实例仅支持 IPv4。您的集群必须运行 1.10.1 版或更高版本的 Amazon VPC CNI 附加组件。有关使用 IPv6 的更多信息,请参阅了解如何将 IPv6 地址分配给集群、容器组(pod)和服务

您正在运行的 Amazon VPC CNI 附加组件的版本

适用于 Kubernetes 的最新版本的 Amazon VPC CNI 插件支持这些实例类型。您可能需要更新 Amazon VPC CNI 附加组件版本来利用最新的受支持的实例类型。有关更多信息,请参阅 使用 Amazon VPC CNI 将 IP 分配给容器组(pod)。最新版本支持与 Amazon EKS 一起使用的最新功能。以前版本并不支持所有功能。您可以在 GitHub 上的 Changelog 中查看不同版本支持的功能。

您在其中创建节点的 AWS 区域

并非所有实例类型在所有 AWS 区域中都可用。

是否将安全组用于容器组(pod)

如果将安全组用于容器组(pod),则仅支持特定的实例类型。有关更多信息,请参阅 将安全组分配给各个容器组(pod)

如何确定 maxPods

应用于节点的最终 maxPods 值取决于几个按照特定的优先级顺序进行交互的组件。了解此顺序有助于您在自定义 maxPods 时避免出现意外情况。

优先顺序(从高到低):

  1. 托管节点组强制执行:当您使用没有自定义 AMI 的托管节点组时,Amazon EKS 会对节点的用户数据中的 maxPods 施加限制。对于 vCPU 少于 30 个的实例,上限为 110。对于 vCPU 多于 30 个的实例,上限为 250。此值优先于任何其他 maxPods 配置,包括 maxPodsExpression

  2. kubelet maxPods 配置:如果您直接在 kubelet 配置中设置 maxPods(例如,通过带有自定义 AMI 的启动模板),则该值优先于 maxPodsExpression

  3. nodeadm maxPodsExpression:如果您在 NodeConfig 中使用 maxPodsExpression,nodeadm 会评估计算 maxPods 的表达式。只有当该值尚未由优先级较高的源设置时,这才会有效。

  4. 基于 ENI 的默认计算:如果未设置其他值,则 AMI 将根据实例类型支持的弹性网络接口和 IP 地址的数量计算 maxPods。这等同于公式 (number of ENIs × (IPs per ENI − 1)) + 2+ 2 将每个节点上运行的 Amazon VPC CNI 和 kube-proxy 考虑在内,这些组件不会消耗容器组(Pod)IP 地址。

重要

如果您使用托管节点组并在 NodeConfig 中设置 maxPodsExpression,则托管节点组的强制执行会覆盖您的表达式。要将自定义的 maxPods 值用于托管节点组,您必须在启动模板中指定自定义 AMI 并直接设置 maxPods。有关更多信息,请参阅 使用启动模板自定义托管式节点

托管节点组与自主管理节点

对于托管节点组(不包含自定义 AMI),Amazon EKS 会将 maxPods 值注入到节点的引导用户数据中。这意味着:

  • maxPods 值的上限始终为 110250,具体取决于实例大小。

  • 您配置的任何 maxPodsExpression 都会被此注入值所覆盖。

  • 要使用不同的 maxPods 值,请在启动模板中指定自定义 AMI,然后将 --use-max-pods false--kubelet-extra-args '--max-pods=my-value' 一起传递到 bootstrap.sh 脚本。有关示例,请参阅 使用启动模板自定义托管式节点

使用自主管理的节点,您将能够完全控制引导过程。您可以在 NodeConfig 中使用 maxPodsExpression,或将 --max-pods 直接传递给 bootstrap.sh

EKS 自动模式注意事项

EKS 自动模式会将节点上的容器组(pod)数量限制为以下两项中较小的一个:

  • 110 个容器组硬上限

  • 上述最大容器组数量的计算结果。