

 **帮助改进此页面** 

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

# 选择最优的 Amazon EC2 节点实例类型
<a name="choosing-instance-type"></a>

Amazon EC2 提供 Worker 节点的各种不同的实例类型。每种实例类型提供不同的计算、内存、存储和网络功能。每个实例也按照这些功能分组到实例系列。有关列表，请参阅《Amazon EC2 用户指南》**中的[可用实例类型](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#AvailableInstanceTypes)。Amazon EKS 发布了多种 Amazon EC2 AMI 的变体以启用支持。要确保您选择的实例类型与 Amazon EKS 兼容，请考虑以下标准。
+ 所有 Amazon EKS AMI 当前均不支持 `mac` 系列。
+ Arm 和非加速 Amazon EKS AMI 不支持 `g3`、`g4`、`inf` 和 `p` 系列。
+ 加速 Amazon EKS AMI 不支持 `a`、`c`、`hpc`、`m` 和 `t` 系列。
+ 对于基于 Arm 的实例，Amazon Linux 2023（AL2023）仅支持使用 Graviton2 或更高版本处理器的实例类型。AL2023 不支持 `A1` 实例。

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

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

 **操作系统**   
查看 [Linux](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)、[Windows](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/instance-types.html) 和 [Bottlerocket](https://aws.amazon.com/bottlerocket/faqs/) 支持的实例类型。创建 Windows 实例之前，请查看[在 EKS 集群上部署 Windows 节点](windows-support.md)。

 **硬件架构**   
您需要 x86 还是 Arm？ 部署 Arm 实例之前，请查看 [Amazon EKS 优化版 Arm Amazon Linux AMI](eks-optimized-ami.md#arm-ami)。您需要基于 Nitro System（[Linux](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances) 或 [Windows](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/instance-types.html#ec2-nitro-instances)）构建的实例或是拥有[加速](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/accelerated-computing-instances.html)功能的实例吗？ 如果您需要加速功能，则只能将 Linux 与 Amazon EKS 结合使用。

 **最大容器组（pod）数量**   
由于每个容器组（pod）都分配到了自己的 IP 地址，因此实例类型支持的 IP 地址数量是决定可以在实例上运行的容器组（pod）数量的因素之一。要手动确定实例类型支持多少个容器组（pod），请参阅。  
 [AWS Nitro System](https://aws.amazon.com/ec2/nitro/) 实例类型可选择性地支持比非 Nitro System 实例类型多得多的 IP 地址。但是，并非为实例分配的所有 IP 地址都可用于容器组（pod）。要为您的实例分配大量的 IP 地址，您必须在集群中安装 `1.9.0` 版或更高版本的 Amazon VPC CNI 附加组件并进行适当配置。有关更多信息，请参阅 [为带前缀的 Amazon EKS 节点分配更多 IP 地址](cni-increase-ip-addresses.md)。要为实例分配最大数量的 IP 地址，您必须在集群中安装 `1.10.1` 版或更高版本的 Amazon VPC CNI 附加组件，然后使用 `IPv6` 系列部署集群。

 **IP 系列**   
您可以在将 `IPv4` 系列用于集群时使用任何受支持的实例类型，以便集群将私有 `IPv4` 地址分配到容器组（pod）和服务。但是，如果您想将 `IPv6` 系列用于集群，则您必须使用 [AWS Nitro System](https://aws.amazon.com/ec2/nitro/) 实例类型或裸机实例类型。Windows 实例仅支持 `IPv4`。您的集群必须运行 `1.10.1` 版或更高版本的 Amazon VPC CNI 附加组件。有关使用 `IPv6` 的更多信息，请参阅[了解如何将 IPv6 地址分配给集群、容器组（pod）和服务](cni-ipv6.md)。

 **您正在运行的 Amazon VPC CNI 附加组件的版本**   
适用于 Kubernetes 的最新版本的 [Amazon VPC CNI 插件](https://github.com/aws/amazon-vpc-cni-k8s)支持[这些实例类型](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/pkg/vpc/vpc_ip_resource_limit.go)。您可能需要更新 Amazon VPC CNI 附加组件版本来利用最新的受支持的实例类型。有关更多信息，请参阅 [使用 Amazon VPC CNI 将 IP 分配给容器组（pod）](managing-vpc-cni.md)。最新版本支持与 Amazon EKS 一起使用的最新功能。以前版本并不支持所有功能。您可以在 GitHub 上的 [Changelog](https://github.com/aws/amazon-vpc-cni-k8s/blob/master/CHANGELOG.md) 中查看不同版本支持的功能。

 **您在其中创建节点的 AWS 区域**   
并非所有实例类型在所有 AWS 区域中都可用。

 **是否将安全组用于容器组（pod）**   
如果将安全组用于容器组（pod），则仅支持特定的实例类型。有关更多信息，请参阅 [将安全组分配给各个容器组（pod）](security-groups-for-pods.md)。

## 如何确定 maxPods
<a name="max-pods-precedence"></a>

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

 **优先顺序（从高到低）：**

1.  **托管节点组强制执行**：当您使用没有[自定义 AMI](launch-templates.md#launch-template-custom-ami) 的托管节点组时，Amazon EKS 会对节点的用户数据中的 `maxPods` 施加限制。对于 vCPU 少于 30 个的实例，上限为 `110`。对于 vCPU 多于 30 个的实例，上限为 `250`。此值优先于任何其他 `maxPods` 配置，包括 `maxPodsExpression`。

1.  **kubelet `maxPods` 配置**：如果您直接在 kubelet 配置中设置 `maxPods`（例如，通过带有自定义 AMI 的启动模板），则该值优先于 `maxPodsExpression`。

1.  **nodeadm `maxPodsExpression`**：如果您在 `NodeConfig` 中使用 [https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/examples/#defining-a-max-pods-expression](https://awslabs.github.io/amazon-eks-ami/nodeadm/doc/examples/#defining-a-max-pods-expression)，nodeadm 会评估计算 `maxPods` 的表达式。只有当该值尚未由优先级较高的源设置时，这才会有效。

1.  **基于 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`。有关更多信息，请参阅 [使用启动模板自定义托管式节点](launch-templates.md)。

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

对于托管节点组（不包含自定义 AMI），Amazon EKS 会将 `maxPods` 值注入到节点的引导用户数据中。这意味着：
+ `maxPods` 值的上限始终为 `110` 或 `250`，具体取决于实例大小。
+ 您配置的任何 `maxPodsExpression` 都会被此注入值所覆盖。
+ 要使用不同的 `maxPods` 值，请在启动模板中指定自定义 AMI，然后将 `--use-max-pods false` 与 `--kubelet-extra-args '--max-pods=my-value'` 一起传递到 `bootstrap.sh` 脚本。有关示例，请参阅 [使用启动模板自定义托管式节点](launch-templates.md)。

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

## EKS 自动模式注意事项
<a name="_considerations_for_eks_auto_mode"></a>

EKS 自动模式会将节点上的容器组（pod）数量限制为以下两项中较小的一个：
+ 110 个容器组硬上限
+ 上述最大容器组数量的计算结果。