Kubernetes v1.37:使用HorizontalPodAutoscaler将工作负载缩容至零

💡 原文英文,约1000词,阅读约需4分钟。
📝

内容提要

Kubernetes v1.37将HPA缩容至零副本功能升级为Beta并默认启用,支持基于对象或外部指标(如队列长度)自动缩容至零,再按需扩容。此功能需配合外部指标适配器,通过ScaledToZero条件区分自动缩容与手动暂停,适用于队列消费者等场景,但HTTP工作负载需额外缓冲层。

🔎

延伸解读

适用场景与成本权衡

缩容至零最适合队列消费者、批处理等可容忍冷启动的工作负载,尤其是每个Pod占用昂贵资源(如专用CPU或GPU)时,节省成本显著。但需注意冷启动时间:HPA需观察指标、调度Pod并启动应用。若工作可持久排队等待,则此模式效果最佳。

为何需要外部或对象指标

HPA通常基于CPU或内存使用率,但这些指标来自运行中的Pod。当副本数为零时,无Pod可测量,HPA无法获得扩容信号。对象或外部指标(如队列长度)独立于消费者存在,即使无运行中的Pod,HPA仍可读取并据此扩容。因此,使用此类指标是缩容至零的前提。

手动暂停与自动缩容的区分

手动将Deployment设为0会暂停自动扩缩,HPA不会唤醒它。为区分手动暂停与自动缩容,控制器引入ScaledToZero条件:当HPA将工作负载缩至0时,该条件为True,表示控制器拥有零状态并继续评估指标;若为False,则工作负载保持暂停。可通过kubectl describe hpa查看此条件。

升级与配置注意事项

在版本偏差的控制平面升级期间,需确保kube-apiserver和kube-controller-manager均支持并启用HPAScaleToZero特性,再创建minReplicas: 0的HPA。否则,控制器可能将0副本视为手动暂停。此外,minReplicas: 0要求至少一个对象或外部指标,仅含资源指标的HPA会被API服务器拒绝。

Q&A

Kubernetes v1.37中HPA缩容至零功能有什么新变化?

在Kubernetes v1.37中,HPA缩容至零副本功能升级为Beta并默认启用,无需再启用Alpha特性门控或使用外部组件。现在,使用对象或外部指标的HPA可以直接将工作负载缩容至零副本,并在指标变化时自动扩容。

为什么基于CPU或内存的HPA无法将工作负载缩容至零?

因为CPU和内存指标来自正在运行的Pod,当副本数变为零时,没有Pod可提供指标,HPA无法获得信号来扩容。而对象或外部指标(如队列长度)独立于工作负载存在,即使没有Pod运行,HPA也能持续读取这些指标。

如何配置HPA使用外部指标(如队列长度)进行缩容至零?

首先需要安装外部指标适配器(如Prometheus Adapter),并配置externalRules将指标暴露给External Metrics API。然后创建HPA,在spec.metrics中指定type: External,并设置metric.name和target值。例如,针对队列消费者,可以设置minReplicas: 0,maxReplicas: 10,目标值为30个任务。

HPA缩容至零后,如何区分是自动缩容还是手动暂停?

HPA通过ScaledToZero状态条件来区分。当HPA自动将工作负载从多个副本缩容至零时,会设置ScaledToZero=True;当工作负载被手动设置为零时,该条件不会为True。只有ScaledToZero=True时,HPA才会继续评估指标并可能扩容。

使用HPA缩容至零时,有哪些注意事项或限制?

注意事项包括:需要至少一个对象或外部指标,不能仅使用资源指标;如果指标不可用,HPA无法从零扩容;默认的缩容稳定窗口为5分钟;手动将Deployment设置为零会暂停自动扩缩容;在版本升级期间需确保控制平面组件支持该特性。

HPA缩容至零适用于哪些场景?不适用于哪些场景?

适用于队列消费者、批处理任务等,这些工作负载可以容忍冷启动延迟,且工作项可以持久化等待。不适用于HTTP等请求驱动的工作负载,因为Kubernetes Service不会缓冲请求,需要额外的缓冲层。

Kubernetes v1.37中HPA缩容至零功能的发展历程是怎样的?

该功能最初在v1.16作为Alpha引入,v1.36添加了ScaledToZero条件以区分自动缩容和手动暂停,v1.37将其升级为Beta并默认启用,并增加了集成和端到端测试。下一步是收集反馈以考虑GA。

🏷️

标签

➡️

继续阅读