使用托管式节点组简化节点生命周期 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用托管式节点组简化节点生命周期

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

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

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

您可以使用 Amazon EKS 控制台、eksctl、Amazon CLI、Amazon API 或基础设施即代码工具(包括 Amazon CloudFormation),将托管节点组添加到新的或现有集群中。作为托管节点组一部分启动的节点会自动进行标记,以便由 Kubernetes Cluster Autoscaler 自动发现它们。您可以使用节点组将 Kubernetes 标签应用到节点并随时更新它们。

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

要开始使用新 Amazon EKS 集群和托管节点组,请参阅 开始使用 Amazon EKS – Amazon Web Services Management Console和 Amazon CLI

要将托管节点组添加到现有集群,请参阅 为集群创建托管式节点组

托管节点组概念

  • Amazon EKS 托管节点组为您创建和管理 Amazon EC2 实例。

  • 所有托管节点均作为由 Amazon EKS 为您管理的 Amazon EC2 Auto Scaling 组的一部分进行预置。此外,包括 Amazon EC2 实例和 Auto Scaling 组在内的所有资源都在您的 Amazon 账户中运行。

  • 托管节点组的弹性伸缩组涵盖您在创建组时指定的所有子网。

  • Amazon EKS 标记托管节点组资源,以便将其配置为使用 Kubernetes Cluster Autoscaler

    重要

    如果要使用 Kubernetes Cluster Autoscaler 在由 Amazon EBS 卷支持的多个可用区中运行有状态应用程序,则应该配置多个节点组,每个节点组的范围都限定为一个可用区。此外,您还应该启用 --balance-similar-node-groups 功能。

  • 在部署托管节点时,可以使用自定义启动模板以获得更大灵活性和自定义性。例如,您可以指定额外的 kubelet 参数并使用自定义 AMI。有关更多信息,请参阅 使用启动模板自定义托管式节点。如果首次创建托管节点组时没有使用自定义启动模板,则会有自动生成的启动模板。不要手动修改此自动生成的模板,否则会发生错误。

  • Amazon EKS 在托管节点组上遵循 CVE 和安全补丁的责任共担模式。当托管节点运行 Amazon EKS 优化版 AMI 时,Amazon EKS 负责在报告 Bug 或问题时构建 AMI 的修补版本。我们可以发布修复程序。但是,您负责将这些修补的 AMI 版本部署到托管节点组。当托管节点运行自定义 AMI 时,您要负责在报告 Bug 或问题时构建 AMI 的修补版本,然后部署 AMI。有关更多信息,请参阅 更新集群的托管式节点组

  • Amazon EKS 托管节点组既可以在公有子网也可以在私有子网中启动。如果您在不早于 2020 年 4 月 22 日启动了公有子网中的托管节点组,则子网必须将 MapPublicIpOnLaunch 设置为 true,这些实例才能成功加入集群。如果公有子网是使用 eksctlAmazon EKS 发布的 Amazon CloudFormation 模板并在 2020 年 3 月 26 日或之后创建的,则此设置已设置为 true。如果在 2020 年 3 月 26 日之前创建了公有子网,则必须手动更改设置。有关更多信息,请参阅修改子网的公有 IPv4 寻址属性

  • 在私有子网中部署托管节点组时,必须确保它可以访问 Amazon ECR 来拉取容器映像。您可以通过将 NAT 网关连接到子网的路由表或添加以下 Amazon PrivateLink VPC 端点来实现此目的:

    • 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

    有关其他常用服务和端点的信息,请参阅 部署具有有限互联网访问权限的私有集群

  • 托管节点组无法部署在 Amazon Outposts 上或 Amazon Wavelength 或 Amazon Local Zones 中。

  • 您可以在单个集群中创建多个托管节点组。例如,您可以为某些工作负载使用标准的 Amazon EKS 优化版 Amazon Linux AMI 创建一个节点组,为需要 GPU 支持的工作负载使用 GPU 变体创建另一个节点组。

  • 如果您的托管节点组遇到 Amazon EC2 实例状况检查失败,则 Amazon EKS 会返回错误代码来帮助您诊断问题。有关更多信息,请参阅 托管节点组错误代码

  • Amazon EKS 将 Kubernetes 标签添加到托管节点组实例。Amazon EKS 提供的这些标签带有前缀 eks.amazonaws.com

  • 在终止或更新期间,Amazon EKS 使用 Kubernetes API 自动耗尽节点。

  • 使用 AZRebalance 终止节点或减少所需节点数量时,未遵守容器组(pod)中断预算。这些操作试图驱逐节点上的 Pods。但如果超过 15 分钟,则无论节点上的所有 Pods 是否都被终止,该节点都会终止。要将时间延长至节点终止,请向自动扩缩组添加生命周期挂钩。有关更多信息,请参阅《Amazon EC2 Auto Scaling 用户指南》中的添加生命周期挂钩

  • 为了在收到 Spot 中断通知或容量再平衡通知后正确运行耗尽进程,必须将 CapacityRebalance 设置为 true

  • 更新托管节点组遵循您为 Pods 设置的 Pod 中断预算。有关更多信息,请参阅 了解节点更新的各个阶段

  • 使用 Amazon EKS 托管节点组不会产生额外的费用。您仅需为预置的Amazon资源付费。

  • 如果要为节点加密 Amazon EBS 卷,可以使用启动模板部署节点。要在不使用启动模板的情况下部署包含加密 Amazon EBS 卷的托管节点,必须对账户中创建的所有新 Amazon EBS 卷进行加密。有关更多信息,请参阅 Amazon EC2 用户指南中的默认加密

