节点自动扩缩容
为了在集群中运行工作负载,你需要节点。集群中的节点可以进行 **自动扩缩**(autoscaled):动态地**配置(provisioned)** 或**合并(consolidated)** 以提供所需容量,同时优化成本。自动扩缩由节点 **自动扩缩器(autoscalers)**执行。
节点配置(Provisioning)
如果集群中有 Pod 无法在现有节点上调度,可以自动向集群中添加新节点(即 **配置(provisioned)**)以容纳这些 Pod。如果 Pod 数量随时间变化(例如,通过结合使用水平工作负载自动扩缩和节点自动扩缩),这尤其有用。
自动扩缩器通过创建和删除支持节点所依赖的云提供商资源来配置节点。最常见情况下,支持节点的资源是虚拟机。
配置的主要目标是使所有 Pod 都能被调度。这个目标并非总是可以达到,因为存在各种限制,包括达到配置的配置上限、配置配置与特定 Pod 集合不兼容或云提供商容量不足。在配置过程中,节点自动扩缩器通常会尝试实现额外目标(例如,最小化配置节点的成本或平衡故障域之间的节点数量)。
节点自动扩缩器在决定配置哪些节点时,有两个主要输入:Pod 调度约束 和 自动扩缩器配置施加的节点约束。
自动扩缩器配置还可能包含其他节点配置触发器(例如,节点数量低于配置的最小限制)。
说明
在 Cluster Autoscaler 中,配置以前称为 **扩容(scale-up)**。Pod 调度约束
Pod 可以表达调度约束,以限制它们可以调度的节点类型。节点自动扩缩器会考虑这些约束,以确保待处理的 Pod 可以在配置的节点上调度。
最常见的调度约束是 Pod 容器指定的资源请求。自动扩缩器将确保配置的节点有足够的资源来满足这些请求。然而,它们不直接考虑 Pod 启动后实际的资源使用情况。为了基于实际工作负载资源使用情况自动扩缩节点,你可以将水平工作负载自动扩缩与节点自动扩缩结合使用。
其他常见的 Pod 调度约束包括节点亲和性、Pod 间亲和性或对特定存储卷的要求。
自动扩缩器配置施加的节点约束
配置节点的具体属性(例如,资源数量、给定标签的存在性)取决于自动扩缩器配置。自动扩缩器可以从一组预定义的节点配置中选择,或使用自动配置(auto-provisioning)。
自动配置(Auto-provisioning)
节点自动配置是一种配置模式,用户无需完全配置可以配置的节点具体属性。相反,自动扩缩器根据其响应的待处理 Pod 以及预配置的约束(例如,最小资源量或给定标签的需求)动态选择节点配置。
节点合并(Consolidation)
运行集群时,主要考虑因素是确保所有可调度的 Pod 都在运行,同时尽可能降低集群成本。为此,Pod 的资源请求应尽可能多地利用节点的资源。从这个角度看,集群的整体节点利用率可以作为衡量集群成本效益的代理指标。
说明
正确设置 Pod 的资源请求与优化节点利用率对于集群的整体成本效益同样重要。将节点自动扩缩与垂直工作负载自动扩缩相结合可以帮助你实现这一点。集群中的节点可以自动 **合并(consolidated)**,以提高整体节点利用率,从而提高集群的成本效益。合并通过从集群中移除一组利用率不足的节点来实现。此外,也可以配置(provisioned)另一组节点来替换它们。
合并与配置一样,在决策时只考虑 Pod 资源请求,而不考虑实际资源使用情况。
为了进行合并,如果一个节点上只运行 DaemonSet 和静态 Pod,则认为该节点是 **空的(empty)**。在合并期间移除空节点比移除非空节点更直接,自动扩缩器通常会针对合并空节点进行优化。
在合并期间移除非空节点是具有破坏性的——在其上运行的 Pod 会被终止,并且可能需要重新创建(例如,由 Deployment 重新创建)。然而,所有这些重新创建的 Pod 应该能够调度到集群中现有的节点上,或者作为合并一部分配置的替代节点上。**正常情况下,合并不会导致任何 Pod 变成待定状态。**
说明
自动扩缩器会预测 Pod 在节点配置或合并后可能如何调度,但它们不控制实际的调度。因此,一些 Pod 可能因为合并而变成待定状态——例如,如果在进行合并时出现了一个全新的 Pod。自动扩缩器配置也可能允许通过其他条件触发合并(例如,自节点创建以来经过的时间),以优化不同的属性(例如,集群中节点的最大生命周期)。
合并的具体执行细节取决于给定自动扩缩器的配置。
说明
在 Cluster Autoscaler 中,合并以前称为 **缩容(scale-down)**。自动扩缩器
前几节描述的功能由节点 **自动扩缩器(autoscalers)** 提供。除了 Kubernetes API,自动扩缩器还需要与云提供商 API 交互来配置和合并节点。这意味着它们需要与每个支持的云提供商进行明确集成。给定自动扩缩器的性能和功能集在不同的云提供商集成之间可能有所不同。
自动扩缩器实现
Cluster Autoscaler 和 Karpenter 是目前由 SIG Autoscaling 支持的两个节点自动扩缩器。
从集群用户的角度来看,两个自动扩缩器应该提供类似的节点自动扩缩体验。它们都会为不可调度的 Pod 配置新节点,并且都会合并不再最优利用的节点。
不同的自动扩缩器也可能提供本页面所述节点自动扩缩范围之外的功能,这些额外功能可能有所不同。
请参考以下部分以及各个自动扩缩器的链接文档,以决定哪个自动扩缩器更适合你的用例。
Cluster Autoscaler
Cluster Autoscaler 向预配置的 **节点组(Node groups)** 添加或移除节点。节点组通常映射到某种云提供商资源组(最常见的是虚拟机组)。Cluster Autoscaler 的一个实例可以同时管理多个节点组。在配置时,Cluster Autoscaler 会将节点添加到最适合待处理 Pod 请求的组中。在合并时,Cluster Autoscaler 总是选择特定的节点来移除,而不是简单地调整底层云提供商资源组的大小。
额外上下文
Karpenter
Karpenter 根据集群操作员提供的 NodePool 配置自动配置节点。Karpenter 处理节点生命周期的所有方面,而不仅仅是自动扩缩。这包括在节点达到一定生命周期后自动刷新节点,以及在新工作节点镜像发布时自动升级节点。它直接与单个云提供商资源(最常见的是单个虚拟机)交互,不依赖于云提供商资源组。
额外上下文
实现比较
Cluster Autoscaler 和 Karpenter 之间的主要区别
- Cluster Autoscaler 仅提供与节点自动扩缩相关的功能。Karpenter 范围更广,还提供旨在管理整个节点生命周期的功能(例如,利用中断在节点达到一定生命周期后自动重新创建节点,或将其自动升级到新版本)。
- Cluster Autoscaler 不支持自动配置,可以从中配置节点的节点组必须预先配置。Karpenter 支持自动配置,因此用户只需配置一组配置节点的约束,而不是完全配置同构组。
- Cluster Autoscaler 直接提供云提供商集成,这意味着它们是 Kubernetes 项目的一部分。对于 Karpenter,Kubernetes 项目将 Karpenter 作为库发布,云提供商可以与其集成以构建节点自动扩缩器。
- Cluster Autoscaler 提供与众多云提供商的集成,包括较小和不太受欢迎的提供商。与 Karpenter 集成的云提供商较少,包括 AWS 和 Azure。
结合工作负载和节点自动扩缩
水平工作负载自动扩缩
节点自动扩缩通常响应 Pods 工作——它配置新节点以容纳不可调度的 Pod,并在不再需要时合并节点。
水平工作负载自动扩缩自动扩缩工作负载副本的数量,以保持副本之间所需的平均资源利用率。换句话说,它根据应用程序负载自动创建新 Pod,并在负载减少时移除 Pod。
你可以将节点自动扩缩与水平工作负载自动扩缩一起使用,以基于 Pod 的平均实际资源利用率来自动扩缩集群中的节点。
如果应用程序负载增加,其 Pod 的平均利用率也应增加,从而促使工作负载自动扩缩创建新 Pod。然后,节点自动扩缩应配置新节点以容纳新 Pod。
一旦应用程序负载减少,工作负载自动扩缩应移除不必要的 Pod。节点自动扩缩则应合并不再需要的节点。
如果配置正确,这种模式可确保你的应用程序在需要时总是有足够的节点容量来处理负载峰值,但在不需要时无需为此容量付费。
垂直工作负载自动扩缩
使用节点自动扩缩时,正确设置 Pod 资源请求非常重要。如果给定 Pod 的请求过低,为其配置新节点可能无法帮助 Pod 实际运行。如果给定 Pod 的请求过高,它可能会错误地阻止合并其节点。
垂直工作负载自动扩缩根据 Pod 的历史资源使用情况自动调整其资源请求。
你可以将节点自动扩缩与垂直工作负载自动扩缩一起使用,以便在保留集群节点自动扩缩能力的同时调整 Pod 的资源请求。
注意
使用节点自动扩缩时,不建议为 DaemonSet Pod 设置垂直工作负载自动扩缩。自动扩缩器必须预测新节点上的 DaemonSet Pod 将是什么样子,以便预测可用的节点资源。垂直工作负载自动扩缩可能会使这些预测不可靠,从而导致不正确的扩缩决策。相关组件
本节描述提供与节点自动扩缩相关功能的组件。
Descheduler
Descheduler 是一个基于自定义策略提供节点合并功能的组件,同时提供其他优化节点和 Pod 的功能(例如,删除频繁重启的 Pod)。
基于集群大小的工作负载自动扩缩器
Cluster Proportional Autoscaler 和 Cluster Proportional Vertical Autoscaler 基于集群中的节点数量提供水平和垂直工作负载自动扩缩。你可以在基于集群大小的自动扩缩中阅读更多内容。
接下来
- 阅读关于工作负载级别自动扩缩的内容