自动扩缩工作负载

通过自动扩缩,你可以用某种方式自动更新你的工作负载。在面对资源需求变化的时候可以使你的集群更灵活、更高效。

在 Kubernetes 中,你可以根据当前的资源需求扩缩工作负载。 这让你的集群可以更灵活、更高效地面对资源需求的变化。

当你扩缩工作负载时,你可以增加或减少工作负载所管理的副本数量,或者就地调整副本的可用资源。

第一种手段称为水平扩缩,第二种称为垂直扩缩

扩缩工作负载有手动和自动两种方式,这取决于你的使用情况。

手动扩缩工作负载

Kubernetes 支持工作负载的手动扩缩。水平扩缩可以使用 kubectl 命令行工具完成。 对于垂直扩缩,你需要更新工作负载的资源定义。

这两种策略的示例见下文。

自动扩缩工作负载

Kubernetes 也支持工作负载的自动扩缩,这也是本页的重点。

在 Kubernetes 中自动扩缩的概念是指自动更新管理一组 Pod 的能力(例如 Deployment)。

水平扩缩工作负载

在 Kubernetes 中,你可以使用 HorizontalPodAutoscaler (HPA) 实现工作负载的自动水平扩缩。

它以 Kubernetes API 资源和控制器的方式实现, 并定期调整工作负载中副本的数量 以满足设置的资源利用率,如 CPU 或内存利用率。

这是一个为 Deployment 部署配置 HorizontalPodAutoscaler 的示例教程

垂直扩缩工作负载

特性状态: Kubernetes v1.25 [stable]

你可以使用 VerticalPodAutoscaler (VPA) 实现工作负载的垂直扩缩。 不同于 HPA,VPA 并非默认来源于 Kubernetes,而是一个独立的项目, 参见 on GitHub

安装后,你可以为工作负载创建 CustomResourceDefinitions(CRDs), 定义如何以及何时扩缩被管理副本的资源。

说明:

你需要在集群中安装 Metrics Server,这样,你的 HPA 才能正常工作。

目前,VPA 可以有四种不同的运行模式:

VPA 的不同模式
模式描述
Auto目前是 Recreate,将来可能改为就地更新
RecreateVPA 会在创建 Pod 时分配资源请求,并且当请求的资源与新的建议值区别很大时通过驱逐 Pod 的方式来更新现存的 Pod
InitialVPA 只有在创建时分配资源请求,之后不做更改
OffVPA 不会自动更改 Pod 的资源需求,建议值仍会计算并可在 VPA 对象中查看

就地调整的要求

特性状态: Kubernetes v1.27 [alpha]

重启 Pod 或其中容器就地调整工作负载的情况下要求 Kubernetes 版本大于 1.27。 此外,特性门控 InPlaceVerticalScaling 需要开启。

InPlacePodVerticalScaling:

启用就地 Pod 垂直扩缩。

根据集群规模自动扩缩

对于需要根据集群规模实现扩缩的工作负载(例如:cluster-dns 或者其他系统组件), 你可以使用 Cluster Proportional Autoscaler。 与 VPA 一样,这个项目不是 Kubernetes 核心项目的一部分,它在 GitHub 上有自己的项目。

集群弹性伸缩器 (Cluster Proportional Autoscaler) 会观测可调度 节点 和 内核数量, 并调整目标工作负载的副本数量。

如果副本的数量需要保持一致,你可以使用 Cluster Proportional Vertical Autoscaler 来根据集群规模进行垂直扩缩。 这个项目目前处于 beta 阶段,你可以在 GitHub 上找到它。

集群弹性伸缩器会扩缩工作负载的副本数量,垂直集群弹性伸缩器 (Cluster Proportional Vertical Autoscaler) 会根据节点和/或核心的数量 调整工作负载的资源请求(例如 Deployment 和 DaemonSet)。

事件驱动型自动扩缩

通过事件驱动实现工作负载的扩缩也是可行的, 例如使用 Kubernetes Event Driven Autoscaler (KEDA)

KEDA 是 CNCF 的毕业项目,能让你根据要处理事件的数量对工作负载进行扩缩,例如队列中消息的数量。 有多种针对不同事件源的适配可供选择。

根据计划自动扩缩

扩缩工作负载的另一种策略是计划进行扩缩,例如在非高峰时段减少资源消耗。

与事件驱动型自动扩缩相似,这种行为可以使用 KEDA 和 Cron scaler 实现。 你可以在计划扩缩器 (Cron scaler) 中定义计划来实现工作负载的横向扩缩。

扩缩集群基础设施

如果扩缩工作负载无法满足你的需求,你也可以扩缩集群基础设施本身。

扩缩集群基础设施通常是指增加或移除节点

阅读集群自动扩缩了解更多信息。

接下来