如何在Microsoft Kubernetes中实现机器学习微服务的自动扩缩容
Kubernetes基于队列长度的AI微服务自动弹性扩缩容实现方案
实现逻辑
该需求属于典型的基于业务自定义指标的水平扩缩容场景,核心是将队列待处理任务数作为HPA(水平Pod自动扩缩容)的判定指标,同时开启缩容到0的支持,即可实现队列空时自动销毁所有冗余Pod。
具体操作步骤
- 第一步:上报队列待处理任务指标
你可以通过Prometheus对接你的消息队列组件(RabbitMQ、Redis、Kafka等),采集待处理请求数量指标,比如Redis队列的redis_list_pending_length、RabbitMQ的rabbitmq_queue_messages_ready,再通过Prometheus Adapter将该指标注册为Kubernetes可识别的自定义指标。
如果你不想自己维护指标采集链路,也可以直接使用KEDA组件,它原生适配了绝大多数主流消息队列的指标采集,无需额外配置Prometheus规则。 - 第二步:配置HPA扩缩容规则
参考如下HPA配置,核心要开启minReplicas: 0,同时配置缩容策略允许一次性缩容到0:apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: ai-microservice-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: your-ai-service minReplicas: 0 maxReplicas: 20 # 按你的业务峰值调整上限 metrics: - type: Pods pods: metric: name: queue_pending_tasks # 替换为你实际注册的队列待处理任务指标名 target: type: AverageValue averageValue: 8 # 按单实例最优并发处理数调整,比如单实例同时处理8个任务最优,就设为8 behavior: scaleDown: stabilizationWindowSeconds: 120 # 队列空2分钟后再触发缩容,避免频繁波动 policies: - type: Percent value: 100 periodSeconds: 60 # 允许一次缩容100%的冗余副本 - 第三步:配置微服务优雅终止逻辑
为了避免缩容时丢弃正在处理的任务,需要做两个配置:- 在Deployment中设置
terminationGracePeriodSeconds: 300,数值大于你的AI任务最长处理时长 - 微服务代码要监听SIGTERM信号,收到信号后停止拉取新的队列任务,处理完当前正在执行的所有任务后再退出进程
- 在Deployment中设置
- 第四步:功能验证
往队列中灌入不同数量的待处理任务,确认Pod副本数会按指标自动扩容;等待所有任务处理完成、队列待处理数为0后,等待缩容窗口时间到,确认冗余Pod会被自动销毁,副本数降至0。
注意事项
- 仅用待处理的队列任务数作为扩缩容指标,不要包含已经被Pod拉取正在处理的任务,否则会导致扩缩容判断不准
- 可以根据业务场景调整扩缩容的稳定窗口时间,削峰填谷避免频繁扩缩容带来的资源浪费
- Kubernetes 1.23及以上版本默认支持HPA缩容到0,更低版本需要提前开启
HPAScaleToZero特性门控
内容的提问来源于stack exchange,提问作者Ayaz Khan
相关产品推荐
相关产品推荐

