在 Kubernetes 中,您可以根据当前的资源需求来扩展工作负载。 这使您的集群能够更灵活、更高效地对资源需求的变化做出反应。
缩放工作负载时,可以增加或减少由工作负载,或就地调整副本可用的资源。
第一种方法称为水平缩放,而第二种方法称为垂直缩放。
- 水平缩放:运行应用的多个实例
- 垂直缩放:调整分配给容器的 CPU 和内存资源的大小
有手动和自动方法可以扩展工作负载,重点是自动方法。
手动扩展工作负载
Kubernetes 支持手动扩展工作负载。可以进行水平缩放使用 kubeclt CLI。 对于垂直缩放,需要 patch 工作负载的资源定义。
自动扩展工作负载
Kubernetes 也支持工作负载的自动缩放,即自动水平缩放和自动垂直缩放。
Kubernetes 中的自动缩放是指自动更新管理一组 Pod 的对象。
水平扩展工作负载
在 Kubernetes 中,可以使用 HorizontalPodAutoscaler (HPA)自动水平缩放工作负载。
它被实现为 Kubernetes API 资源和控制器并定期调整数量副本以匹配观察到的资源利用率,例如 CPU 或内存使用率。
HPA工作流程
垂直扩展工作负载
功能状态: Kubernetes v1.25 [stable]
Kubernetes也支持使用 VerticalPodAutoscaler (VPA) 自动垂直缩放工作负载。但与 HPA 不同的是,VPA 默认不附带 Kubernetes,而是一个单独的项目:
VPA项目地址
https://github.com/kubernetes/autoscaler/tree/9f87b78df0f1d6e142234bb32e8acbd71295585a/vertical-pod-autoscaler。
安装后,可以通过创建CustomResourceDefinitions(CRD),用于定义如何以及何时缩放托管副本的资源。
注意:需要将 Metrics Server 安装到集群中,HPA 才能正常工作。
VPA工作流程:
目前,VPA可以在四种不同的模式下运行:
模式 | 描述 |
Auto | 当前使用Recreate,将来可能会更改为原地更新 |
Recreate | VPA 在创建 Pod 时分配资源请求,并在请求的资源与新建议有显著差异时逐出现有Pod 来更新它们,也就是通过重建Pod方式更新资源 |
Initial | VPA 仅在创建 Pod 时分配资源请求,以后从不更改它们。 |
Off | VPA 不会自动更改 Pod 的资源要求。 |
原地调整大小的限制
功能状态: Kubernetes v1.27 [alpha]
目前在不重新启动的情况下就地调整Pod和容器工作负载的大小需要 Kubernetes 版本 1.27 或更高版本。
此外,还需要启用功能门:InPlaceVerticalScaling。
基于集群大小的自动缩放
对于需要根据集群大小(例如或其他系统组件)进行扩展的工作负载,可以使用集群比例自动缩放器,Cluster Proportional Autoscaler(CPA)。
与 VPA 一样,CPA不是 Kubernetes 核心的一部分,而是作为其在GitHub 上拥有自己的项目:
CPA项目地址
https://github.com/kubernetes-sigs/cluster-proportional-autoscaler。
Cluster Proportional Autoscaler 监视可调度的数量节点并相应地核心和缩放目标工作负载的副本数。
如果副本数应保持不变,则可以使用以下命令根据群集大小垂直扩展工作负载 Cluster Proportional Vertical Autoscaler。 该项目目前处于测试阶段。
当群集比例自动缩放程序缩放工作负载的副本数时,群集比例垂直自动缩放程序根据节点或核心的数量调整工作负载(例如 Deployment 或 DaemonSet)的资源请求在群集中。
事件驱动的自动缩放
还可以根据事件扩展工作负载,例如使用 Kubernetes 事件驱动的自动缩放程序 (KEDA)。
KEDA 是一个轻量级的开源 Kubernetes 事件驱动的自动缩放器,DevOps、SRE 和 Ops 团队使用它来根据外部事件或触发器水平扩展 Pod。KEDA 有助于扩展本机 Kubernetes 自动缩放解决方案的功能,这些解决方案依赖于标准资源指标,如 CPU 或内存。您可以将 KEDA 部署到 Kubernetes 集群中,并使用自定义资源定义 (CRD) 管理 Pod 的扩展。
KEDA 是 CNCF 毕业项目,能够根据要处理的事件数数量扩展工作负载,例如队列中的消息数。存在多种适配器可供选择,供不同的事件源使用。
基于计划的自动缩放
扩展工作负载的另一种策略是计划扩展操作,例如,为了减少非高峰时段的资源消耗。
与事件驱动的自动缩放类似,这种行为可以结合使用 KEDA 和 它的 Cron 缩放控制器,允许您定义计划,用于向内或向外扩展工作负载。
扩展群集基础结构
如果扩展工作负载不足以满足你的需求,您还可以扩展群集基础结构本身。
扩展群集基础结构通常意味着添加或删除节点. 这可以使用以下两个可用的自动缩放程序之一来完成:
- Cluster Autoscaler
- Karpenter
两个扩展器的工作方式都是监视标记为不可调度或未充分利用的节点,然后根据需要添加或删除节点。
总结
Kubernetes 中的自动缩放是指自动更新管理Pod的工作负载,然后工作负载最终更新Pod定义来实现自动缩放。主要有以下几种方案:
- HPA:水平缩放,扩缩容Pod实例数量
- VPA:垂直缩放,扩缩容Pod中容器的cpu或mem资源
- CPA:比例缩放,根据集群大小按比例进行HPA
- KEDA:事件驱动缩放,根据外部事件或触发器水平扩展 Pod
- 集群节点缩放:据需要添加或删除集群中的worker节点