

 **帮助改进此页面** 

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

# 使用托管式节点组简化节点生命周期
<a name="managed-node-groups"></a>

Amazon EKS 托管节点组为 Amazon EKS Kubernetes 集群自动对节点（Amazon EC2 实例）进行预置和生命周期管理。

使用 Amazon EKS 托管节点组，您无需单独预置或注册 Amazon EC2 实例以提供计算容量来运行 Kubernetes 应用程序。您可以通过单个操作为集群创建、自动更新或终止节点。节点的更新和终止操作会自动耗尽节点，以确保您的应用程序保持为可用的状态。

所有托管节点均作为由 Amazon EKS 为您管理的 Amazon EC2 Auto Scaling 组的一部分进行预置。所有资源（包括实例和自动扩缩组在内）都在您的 Amazon 账户中运行。每个节点组跨您定义的多个可用区运行。

托管式节点组还可以选择利用节点自动修复功能，从而持续监控节点的运行状况。此功能还会自动处理检测到的问题，并在可能的情况下替换节点。这有助于在尽可能减少手动干预的情况下提高集群的整体可用性。有关更多信息，请参阅 [检测节点运行状况问题并启用自动节点修复](node-health.md)。

您可以使用 Amazon EKS 控制台、`eksctl`、Amazon CLI、Amazon API 或基础设施即代码工具（包括 Amazon CloudFormation），将托管式节点组添加到新的或现有集群中。作为托管节点组一部分启动的节点会自动进行标记，以便 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md) 能自动发现这些节点。您可以使用节点组将 Kubernetes 标签应用到节点并随时更新它们。

使用 Amazon EKS 托管节点组没有额外的费用，您只需为预置的 Amazon 资源付费。这些资源包括 Amazon EC2 实例、Amazon EBS 卷、Amazon EKS 集群小时数和任何其他 Amazon 基础设施。无最低费用，无预先承诺。

要开始使用新 Amazon EKS 集群和托管节点组，请参阅 [开始使用 Amazon EKS – Amazon Web Services 管理控制台和 Amazon CLI](getting-started-console.md)。

要将托管节点组添加到现有集群，请参阅 [为集群创建托管式节点组](create-managed-node-group.md)。

