自动扩缩工作负载
在 Kubernetes 中,你可以根据当前的资源需求扩缩工作负载。 这让你的集群可以更灵活、更高效地面对资源需求的变化。
当你扩缩工作负载时,你可以增加或减少工作负载所管理的副本数量,或者就地调整副本的可用资源。
第一种手段称为水平扩缩,第二种称为垂直扩缩。
扩缩工作负载有手动和自动两种方式,这取决于你的使用情况。
手动扩缩工作负载
Kubernetes 支持工作负载的手动扩缩。水平扩缩可以使用 kubectl
命令行工具完成。
对于垂直扩缩,你需要更新工作负载的资源定义。
这两种策略的示例见下文。
- 水平扩缩:运行应用程序的多个实例
- 垂直扩缩:调整分配给容器的 CPU 和内存资源
自动扩缩工作负载
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 可以有四种不同的运行模式:
模式 | 描述 |
---|---|
Auto |
目前是 Recreate ,将来可能改为就地更新 |
Recreate |
VPA 会在创建 Pod 时分配资源请求,并且当请求的资源与新的建议值区别很大时通过驱逐 Pod 的方式来更新现存的 Pod |
Initial |
VPA 只有在创建时分配资源请求,之后不做更改 |
Off |
VPA 不会自动更改 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) 中定义计划来实现工作负载的横向扩缩。
扩缩集群基础设施
如果扩缩工作负载无法满足你的需求,你也可以扩缩集群基础设施本身。
扩缩集群基础设施通常是指增加或移除节点。 这可以通过以下两种自动扩缩器中的任意一种实现:
这两种扩缩器的工作原理都是通过监测节点上被标记为 unschedulable 或 underutilized 的 Pod 数量, 然后根据需要增加或移除节点。