kubernetes - 水平 pod Autoscaler 在 GKE 上过于激进地扩展自定义指标
问题描述
我在 Google Kubernetes Engine 上有以下 Horizontal Pod Autoscaler 配置,可以通过自定义指标扩展部署 -RabbitMQ messages ready count
针对特定队列:foo-queue
.
它正确地获取度量值。
插入 2 条消息时,它会将部署扩展到最多 10 个副本。我希望它可以扩展到 2 个副本,因为 targetValue 是 1 并且有 2 条消息准备好了。
为什么它会如此积极地扩展?
HPA 配置:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: foo-hpa
namespace: development
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: foo
minReplicas: 1
maxReplicas: 10
metrics:
- type: External
external:
metricName: "custom.googleapis.com|rabbitmq_queue_messages_ready"
metricSelector:
matchLabels:
metric.labels.queue: foo-queue
targetValue: 1
解决方案
我认为您在解释 HorizontalPodAutoscaler的targetValue
工作原理方面做得很好。但是,根据您的问题,我认为您正在寻找targetAverageValue
而不是targetValue
.
在关于 HPA 的 Kubernetes 文档中,它提到 usingtargetAverageValue
指示 Kubernetes 根据自动缩放器下所有 Pod 公开的平均指标来缩放 Pod。虽然文档没有明确说明,但外部指标(如消息队列中等待的作业数量)计为单个数据点。通过使用 缩放外部指标targetAverageValue
,您可以创建一个自动缩放器来缩放 Pod 的数量以匹配 Pod 与作业的比率。
回到你的例子:
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: foo-hpa
namespace: development
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: foo
minReplicas: 1
maxReplicas: 10
metrics:
- type: External
external:
metricName: "custom.googleapis.com|rabbitmq_queue_messages_ready"
metricSelector:
matchLabels:
metric.labels.queue: foo-queue
# Aim for one Pod per message in the queue
targetAverageValue: 1
将导致 HPA 尝试为队列中的每条消息保留一个 Pod(最多 10 个 Pod)。
顺便说一句,每条消息定位一个 Pod 可能会导致您不断地启动和停止 Pod。如果您最终启动了大量 Pod 并处理队列中的所有消息,Kubernetes 会将您的 Pod 缩减为 1。根据启动 Pod 所需的时间以及处理您的消息所需的时间,您可能通过指定更高的targetAverageValue
. 理想情况下,给定恒定的流量,您的目标应该是让 Pod 处理消息的数量恒定(这要求您以与它们排队的速度大致相同的速度处理消息)。
推荐阅读
- jenkins - Jennkins 无法连接 AWS 账户
- image-processing - 比较编辑前后的两个图像
- java - 什么导致错误****错误:运行ghostscript时为Tz提供的0.0水平文本缩放无效,我该如何解决?
- node.js - nodeJs pkg 模块执行另一个脚本
- bash - Mac OS:尝试在 bash 终端中安装 Vue.js @vue/cli 但它没有运行/找到路径
- html - CSS 按钮在 IOS 上看起来不一样
- mysql - 一般错误:1114 表 '/var/db/mysql_tmpdir/#sql3cac_5b34d_1' 已满 - Magento 2.4.2
- list - Flutter: Remove item for a list reflect another list
- reactjs - ReactJS 路由器未在 URL 中显示页面名称
- kotlin - 通用 JPA 转换器在运行时不知道类型