## 托管节点组概念
<a name="managed-node-group-concepts"></a>
+ Amazon EKS 托管节点组为您创建和管理 Amazon EC2 实例。
+ 所有托管节点均作为由 Amazon EKS 为您管理的 Amazon EC2 Auto Scaling 组的一部分进行预置。此外，包括 Amazon EC2 实例和自动扩缩组在内的所有资源都在您的 Amazon 账户中运行。
+ Amazon EKS 会定期同步托管节点组的扩展配置，以匹配实际的自动扩缩组值。如果 Cluster Autoscaler 等外部行为者修改了自动扩缩组的大小，则 `DescribeNodegroup` 最终将反映这些更改。当您在未显式修改扩展配置的情况下启动节点组更新或升级时，工作流将使用当前的自自动扩缩组值，而不是节点组存储的扩展配置。只有当您在 `UpdateNodegroupConfig` 请求中显式包含存储的扩展配置时，才会优先使用该配置。
+ 托管节点组的弹性伸缩组涵盖您在创建组时指定的所有子网。
+ Amazon EKS 标记托管节点组资源，以便将其配置为使用 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)。
**重要**  
如果要使用 Kubernetes [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md) 在由 Amazon EBS 卷支持的多个可用区中运行有状态应用程序，则应该配置多个节点组，且每个节点组的范围都限定为一个可用区。此外，您还应该启用 `--balance-similar-node-groups` 功能。
+ 在部署托管节点时，可以使用自定义启动模板以获得更大灵活性和自定义性。例如，您可以指定额外的 `kubelet` 参数并使用自定义 AMI。有关更多信息，请参阅 [使用启动模板自定义托管式节点](launch-templates.md)。如果首次创建托管节点组时没有使用自定义启动模板，则会有自动生成的启动模板。不要手动修改此自动生成的模板，否则会发生错误。
+ Amazon EKS 在托管节点组上遵循 CVE 和安全补丁的责任共担模式。当托管节点运行 Amazon EKS 优化版 AMI 时，Amazon EKS 负责在报告 Bug 或问题时构建 AMI 的修补版本。我们可以发布修复程序。但是，您负责将这些修补的 AMI 版本部署到托管节点组。当托管节点运行自定义 AMI 时，您要负责在报告 Bug 或问题时构建 AMI 的修补版本，然后部署 AMI。有关更多信息，请参阅 [更新集群的托管式节点组](update-managed-node-group.md)。
+ Amazon EKS 托管节点组既可以在公有子网也可以在私有子网中启动。如果您在不早于 2020 年 4 月 22 日启动了公有子网中的托管节点组，则子网必须将 `MapPublicIpOnLaunch` 设置为 true，这些实例才能成功加入集群。如果公有子网是使用 `eksctl` 或 [Amazon EKS 发布的 Amazon CloudFormation 模板](creating-a-vpc.md)并在 2020 年 3 月 26 日或之后创建的，则此设置已设置为 true。如果在 2020 年 3 月 26 日之前创建了公有子网，则必须手动更改设置。有关更多信息，请参阅[修改子网的公有 IPv4 寻址属性](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-ip-addressing.html#subnet-public-ip)。
+ 在私有子网中部署托管节点组时，必须确保它可以访问 Amazon ECR 来拉取容器映像。您可以通过将 NAT 网关连接到子网的路由表或添加以下 [Amazon PrivateLink VPC 端点](https://docs.amazonaws.cn/AmazonECR/latest/userguide/vpc-endpoints.html#ecr-setting-up-vpc-create)来实现此目的：
  + Amazon ECR API 端点接口 – `com.amazonaws.region-code.ecr.api` 
  + Amazon ECR Docker 注册表 API 端点接口 – `com.amazonaws.region-code.ecr.dkr` 
  + Amazon S3 网关端点 – `com.amazonaws.region-code.s3` 

  有关其他常用服务和端点的信息，请参阅 [部署具有有限互联网访问权限的私有集群](private-clusters.md)。
+ 托管节点组无法部署在 [Amazon Outposts](eks-outposts.md) 上或 [Amazon Wavelength](https://docs.amazonaws.cn/wavelength/) 中。托管节点组现已可在 [Amazon Local Zones](https://www.amazonaws.cn/about-aws/global-infrastructure/localzones/) 中创建。有关更多信息，请参阅 [使用 Amazon Local Zones 启动低延迟 EKS 集群](local-zones.md)。
+ 您可以在单个集群中创建多个托管节点组。例如，您可以为某些工作负载使用标准的 Amazon EKS 优化版 Amazon Linux AMI 创建一个节点组，为需要 GPU 支持的工作负载使用 GPU 变体创建另一个节点组。
+ 如果您的托管节点组遇到 [Amazon EC2 实例状况检查](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html)失败，则 Amazon EKS 会返回错误代码来帮助您诊断问题。有关更多信息，请参阅 [托管节点组错误代码](troubleshooting.md#troubleshoot-managed-node-groups)。
+ Amazon EKS 将 Kubernetes 标签添加到托管节点组实例。Amazon EKS 提供的这些标签带有前缀 `eks.amazonaws.com`。
+ 在终止或更新期间，Amazon EKS 使用 Kubernetes API 自动耗尽节点。
+ 使用 `AZRebalance` 终止节点或减少所需节点数量时，未遵守容器组（pod）中断预算。这些操作试图驱逐节点上的容器组（pod）。但如果超过 15 分钟，则无论节点上的所有容器组（pod）是否都被终止，该节点都会终止。要将时间延长至节点终止，请向自动扩缩组添加生命周期挂钩。有关更多信息，请参阅《Amazon EC2 Auto Scaling 用户指南》**中的[添加生命周期挂钩](https://docs.amazonaws.cn/autoscaling/ec2/userguide/adding-lifecycle-hooks.html)。
+ 为了在收到 Spot 中断通知或容量再平衡通知后正确运行耗尽进程，必须将 `CapacityRebalance` 设置为 `true`。
+ 更新托管节点组遵循您为容器组（pod）设置的容器组（pod）中断预算。有关更多信息，请参阅 [了解节点更新的各个阶段](managed-node-update-behavior.md)。
+ 使用 Amazon EKS 托管节点组不会产生额外的费用。您仅需为预置的Amazon资源付费。
+ 如果要为节点加密 Amazon EBS 卷，可以使用启动模板部署节点。要在不使用启动模板的情况下部署包含加密 Amazon EBS 卷的托管节点，必须对账户中创建的所有新 Amazon EBS 卷进行加密。有关更多信息，请参阅 *Amazon EC2 用户指南*中的[默认加密](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/EBSEncryption.html#encryption-by-default)。

## 托管节点组容量类型
<a name="managed-node-group-capacity-types"></a>

创建托管节点组时，您可以选择按需容量或 Spot 容量类型。Amazon EKS 使用 Amazon EC2 Auto Scaling 组部署托管节点组，该组只包含按需实例或只包含 Amazon EC2 竞价型实例。您可以将容错应用程序的容器组（pod）调度到 Spot 托管节点组，将容错应用程序调度到单个 Kubernetes 集群中的按需节点组。预设情况下，托管节点组部署按需 Amazon EC2 实例。

### 按需型
<a name="managed-node-group-capacity-types-on-demand"></a>

使用按需实例，您按秒为计算容量支付费用，无需长期订阅。

预设情况下，如果您没有指定**容量类型**，则会使用按需实例预置托管节点组。托管节点组会代表您配置 Amazon EC2 Auto Scaling 组，并应用以下设置：
+ 预置按需容量的分配策略设置为 `prioritized`。托管节点组使用实例类型在 API 中的传入顺序，确定在满足按需容量时首先使用哪种实例类型。例如，您可以按以下顺序指定三种实例类型：`c5.large`、`c4.large` 和 `c3.large`。在启动您的按需实例时，托管节点组满足按需容量的顺序是从 `c5.large` 开始，然后是 `c4.large`，再然后是 `c3.large`。有关更多信息，请参阅 *Amazon EC2 Auto Scaling 用户指南*中的 [Amazon EC2 Auto Scaling 组](https://docs.amazonaws.cn/autoscaling/ec2/userguide/asg-purchase-options.html#asg-allocation-strategies)。
+ Amazon EKS 会向您指定了容量类型的托管节点组中的所有节点添加以下 Kubernetes 标注：`eks.amazonaws.com/capacityType: ON_DEMAND`。您可以使用此标注在按需节点上调度有状态或不容错的应用程序。

### Spot
<a name="managed-node-group-capacity-types-spot"></a>

Amazon EC2 Spot 实例是备用的 Amazon EC2 容量，价格相当于在按需实例价格上打了巨大折扣。当 EC2 需要收回容量时，Amazon EC2 Spot 实例可能中断并发出一个两分钟的中断通知。有关更多信息，请参阅 *Amazon EC2 用户指南*中的[竞价型实例](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/using-spot-instances.html)。您可以使用 Amazon EC2 Spot 实例配置托管节点组，以优化 Amazon EKS 集群中运行的计算节点的成本。

要在托管节点组中使用 Spot 实例，请将容量类型设置为 `spot`，创建托管节点组。托管节点组使用以下 Spot 最佳实践代表您配置 Amazon EC2 Auto Scaling 组：
+ 为确保在最佳 Spot 容量池中预置 Spot 节点，将分配策略设置为以下策略之一：
  +  `price-capacity-optimized`（PCO）– 在 Kubernetes `1.28` 版本或更高版本的集群中创建新节点组时，将分配策略设置为 `price-capacity-optimized`。但是，对于在 Amazon EKS 托管节点组开始支持 PCO 之前使用 `capacity-optimized` 创建的节点组，分配策略不会更改。
  +  `capacity-optimized`（CO）– 在 Kubernetes `1.27` 版本或更低版本的集群中创建新节点组时，将分配策略设置为 `capacity-optimized`。

  要增加可用于分配容量的 Spot 容量池的数量，请将托管节点组配置为使用多个实例类型。
+ 启用了 Amazon EC2 Spot 容量再平衡，以便 Amazon EKS 能够顺畅地耗尽和重新平衡您的 Spot 节点，从而在 Spot 节点中断风险增加时最大限度地减少应用程序中断。有关更多信息，请参阅 *Amazon EC2 Auto Scaling 用户指南*中的 [Amazon EC2 Auto Scaling 容量再平衡](https://docs.amazonaws.cn/autoscaling/ec2/userguide/capacity-rebalance.html)。
  + Spot 节点收到再平衡建议时，Amazon EKS 会自动尝试启动新的替换 Spot 节点。
  + 如果 Spot 两分钟中断通知在替换 Spot 节点进入 `Ready` 状态之前到达时间，Amazon EKS 将开始耗尽收到再平衡建议的 Spot 节点。Amazon EKS 会尽最大努力耗尽节点。因此，无法保证 Amazon EKS 会等待替换节点加入集群后再耗尽现有节点。
  + 当替换 Spot 节点引导启动并在 Kubernetes 中处于 `Ready` 状态后，Amazon EKS 将封锁并耗尽收到再平衡建议的 Spot 节点。封锁 Spot 节点可确保服务控制器不会向此 Spot 节点发送任何新请求。它还将其从其运行状况良好的活动 Spot 节点列表中删除。耗尽 Spot 节点可确保正在运行的容器组（pod）被自然地逐出。
+ Amazon EKS 会向您指定了容量类型的托管节点组中的所有节点添加以下 Kubernetes 标注：`eks.amazonaws.com/capacityType: SPOT`。您可以使用此标注在 Spot 节点上安排容错应用程序。
**重要**  
EC2 会在终止您的竞价型实例前两分钟发出[竞价型实例中断通知](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/spot-instance-termination-notices.html)。但是，竞价型实例节点上的容器组（pod）可能无法获得完整的 2 分钟正常关闭时段。当 EC2 发出通知时，Amazon EKS 开始驱逐容器组（pod）之前会有延迟。驱逐按顺序进行，以保护 Kubernetes API 服务器，因此在同时进行多次竞价型实例回收期间，某些容器组（pod）可能会收到延迟驱逐的通知。容器组（pod）可能会在未接收到终止信号的情况下被强制终止，尤其是在高密度的容器组（pod）节点上、并发回收期间或使用较长的终止宽限期时。对于竞价型实例工作负载，建议将应用程序设计为可承受中断，使用 30 秒或更短的终止宽限期，避免长时间运行的 PreStop 钩子，并监控容器组（pod）驱逐指标以了解集群中的实际宽限期。对于需要保证正常终止的工作负载，建议改用按需容量。

在决定是部署具有按需容量还是 Spot 容量的节点组时，应考虑以下条件：
+ Spot 实例适合无状态、容错且灵活的应用程序。其中包括批处理和机器学习培训工作负载、大数据 ETL（例如 Apache Spark）、队列处理应用程序和无状态 API 端点。由于 Spot 是备用 Amazon EC2 容量，这些容量可能会随时间变化，因此我们建议您对可容忍中断的工作负载使用 Spot 容量。更具体地说，Spot 容量适合可以容忍所需容量不可用的时段的工作负载。
+ 我们建议您为不容错的应用程序使用 On-Demand。这包括集群管理工具，例如监控和操作工具，需要 `StatefulSets` 的部署，以及有状态的应用程序，如数据库。
+ 为了在使用 Spot 实例时最大限度地提高应用程序的可用性，我们建议您将 Spot 托管节点组配置为使用多个实例类型。我们建议在使用多个实例类型时应用以下规则：
  + 在托管节点组中，如果使用 [Cluster Autoscaler](https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/README.md)，我们建议使用具有相同数量 vCPU 和内存资源的灵活实例类型集。这是为了确保集群中的节点按预期进行扩缩。例如，如果需要 4 个 vCPU 和 8 GiB 内存，请使用 `c3.xlarge`、`c4.xlarge`、`c5.xlarge`、`c5d.xlarge`、`c5a.xlarge`、`c5n.xlarge` 或其他类似实例类型。
  + 为了提高应用程序可用性，我们建议部署多个 Spot 托管节点组。为此，每个组应使用一组具有相同 vCPU 和内存资源的灵活实例类型。例如，如果您需要 4 个 vCPU 和 8 GiB 内存，我们建议您使用 `c3.xlarge`、`c4.xlarge`、`c5.xlarge`、`c5d.xlarge`、`c5a.xlarge`、`c5n.xlarge` 或其他类似的实例类型创建一个托管节点组，并使用 `m3.xlarge`、`m4.xlarge`、`m5.xlarge`、`m5d.xlarge`、`m5a.xlarge`、`m5n.xlarge` 或其他类似的实例类型创建第二个托管节点组。
  + 用使用自定义启动模板的 Spot 容量类型部署节点组时，请使用 API 传递多个实例类型。不要通过启动模板传递单个实例类型。有关使用启动模板部署节点组的更多信息，请参阅 [使用启动模板自定义托管式节点](launch-templates.md)。