自动扩缩工作负载
在 Kubernetes 中,你可以根据当前的资源需求来**扩缩**工作负载。这使得你的集群能够更灵活、高效地应对资源需求的变化。
当你扩缩工作负载时,你可以增加或减少工作负载管理的副本数量,或者原地调整副本可用的资源。
第一种方法被称为**水平扩缩**,而第二种方法被称为**垂直扩缩**。
根据你的用例,有手动和自动两种方法来扩缩你的工作负载。
手动扩缩工作负载
Kubernetes 支持**手动扩缩**工作负载。水平扩缩可以使用 `kubectl` CLI 来完成。对于垂直扩缩,你需要**修补**工作负载的资源定义。
请参阅下面的两种策略示例。
- **水平扩缩**:运行应用的多个实例
- **垂直扩缩**:调整分配给容器的 CPU 和内存资源
自动扩缩工作负载
Kubernetes 也支持**自动扩缩**工作负载,这是本页的重点。
Kubernetes 中**自动扩缩**的概念是指自动更新管理一组 Pod(例如 Deployment)的对象的能力。
水平扩缩工作负载
在 Kubernetes 中,你可以使用 **HorizontalPodAutoscaler** (HPA) 自动水平扩缩工作负载。
它作为一个 Kubernetes API 资源和 控制器 实现,并周期性地调整工作负载中的副本数量,以匹配观察到的资源利用率,例如 CPU 或内存使用情况。
有一个关于为 Deployment 配置 HorizontalPodAutoscaler 的演练教程。
垂直扩缩工作负载
Kubernetes v1.25 [稳定]
你可以使用 **VerticalPodAutoscaler** (VPA) 自动垂直扩缩工作负载。与 HPA 不同,VPA 默认不随 Kubernetes 一起提供,而是一个可以在 GitHub 上找到的独立项目。
安装后,它允许你为工作负载创建自定义资源定义 (CRD),这些定义了**如何**以及**何时**扩缩所管理副本的资源。
注意
你需要将 Metrics Server 安装到你的集群中,VPA 才能工作。目前,VPA 可以以四种不同的模式运行
模式 | 描述 |
---|---|
Auto (自动) | 目前为 `Recreate`。未来可能会改为原地更新。 |
Recreate (重建) | VPA 在 Pod 创建时分配资源请求,并通过在请求的资源与新建议显著不同时驱逐现有 Pod 来更新它们。 |
Initial (初始) | VPA 只在 Pod 创建时分配资源请求,之后永不更改。 |
Off (关闭) | VPA 不会自动更改 Pod 的资源需求。建议值会被计算并可在 VPA 对象中查看。 |
Pod 原地垂直扩缩
Kubernetes v1.33 [beta]
(默认启用:true)从 Kubernetes 1.34 开始,VPA 不支持原地调整 Pod 大小,但目前正在进行此集成工作。要手动原地调整 Pod 大小,请参阅原地调整容器资源大小。
基于集群大小的自动扩缩
对于需要根据集群大小扩缩的工作负载(例如 `cluster-dns` 或其他系统组件),你可以使用 **Cluster Proportional Autoscaler**。与 VPA 一样,它不属于 Kubernetes 核心,而是作为其自己的项目托管在 GitHub 上。
Cluster Proportional Autoscaler 监视可调度的节点和核心数量,并相应地扩缩目标工作负载的副本数量。
如果副本数量应保持不变,你可以使用 **Cluster Proportional Vertical Autoscaler** 根据集群大小垂直扩缩你的工作负载。该项目**目前处于测试阶段**,可以在 GitHub 上找到。
虽然 Cluster Proportional Autoscaler 扩缩工作负载的副本数量,但 Cluster Proportional Vertical Autoscaler 会根据集群中的节点和/或核心数量调整工作负载(例如 Deployment 或 DaemonSet)的资源请求。
事件驱动的自动扩缩
还可以基于事件扩缩工作负载,例如使用 **Kubernetes Event Driven Autoscaler** (KEDA)。
KEDA 是一个 CNCF 毕业项目,它使你能够根据要处理的事件数量(例如队列中的消息数量)扩缩你的工作负载。有各种各样的适配器可供选择,以适应不同的事件源。
基于调度计划的自动扩缩
另一种扩缩工作负载的策略是**调度**扩缩操作,例如在非高峰时段减少资源消耗。
类似于事件驱动的自动扩缩,这种行为可以通过 KEDA 及其 `Cron` 扩缩器 来实现。`Cron` 扩缩器允许你定义扩缩工作负载(或缩小)的调度计划(和时区)。
扩缩集群基础设施
如果扩缩工作负载不足以满足你的需求,你还可以扩缩集群基础设施本身。
扩缩集群基础设施通常意味着添加或删除节点。阅读节点自动扩缩以获取更多信息。