托管节点组容量类型

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

按需型

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

预设情况下,如果您没有指定容量类型,则会使用按需实例预置托管节点组。托管节点组会代表您配置 Amazon EC2 Auto Scaling 组,并应用以下设置:

  • 预置按需容量的分配策略设置为 prioritized。托管节点组使用实例类型在 API 中的传入顺序,确定在满足按需容量时首先使用哪种实例类型。例如,您可以按以下顺序指定三种实例类型:c5.largec4.largec3.large。在启动您的按需实例时,托管节点组满足按需容量的顺序是从 c5.large 开始,然后是 c4.large,再然后是 c3.large。有关更多信息,请参阅 Amazon EC2 Auto Scaling 用户指南中的 Amazon EC2 Auto Scaling 组

  • Amazon EKS 会向您指定了容量类型的托管节点组中的所有节点添加以下 Kubernetes 标签:eks.amazonaws.com/capacityType: ON_DEMAND。您可以使用此标注在按需节点上调度有状态或不容错的应用程序。

Spot 实例

Amazon EC2 Spot 实例是备用的 Amazon EC2 容量,价格相当于在按需实例价格上打了巨大折扣。当 EC2 需要收回容量时,Amazon EC2 Spot 实例可能中断并发出一个两分钟的中断通知。有关更多信息,请参阅 Amazon EC2 用户指南中的竞价型实例。您可以使用 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 容量再平衡

    • Spot 节点收到再平衡建议时,Amazon EKS 会自动尝试启动新的替换 Spot 节点。

    • 如果 Spot 两分钟中断通知在替换 Spot 节点进入 Ready 状态之前到达时间,Amazon EKS 将开始耗尽收到再平衡建议的 Spot 节点。Amazon EKS 会尽最大努力耗尽节点。因此,无法保证 Amazon EKS 会等待替换节点加入集群后再耗尽现有节点。

    • 当替换 Spot 节点引导启动并在 Kubernetes 中处于 Ready 状态后,Amazon EKS 将封锁并耗尽收到再平衡建议的 Spot 节点。封锁 Spot 节点可确保服务控制器不会向此 Spot 节点发送任何新请求。它还将其从其运行状况良好的活动 Spot 节点列表中删除。耗尽 Spot 节点可确保正在运行的 Pods 被自然地逐出。

  • Amazon EKS 会向您指定了容量类型的托管节点组中的所有节点添加以下 Kubernetes 标签:eks.amazonaws.com/capacityType: SPOT。您可以使用此标注在 Spot 节点上安排容错应用程序。

在决定是部署具有按需容量还是 Spot 容量的节点组时,应考虑以下条件:

  • Spot 实例适合无状态、容错且灵活的应用程序。其中包括批处理和机器学习培训工作负载、大数据 ETL(例如 Apache Spark)、队列处理应用程序和无状态 API 端点。由于 Spot 是备用 Amazon EC2 容量,这些容量可能会随时间变化,因此我们建议您对可容忍中断的工作负载使用 Spot 容量。更具体地说,Spot 容量适合可以容忍所需容量不可用的时段的工作负载。

  • 我们建议您为不容错的应用程序使用 On-Demand。这包括集群管理工具,例如监控和操作工具,需要 StatefulSets 的部署,以及有状态的应用程序,如数据库。

  • 为了在使用 Spot 实例时最大限度地提高应用程序的可用性,我们建议您将 Spot 托管节点组配置为使用多个实例类型。我们建议在使用多个实例类型时应用以下规则:

    • 在托管节点组中,如果使用 Cluster Autoscaler,我们建议使用具有相同数量 vCPU 和内存资源的灵活实例类型集。这是为了确保集群中的节点按预期进行扩缩。例如,如果需要 4 个 vCPU 和 8 GiB 内存,请使用 c3.xlargec4.xlargec5.xlargec5d.xlargec5a.xlargec5n.xlarge 或其他类似实例类型。

    • 为了提高应用程序可用性,我们建议部署多个 Spot 托管节点组。为此,每个组应使用一组具有相同 vCPU 和内存资源的灵活实例类型。例如,如果您需要 4 个 vCPU 和 8 GiB 内存,我们建议您使用 c3.xlargec4.xlargec5.xlargec5d.xlargec5a.xlargec5n.xlarge 或其他类似的实例类型创建一个托管节点组,并使用 m3.xlargem4.xlargem5.xlargem5d.xlargem5a.xlargem5n.xlarge 或其他类似的实例类型创建第二个托管节点组。

    • 用使用自定义启动模板的 Spot 容量类型部署节点组时,请使用 API 传递多个实例类型。不要通过启动模板传递单个实例类型。有关使用启动模板部署节点组的更多信息,请参阅 使用启动模板自定义托管式节点