KEDA + HPA:基于消息队列长度的 Kubernetes 自动伸缩实战

智能扩缩容:KEDA事件驱动自动伸缩实战 智能扩缩容:KEDA事件驱动自动伸缩实战 本文提出基于KEDA的事件驱动自动伸缩方案,解决传统HPA仅基于CPU/内存指标的局限性。通过监听Kafka/RabbitMQ等消息队列的积压情况(如配置lagThreshold: "100"),实现精准扩容。测试显示KEDA在万级消息积压场景下扩容延迟仅18秒(传统HPA需4分钟),资源利用率提升至82%,成本降低30%。文章详细介绍了KEDA的架构原理、核心配置方法,并通过电商、金融等实际案例验证其性能优势,提供从部署到优化的全链路解决方案。 阅读详情

不管你是刚把微服务迁到云上的 K8s 集群,还是已经跑了好几年的业务,MQ 消息积压这个坑,早晚会踩到。高峰期生产者一顿猛灌,消费者处理不过来,队列肉眼可见地涨,业务延迟拉满,下游定时任务越积越多,最后变成雪崩。常规做法是人工看监控、手动扩容,或者干脆把所有消费者实例常年拉满,成本高不说,半夜也得起来处理。

我这边实际落地过的方案是用 K8s 的 HPA 配合 KEDA(Kubernetes Event-driven Autoscaling),以 MQ 队列长度作为伸缩信号,自动调整消费者副本数,消息积压时快速扩容,队列清空后自动缩容。这套方案跑下来,基本告别了"半夜盯着 RabbitMQ 看板手动加副本"的日子。这篇文章会把我的配置、参数调优思路和踩过的坑全部写出来,适合 K8s 运维、中间件负责人,以及正在做微服务弹性伸缩改造的开发者参考。

1. 消息积压场景与 HPA 的天然短板

1.1 消息积压是怎么发生的

先复盘一下消息积压最常见的几个触发点,这样后面调参的时候你才知道自己重点该防哪一个。

第一类是上游流量突增。电商秒杀、批量数据导入、第三方回调风暴,任何一次流量尖峰都会让生产速率在短时间内超过消费速率。第二类是消费者下游依赖变慢。这不是消费者代码本身慢,而是消费者要查的数据库、要调的下游接口变慢了,比如数据库连接池满了、某个第三方 API 响应从 50ms 变成 3s,消费者 pod 的 CPU 可能很低,但每条消息的处理时间直线上升,积压就开始了。第三类是消费者实例数固定,根本没有弹性能力。这其实是最常见的,很多团队上线时就把 Deployment 的 replicas 写死成 3 个,平时够用,一旦流量上来只能干瞪眼。

消息积压的危害不用多说:实时业务延迟变高,积压的数据会占队列内存或磁盘,重试机制可能造成重复消费,最终触发下游的限流和熔断,引发更大范围故障。所以"发现积压后自动扩容"这个能力,不是锦上添花,而是生产环境的刚需。

1.2 传统 HPA 为什么救不了 MQ

很多朋友第一反应是:K8s 自带 HPA,为什么不直接用?HPA 确实能自动扩缩容,但它解决的是 CPU 和内存这类资源指标问题,对 MQ 场景属于"天生迟钝"。

举个实际例子。消费者从 RabbitMQ 拉消息,然后写数据库,瓶颈是数据库连接池而不是 CPU。这时候消费者 pod 的 CPU 使用率可能只有 20%,内存也正常,HPA 一看指标没超阈值,坚决不扩容。而队列里的消息已经堆积了几十万条,消费者处理速度完全跟不上。HPA 看不到队列长度,也就不知道正在发生事故。

就算你给它配了自定义指标,HPA 本身也没有内置 MQ 的采集能力。你需要额外部署 Prometheus Adapter 之类的组件,自己写查询把队列长度暴露成 metrics,再把 metrics 转成 HPA 能消费的外部指标。这一套配置链路过长,维护成本不低,而且不同 MQ 的指标语义差别很大,每次接入新队列都得重写一遍。我当年手工搭过一次,光是调 PromQL 和 HPA metricName 对应关系就折腾了两天。

更关键的是,HPA 原生策略里没有"从 0 扩到 1"这种突发场景的良好处理。假如你的消费者服务在无消息时可以缩到 0,那么消息进来后需要先创建 Pod、拉镜像、启动应用,这个过程可能要 1 分钟甚至更久,HPA 默认是做不到在无负载时把副本降到 0 再快速拉起的。

所以结论很明确:消息积压这类事件驱动场景,需要的是能感知事件源的伸缩器,而不是只看资源使用率的传统 HPA。KEDA 就是干这个的。

2. KEDA 架构与伸缩原理

2.1 KEDA 的核心组件

KEDA 是目前社区里最成熟的 Kubernetes 事件驱动自动伸缩方案,它是 CNCF 项目,定位就是"Event-driven autoscaling"。它不是要替代 HPA,而是给 HPA 装上"外部事件源的眼睛",让 HPA 能够根据 RabbitMQ 队列深度、Kafka 消费滞后量、Prometheus 指标、数据库连接数等事件信号来决定副本数。

KEDA 的架构中有三个关键角色:

  • Operator :负责监听 ScaledObject 和 ScaledJob 自定义资源。集群里创建 ScaledObject 后,Operator 会自动生成一个对应的 HPA 对象,并负责管理整个伸缩器的生命周期。
  • Metrics Adapter :实现 Kubernetes 的 External Metrics API,把各种外部事件源的指标统一暴露给 HPA。HPA 定时从 external.metrics.k8s.io 这个 API 拉取指标,然后计算期望副本数。
  • Scaler :是 KEDA 连接具体事件源的插件层。KEDA 内置了 50 多种 scaler,从 RabbitMQ、Kafka、Redis、MySQL 到 Prometheus、AWS SQS,基本覆盖了主流的消息系统和中间件。

当你创建 ScaledObject 之后,KEDA 的 Operator 会在同一个命名空间帮你生成一个名为类似 keda-hpa-<scaledobject-name> 的 HPA,你直接 kubectl get hpa 就能看到。这就是"KEDA 驱动 HPA"的直观体现:KEDA 负责感知事件源,HPA 负责执行 K8s 层面的扩缩容。

2.2 KEDA 的伸缩模型:从 HPA 到 ScaledObject

理解 KEDA 的伸缩模型,核心是抓住几个概念:触发器(Trigger)、轮询间隔(pollingInterval)、冷却时间(cooldownPeriod)、副本上下限(minReplicaCount / maxReplicaCount)以及激活阈值(activationThreshold)。

KEDA 的 Scaler 会按照 pollingInterval 周期性地去查询事件源,比如每隔 15 秒查一次 RabbitMQ 的指定队列当前有多少条消息。如果队列长度超过了你设定的 value,KEDA 就会通过外部指标 API 告诉 HPA"指标超了",HPA 计算期望副本数并扩容。当队列长度回落后,KEDA 继续上报低指标,HPA 会等待 cooldownPeriod(冷却时间),确保消息确实清完了,再逐步缩容。

这里有个关键点很多人第一次接触容易搞混:KEDA 并不是自己直接改 Deployment 的副本数,它做的是"指标搬运工 + 伸缩策略管家",最终伸缩动作还是由 HPA 执行。这样设计的好处是,你仍然可以享受 HPA 自带的各种保护机制,比如扩容限速、缩容稳定窗口,也可以通过 ScaledObject 的高级配置透传 HPA 的 behavior 策略。

你可以把 KEDA 理解成一个"哨兵":它盯着 MQ 队列的长度,一旦超过阈值,就告诉 HPA 该加人了;等队列清空了,再告诉 HPA 可以休息了。这个模型非常直观,也容易排查问题。

3. 从零跑通一套 KEDA + RabbitMQ + 消费者方案

3.1 部署环境与组件安装

为了让你能直接复现,我以 Kubernetes 1.26 集群为例,消息中间件用 RabbitMQ。KEDA 官方建议 K8s 1.21 以上,集群版本如果太老,外部指标 API 的支持会有差异。

第一步,安装 KEDA。我用 Helm 安装,命令如下:

helm repo add kedacore https://kedacore.github.io/charts
helm repo update
kubectl create namespace keda
helm install keda kedacore/keda --namespace keda

安装完查一下 Pod 状态:

kubectl get pods -n keda

正常情况下应该有 keda-operator 、 keda-metrics-apiserver 等 Pod 处于 Running。然后检查外部指标 API 是否注册成功:

kubectl get apiservice | grep -E "metrics|keda"

如果看到类似 external.metrics.k8s.io/v1beta1 的 APIService,就说明 KEDA 的 Metrics Adapter 已经注册成功,HPA 之后可以查询到由 KEDA 暴露的外部指标。

接下来部署 RabbitMQ。为了测试方便,我直接通过 Helm 装到集群内:

helm repo add bitnami https://charts.bitnami.com/bitnami
helm install rabbitmq bitnami/rabbitmq --namespace default \
  --set auth.username=admin \
  --set auth.password=admin123

等 RabbitMQ 的 Pod 启动后,创建一个测试队列 task_queue。可以用 kubectl exec 进去操作:

kubectl exec -it rabbitmq-0 -- bash
rabbitmqadmin declare queue name=task_queue durable=true

我在实际生产里 RabbitMQ 一般是独立部署在集群外的,KEDA、消费者和生产者通过同一个 AMQP 地址访问,原理完全一样。

3.2 消费者服务与基础部署

现在需要有一个消费者服务。我这里用一个 Spring Boot 应用的镜像做例子,逻辑很简单:从 task_queue 拉取消息,模拟每条消息处理耗时 200ms,然后手动确认(ack)。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mq-consumer
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mq-consumer
  template:
    metadata:
      labels:
        app: mq-consumer
    spec:
      containers:
      - name: consumer
        image: harbor.local/app/mq-consumer:1.0.0
        resources:
          requests:
            cpu: 200m
            memory: 256Mi

这里必须给 Pod 配置 resources.requests,因为 HPA 在计算副本数时依赖 Pod 的 resource 信息,而且没有 requests 的 Pod 在缩容时可能会被 scheduler 直接驱逐,行为很别扭。

为了让 HPA 能够基于 MQ 队列长度扩缩容,我们需要创建一个 KEDA 的 authentication 对象,把 RabbitMQ 的连接串交给 KEDA,让 KEDA 可以通过管理接口查询队列状态。

先在 K8s 里创建 Secret 存连接串:

kubectl create secret generic rabbitmq-secret \
  --from-literal=host=amqp://admin:admin123@rabbitmq.default.svc.cluster.local:5672/

然后创建 TriggerAuthentication:

apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
  name: keda-rabbitmq-auth
spec:
  secretTargetRef:
  - parameter: host
    name: rabbitmq-secret
    key: host

3.3 创建 ScaledObject:让队列长度驱动消费者副本数

接下来就是最核心的一步,创建 ScaledObject,把 RabbitMQ 的 task_queue 和消费者 Deployment 绑定起来。

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: rabbitmq-scaledobject
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: mq-consumer
  minReplicaCount: 1
  maxReplicaCount: 20
  pollingInterval: 15
  cooldownPeriod: 60
  triggers:
  - type: rabbitmq
    metadata:
      protocol: amqp
      queueName: task_queue
      mode: QueueLength
      value: "10"
      activationThreshold: "1"
    authenticationRef:
      name: keda-rabbitmq-auth

创建完立刻看一下 HPA:

kubectl get hpa

KEDA 会自动生成一个 HPA 对象,名称类似 keda-hpa-rabbitmq-scaledobject ,它的 Metrics 列会显示一个外部指标,比如 external/rabbitmq-queue-task_queue 。到现在为止,整套弹性伸缩链路已经打通。

我实际第一次验证的时候,看到 HPA 列表里出现 external 类型指标,还是很兴奋的——这意味着队列长度已经真正变成了 K8s 的伸缩决策依据。至于参数为什么这么配、每个字段的含义,接下来详细说。

4. ScaledObject 配置参数与调优细节

4.1 触发器参数背后的语义

很多第一次接触 KEDA 的人会被 triggers 里的 metadata 搞晕,特别是 RabbitMQ 这个 scaler,参数组合比较多。我按实际使用频率逐个拆解。

先看 mode ,RabbitMQ scaler 支持几种模式,最常用的是 QueueLength 、 MessageRate 和 MessagesUnacked 。

  • QueueLength :表示队列中的消息总数。这是最直观的积压指标,也是我线上主要使用的模式。
  • MessageRate :表示消息的流入传出速率,需要结合 value 来控制水位,适合对吞吐速率有明确预期的场景。
  • MessagesUnacked :表示未被确认的消息数。如果消费者是手动 ack 模式,拿到消息但处理中未确认的消息都会被算进去,这个指标能反映"消费者手里正在处理的积压量"。

我们主要说 QueueLength。 value 字段的含义是"每个副本的平均目标队列长度"。也就是说,如果 value 设为 10,当前有 1 个消费者副本,队列里有 100 条消息,HPA 计算出的期望副本数是: ceil(100 / 10) = 10 。反过来,随着消费者扩容,队列长度下降,期望副本数也会随之回落。

这里有个容易误解的地方: value 并不是说"每条消息允许延迟 10 秒"之类,而是 HPA 目标水位。你要结合单副本消费能力和积压容忍度来设。比如你的消费者单副本每秒可以处理 50 条消息,积压 500 条也就 10 秒能清完,那 value 可以设大一点,比如 50;如果业务对延迟非常敏感,希望队列里基本没有积压,那 value 就设小一点,比如 5 或者 10。设太小也有风险,会因为消息波动频繁触发扩容,HPA 反复跳动,反而影响稳定性。

activationThreshold 是近几年 KEDA 版本里才用得比较顺手的一个参数。它的作用是:当消息量低于这个激活阈值时,KEDA 会向 HPA 上报一个 0 值,HPA 就不会因为"队列里还有 1 条消息"这种小事去扩容。比如设置 activationThreshold: "1" ,那么队列里只有 1 条消息时不会扩容;超过 1 条才开始正常计算。这个参数对防止毛刺缩放非常有用。

4.2 pollingInterval 与 cooldownPeriod 如何权衡

pollingInterval 默认是 30 秒,cooldownPeriod 默认是 300 秒(5 分钟)。这两个参数我花了不少时间调优,说点实际经验。

pollingInterval 影响的是 KEDA 检查队列长度的频率。如果你希望 30 秒内就感知到积压并开始扩容,可以把 pollingInterval 调到 10~15 秒。但也要注意,pollingInterval 太短会对 MQ 的管理接口造成压力,尤其是队列数量多、集群大的时候,RabbitMQ 的 management API 本身也有性能开销。15 秒是一个比较稳妥的中间值,线上如果积压发生得非常突然,再调成 5~10 秒。

cooldownPeriod 是 HPA 判断"可以缩容"之前必须等待的时间窗口。默认 300 秒的好处是避免流量抖动时副本数反复横跳。但如果你把 cooldownPeriod 设成 300 秒,高峰期结束后队列已清空,消费者却还要保持 20 个副本跑 5 分钟,这就有点浪费。我实际调优下来,一般把 cooldownPeriod 设置为 60~120 秒。比如上述配置里我写的是 60 秒,因为我们的消费者扩容后很快能把队列消费完,同时也希望能在短时间内回收资源。

需要注意,缩放方向如果配置不当,会出现"刚扩容完,又立刻缩容"的抖动。建议配合 advanced.hpaConfig.behavior 来控制扩容和缩容的速度节奏,这在后面生产环境章节会讲到。

4.3 副本上下限与从 0 扩容的适配

minReplicaCount 和 maxReplicaCount 的意义不问可知,但有几个细节要特别提醒。

第一, minReplicaCount=0 是 KEDA 的招牌能力之一,但它并不适合所有业务。如果你的消费者应用是无状态的,启动很快,消费逻辑可以容忍消息延迟几分钟,那 min=0 确实能节省大量资源。但如果你的消费者是 Java 应用,启动要几十秒甚至更久,或者业务对消息延迟有严格要求,我不建议设成 0。因为消息进来后 Pod 要从 0 开始创建,冷启动时间会直接变成消息延迟,用户可感知的延迟一下就上去了。

第二,当你设置 minReplicaCount=0 时, activationThreshold 尤其重要。如果没有 activationThreshold,队列里出现 1 条消息就可能触发 KEDA 创建 Pod,高频低量的消息流会导致 Pod 频繁创建和销毁,增加不稳定性。

第三,maxReplicaCount 不是越大越好。扩容后每个消费者 Pod 都会建立到 RabbitMQ 的 AMQP 连接、持有数据库连接池、占用下游服务资源。我曾经在一次压测里把 maxReplicaCount 设成 30,结果 30 个消费者同时起来,RabbitMQ 的 connection 直接被占满,下游数据库连接池也被打爆。所以 maxReplicaCount 一定要结合下游依赖的承载能力来评估,而不是只看队列积压的严重程度。

4.4 KEDA 生成的 HPA 与原生 HPA 的关系

这里有个很容易踩的坑:KEDA 创建 ScaledObject 后会自动生成一个 HPA,如果你自己再手动给同一个 Deployment 创建一个 HPA,两个 HPA 会同时作用于副本数,互相覆盖,表现就是副本数一会儿 3 个一会儿 10 个,完全失控。

KEDA 自动生成的 HPA 名字规律是 keda-hpa-<scaledobject-name> ,你可以通过 kubectl get hpa -l keda 之类的方式查看。在排查问题的时候,优先看这个 HPA 的事件和指标,不要自己另建。

另外,KEDA 的 HPA API 版本问题也值得注意。较新版本的 KEDA 会自动使用 autoscaling/v2 的 HPA,因此你在 kubectl get hpa 里看到的列名、行为策略配置都会更丰富。如果集群版本较老,可能需要手动指定 advanced 配置来适配。

5. 生产环境中的常见问题与排查经验

5.1 缩到 0 再扩容的冷启动问题

前面说了 minReplicaCount=0 可以省钱,但实际生产里我遇到最典型的问题是:消息到来时消费者从 0 到 Ready 需要时间,这个窗口期队列积压持续增加,一旦消费者 Ready 后需要处理的消息量远超单副本能力,HPA 又要进行新一轮扩容,整个系统的"爬坡"过程会显得很慢。

我这里给一个比较有效的组合拳:设置合理的 readinessProbe,让新 Pod 在真正能消费消息之前不要进入 Ready 状态,避免流量被错误的调度;同时把 minReplicaCount 设成 1 而不是 0,如果业务对延迟不敏感可以设 0,但必须接受冷启动时间作为消息延迟的一部分。

如果你的服务支持优雅缩容,比如消费者在处理完当前消息后才退出,那配合 cooldownPeriod 和 HPA 的缩容稳定窗口,可以做到几乎无损缩容。这里我建议对消费者设置 preStop hook 和终止前等待时间,让 K8s 在终止 Pod 之前给消费者留出处理完正在处理消息的时间。

5.2 扩容太猛导致下游被打爆

消息积压严重时,KEDA 会驱动 HPA 快速扩容,这个"快速"有时候会把下游直接打挂。我这边压测时出现过一次事故,队列积压了 8 万条,maxReplicaCount 设了 20,HPA 一口气把副本数拉到了 20,20 个消费者同时去消费,数据库连接池瞬间被打满,原本 100ms 的 SQL 查询变成了 3s,消费不仅没有加速,积压反而更严重了。

复盘后的结论是:必须给 HPA 的扩容速度上一把锁。KEDA ScaledObject 支持透传 HPA 的行为策略,可以在 advanced.hpaConfig.behavior 里限制扩容步长。

spec:
  advanced:
    hpaConfig:
      behavior:
        scaleUp:
          stabilizationWindowSeconds: 0
          selectPolicy: Max
          policies:
          - type: Pods
            value: 3
            periodSeconds: 30
        scaleDown:
          stabilizationWindowSeconds: 120

这个配置的含义是:每 30 秒最多新增 3 个副本,缩容前至少稳定观察 120 秒。这样即使积压很严重,系统也会以可控的速度逐步扩容,给下游足够的缓冲时间。

有人会问,扩容慢了积压怎么办?我的思路是:积压严重时,扩容速度的下限比上限重要。只要你每 30 秒能新增几个副本,整体消费能力是在提升的,积压最多多持续几十秒,但下游不会被击穿。这是两害相权取其轻。

5.3 从 HPA 状态与 KEDA 日志排查故障

如果发现弹性伸缩没有生效,先不要慌,按顺序排查。

第一步,看 HPA 状态和事件:

kubectl get hpa
kubectl describe hpa keda-hpa-rabbitmq-scaledobject

重点看 AbleToScale 、 ScalingActive 、 ScalingLimited 这几个 Condition。如果 ScalingActive 是 False,说明 HPA 拉不到指标,问题大概率出在 KEDA scaler 与 MQ 的连接上。

第二步,看 KEDA Operator 日志:

kubectl logs -n keda deployment/keda-operator

KEDA Operator 会打印 scaler 连接失败、指标查询失败等细节。常见的报错有 Unauthorized、connection refused、queue not found 等。

第三步,验证外部指标 API 是否正常返回:

kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/rabbitmq-queue-task_queue?labelSelector="

这个命令能直接看到 KEDA 查询到的队列消息数,如果这里返回空或者报错,问题基本锁定在配置层。

我实际排查过一个案例:RabbitMQ 队列在 vhost / 下,但 AMQP 连接串里带了错误的 vhost 路径,导致 KEDA 虽然能连上 RabbitMQ,却查不到目标队列的消息数,HPA 一直显示 unknown 。后来把 vhost 转换为 URL 编码形式填进 host 参数,问题解决。RabbitMQ 的连接串对特殊字符非常敏感,尤其是 vhost 名称带 / 、密码带 @ 或 : 时,务必做 URL encode。

5.4 Kafka 场景下的参数差异

如果你用的是 Kafka,KEDA 的 scaler 配置和 RabbitMQ 稍有不同。Kafka 场景下最常用的指标是 Consumer Group 的 Lag(消费滞后量)。

triggers:
- type: kafka
  metadata:
    topic: orders
    bootstrapServers: kafka-cluster-kafka-bootstrap.kafka:9092
    consumerGroup: order-consumer-group
    lagThreshold: "50"

这里的 lagThreshold 语义上是"每个分区的目标滞后量"还是"总滞后量",不同版本略有差异。实测下来我一般按"lag 总量/分区数"来理解。Kafka 的 Lag 指标依赖消费者组实时提交 offset,如果消费者处理慢、offset 提交也慢,HPA 拿到的 lag 数据可能会偏大。

Kafka 场景下还要注意:KEDA 的 kafka scaler 默认使用 Sarama 库访问 Kafka,如果在 TLS/SASL 环境里,记得通过 authenticationRef 传入 sasl 和 tls 相关配置。我之前在开启 SASL 认证的 Kafka 集群上忘了配认证信息,KEDA 日志里反复出现 "kafka: client has run out of available brokers"。

5.5 手动压测验证伸缩效果

整套环境搭建好后,我建议做一次手动压测来验证效果,不要直接等线上流量验证。这里分享一个简单的验证链路。

先观察当前副本数:

kubectl get deployment mq-consumer

然后向 RabbitMQ 发布一批测试消息。可以用 RabbitMQ 的管理插件,也可以用一个小脚本循环发消息,比如向 task_queue 发 5000 条。

发布完成后,立刻观察 HPA 和 Pod 数量:

kubectl get hpa -w
kubectl get pods -w

正常情况下,15 秒左右 KEDA 就能查到队列消息数超过阈值,HPA 计算期望副本数并扩容。如果队列积压 5000 条、value 设为 10,理论期望副本数是 500,但 maxReplicaCount 是 20,所以 HPA 会直接拉满到 20。之后消费者处理完消息,队列长度逐步下降,缩容会延迟 cooldownPeriod 60 秒后开始。

我这边压测的典型曲线是:队列积压 2 万条时,HPA 从 1 个副本直接涨到 20 个副本,耗时约 1 分钟;消费完成后第 60 秒开始缩容,约 5 分钟回到 1 个副本。整个过程中,RabbitMQ 的连接数从 1 个涨到 20 个,对 RabbitMQ 本体的压力很小,但数据库连接池是明显吃紧的,这也是我后面加扩容限速的原因。

6. 从这套方案延伸出去的几点思考

KEDA 能做的远不止 MQ 消息积压这一件事。它内置了 50 多种 scaler,意味着任何你能想到的事件源,都可能成为 K8s 伸缩的"信号源"。

比如,Webhook 服务可以用 HTTP 请求速率作为伸缩依据;定时任务可以用 Cron 表达式在业务低峰期把消费者缩到 0;数据库连接池指标、Redis 列表长度、Prometheus 告警、甚至是你自己的自定义 HTTP API,都可以接入。只要你能把业务指标暴露成一个数字,KEDA 就有办法把它变成 HPA 的伸缩依据。

我在实际落地这套方案的时候,有一个比较深的体会:弹性伸缩这件事,核心不在"自动扩缩容"这个动作本身,而在于你选择哪个指标作为伸缩信号,以及这个指标能不能真实反映系统的处理压力。CPU 和内存是间接指标,MQ 队列长度才是直接反映积压状态的信号。选对了信号源,自动伸缩才有意义。

如果你也遇到了类似的消息积压问题,不妨先用最简单的 RabbitMQ scaler 跑通链路,再逐步切换到生产环境做参数调优。刚开始不要贪多,把 pollingInterval、cooldownPeriod、value、maxReplicaCount 这几个参数在压测环境里跑出感觉,再上生产。这套方案我已经跑了大半年,最大的好处是你不需要再盯着监控看板做手工扩容了,可以把精力花在真正需要人判断的事情上。

python实现语音信号的分帧、加窗、预处理 语音信号实现分帧、加窗、预处理音频文件读取预加重分帧加窗 音频文件读取 librosa是非常强大的python语音信号处理库。 读取音频: 使用语句librosa.load(path, sr=22050, mono=True, offset=0.0, duration=None)读取音频文件,默认的采样率是22050,若要保留音频的原始采样率,使用sr=None。 其中: path:表示音频文件的路径 sr:表示采样率 mono:bool,是布尔类型,表示是否将信号转换为单声道 offset:float,后 阅读详情

相关推荐

魔兽RPG老地图逆向工程:解密三国列传3.0武将招募限制(附JASS实战)

本文详细解析了《三国列传3.0》魔兽RPG地图的武将招募限制机制,通过逆向工程和JASS脚本修改技术,突破SLK加密防线并解密游戏逻辑。文章提供了从工具准备到代码修改的完整实战指南,帮助玩家解除武将数量限制,重温经典游戏的乐趣。

i1j2k的博客 352

华为云kubernetes基于keda自动伸缩deployment副本(监听redis队列长度)

keda监听redis队列伸缩deployment副本

nangonghen的博客 1360

centos8 安装新版bind9源码

bind一直在更新,使用了比较多的新架构 本文记录新版本的bind怎么安装,以及其依赖库的安装 1. 在https://www.isc.org/download/ 下载最新stable版本bind,本文以bind-9.17.9.tar.xz为例。将软件传到/root目录下。 也可以到https://ftp.isc.org/isc/bind9/ 下载更多历史版本 2. 安装基本的依赖库,像gcc、amake等 3. 需要安装libuv库,但直接用yum时可能安装不全 建议使用源码安装,需要安..

linggang_123的博客 2530

基于KEDA的Kubernetes自动缩放机制

虽然Kubernetes提供了内置的自动缩放功能,但Kubernetes事件驱动自动缩放(KEDA, Kubernetes Event-driven Autoscaling)项目提供了更强大的解决方案来增强和扩展自动缩放功能。你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。: 配置KEDA支持自动缩放。

残星说梦话 1339

命令行驱动视频剪辑:cutcli与AI自动化工作流实战

在视频内容创作领域,自动化与批量化处理是提升生产效率的关键。传统图形界面工具在应对重复性任务时往往效率低下,而通过命令行接口(CLI)驱动视频生成,则能实现流程的程序化控制。其技术原理在于将视频结构抽象为可编程的指令序列,通过解析命令生成标准化的工程文件。这种模式的核心价值在于将视频制作从手动操作转变为代码驱动,特别适合与AI编程助手集成,实现自然语言到视频草稿的自动转换。应用场景广泛覆盖社交媒体内容批量生产、教育视频自动化生成、数据可视化视频组装等领域。本文以cutcli工具为例,深入解析如何通过命令行与

weixin_42520239的博客 565

audio框架学习-Audio_Flinger分析

文章目录一、代码位置二、audio服务启动2.1 main服务2.2 audioflinger添加到系统服务中2.3 audioflinger的对外接口 之前记录过audioTrack的笔记,这次继续参考audioFlinger相关的代码并做笔记; 参考文档:https://www.cnblogs.com/innost/archive/2011/01/15/1936425.html和https://blog.csdn.net/zyuanyun/article/details/60890534?spm=100

永不秃头的程序员的博客 2131

KEDA (Kubernetes Event-driven Autoscaling) 替换或增强原生 HPA 带来更精细、更强大的事件驱动弹性

KEDA在SaaS算力集群中可增强HPA功能,提供事件驱动的弹性伸缩能力。核心优势包括:支持数十种外部指标触发器(如消息队列、定时任务)、缩容至零节省成本、自动管理HPA对象,并适用于Job和Deployment。集成步骤包括通过Helm安装KEDA、定义ScaledObject/ScaledJob配置触发器参数,并验证扩缩容行为。实践注意事项涉及HPA生命周期管理、冷启动优化、权限控制和监控告警设置。KEDA能实现更精准的弹性伸缩,优化资源成本并提升负载应对能力。

技术引领业务创新 952

别再只盯着版图画了!聊聊CMOS工艺里那个‘看不见的手’:STI应力(LOD效应)对模拟电路的实际影响

本文深入探讨了CMOS工艺中STI应力(LOD效应)对模拟电路设计的实际影响,揭示了这一隐形变量如何导致电流镜匹配偏差等常见问题。通过分析应力产生的物理机制、空间分布特性,以及提供伪器件设计、版图布局优化等实用解决方案,帮助工程师有效管理STI应力效应,提升电路性能。文章还探讨了FinFET工艺下的新挑战及机器学习在应力优化中的应用前景。

weixin_42656416的博客 351

Kubernetes HPA与KEDA实现消息队列弹性伸缩实践

消息队列(MQ)作为分布式系统的关键组件,通过解耦生产者和消费者实现流量削峰。传统固定资源分配方式难以应对突发流量,而Kubernetes的弹性伸缩能力为此提供了解决方案。HPA(Horizontal Pod Autoscaler)结合KEDA(Kubernetes Event-driven Autoscaler),通过实时监控MQ队列深度,动态调整消费者Pod数量,实现资源的高效利用。这种方案特别适用于金融支付和电商秒杀等高并发场景,能显著减少消息积压时间并节省计算资源。本文深入解析HPA与KEDA的协同

weixin_30431445的博客 193

android11-修改屏幕显示方向和触摸方向

参数0表示12点钟方向显示参数90表示3点钟方向显示参数180表示6点钟方向显示参数270表示9点钟方向显示。

Paper_Love的博客 2112

MATLAB与ROS联合仿真——控制类功能模块介绍

MATLAB与ROS联合仿真——控制类功能模块介绍

慕羽★的博客 2350

Kubernetes HPA与KEDA实现MQ消费者弹性伸缩实战

消息队列(MQ)作为分布式系统解耦的核心组件,其消费者端的弹性伸缩能力直接影响系统稳定性与资源利用率。Kubernetes原生HPA基于CPU/内存指标实现工作负载伸缩,而KEDA扩展了这一能力,通过事件驱动机制对接RabbitMQ、Kafka等消息中间件。该方案通过实时监控队列深度,动态调整消费者Pod数量,在保障消息处理时效性的同时优化资源成本。典型应用场景包括电商秒杀、日志处理等存在明显波峰波谷的业务,配合Kubernetes集群自动扩缩容可实现全栈弹性。实践中需关注指标采集延迟、Pod启动耗时等关键

weixin_32288959的博客 233

手把手入门YOLO到改进优化教程 | 【P6进阶篇】YOLOv8模型剪枝优化实战-LAMP剪枝

本节首先介绍LAMP剪枝相关理论。然后结合YOLO框架,手把手搭建剪枝工程,包括配置文件修改、剪枝脚本构建等内容。

嵌入式阿齐Archie 2万+

从 HPA 到 KEDA:Kubernetes 弹性伸缩的进阶实践

本文从 HPA 的扩缩容算法与抑制策略讲起,再到自定义指标与 Metrics API,最后引入事件驱动的 KEDA,把「应用层 HPA/KEDA → 指标层 Metrics API → 事件层 Scaler → 节点层 Cluster Autoscaler」四层协同的生产弹性体系完整串起来。

技术引领业务创新 406

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

第十八篇:《自动伸缩:HPA、VPA、KEDA(下)——事件驱动伸缩 KEDA》

HPA 基于 CPU/内存或自定义指标伸缩,但很多场景的负载并非由资源使用驱动,而是由外部事件触发:消息队列积压、定时任务到来、Kafka 主题的消息数量激增。KEDA(Kubernetes Event-Driven Autoscaler) 专门解决这类问题,它能够根据事件源(如 RabbitMQ、Kafka、Redis、AWS SQS)的指标驱动 Pod 伸缩,甚至支持缩容到 0。KEDA 不是 HPA 的替代品,而是HPA 的补充和增强——它充当事件源与 HPA 之间的桥梁。

qq_45239623的博客 465

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Kubernetes HPA弹性伸缩完全指南:自定义指标与预测式扩容在电商大促中的实战应用

HPA弹性伸缩的深度应用,核心不在于配置参数本身,而在于指标选择、策略分段和稳定性调优三者的配合。自定义指标将HPA的感知能力从资源层延伸到业务层;三段式扩缩策略解决了大促场景下被动响应的滞后问题;行为参数(behavior字段)的精细控制则避免了扩缩振荡。从工程实践看,最容易被忽略但影响最大的参数是。在许多因为"HPA不稳定"而放弃自动扩缩的案例中,将缩容窗口从默认的5分钟延长到15分钟,就解决了80%的抖动问题。

qwe0iop0的博客 4557

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

从0到1掌握KEDA弹性伸缩:ScaledObject与ScaledJob实战指南

在Kubernetes(K8s)环境中,如何根据实际负载动态调整资源是运营人员面临的核心挑战。传统的基于CPU和内存的水平自动扩缩容(HPA)难以应对事件驱动型应用的突发流量。KEDA(Kubernetes-based Event Driven Autoscaling)作为CNCF毕业项目,通过事件驱动模型实现了从0到N的精准弹性伸缩。本文将深入解析KEDA的两大核心概念——ScaledObjec...

gitblog_00777的博客 653

Kubernetes弹性伸缩实战:HPA、VPA、CA与KEDA解析

云原生架构中,弹性伸缩是保障应用稳定性与资源效率的核心机制。Kubernetes通过Pod水平自动伸缩(HPA)、垂直伸缩(VPA)、节点自动伸缩(Cluster Autoscaler)以及事件驱动伸缩(KEDA)的协同配合,基于CPU、内存或外部事件动态调整副本与节点规模。理解控制器循环、稳定窗口、资源request等原理,是避免扩容抖动和成本失控的前提。从常见调度场景出发,结合配置细节与踩坑记录,梳理了从指标采集到副本数计算的完整链路,并给出生产环境下的验证与调优思路,帮助运维与开发者构建更可靠、省心的

weixin_32050773的博客 120

KEDA - 基于Kubernetes事件驱动的自动缩放

事件驱动的计算并不是什么新生事务。数据库世界中的人们使用数据库触发器已有多年了。这个概念很简单: 每当您添加,更改或删除数据时,都会触发一个事件以执行各种功能。新的事件是这些类型的事件和触发器在其他领域的应用程序中激增,例如自动扩展,自动修复,容量规划等。 事件驱动架构的核心是对系统上的各种事件做出反应并采取相应的行动。 自动缩放(以一种或其他方式实现自动化)已成为几乎所有云平台中不可或缺的组成部...

yevvzi的博客 2164

什么是 KEDA?

KEDA (Kubernetes-based Event-Driven Autoscaler) 是在 Kubernetes 中事件驱动的弹性伸缩器,功能非常强大。不仅支持根据基础的 CPU 和内存指标进行伸缩,还支持根据各种消息队列中的长度、数据库中的数据统计、QPS、Cron 定时计划以及您可以想象的任何其他指标进行伸缩,甚至还可以将副本缩到 0。该项目于 2020.3 被 CNCF 接收,2021.8 开始孵化,最后在 2023.8 宣布毕业,目前已经非常成熟,可放心在生产环境中使用。

smile6868的博客 673

【云原生】认识KEDA事件驱动

Kubernetes单Master节点Etcd备份恢复实践 本文记录了在OpenEuler22.03系统上对Kubernetes单Master节点的Etcd进行备份和恢复的全过程。主要内容包括: 环境准备:3节点Kubernetes集群配置 安装etcdctl备份工具(v3.5.7) 创建测试Pod用于验证恢复效果 执行Etcd快照备份并验证备份文件 模拟故障场景(删除测试Pod) 详细恢复步骤:停止服务、恢复数据、重启组件 通过实际操作演示了Etcd数据的完整备份和恢复流程,确保在系统故障时能够快速恢复K

weixin_73059729的博客 848

DOKS弹性伸缩实战:Kubernetes自动扩缩四大支柱详解

Kubernetes弹性伸缩(Scaling)是云原生应用应对流量波动的核心能力,其本质是通过声明式策略实现资源的按需调度与动态调整。原理上依赖指标采集(Metrics Server)、控制器决策(HPA/CA/VPA/KEDA)与基础设施联动三者协同;技术价值在于降低运维负担、提升资源利用率并保障业务SLA;典型应用场景涵盖电商大促、API网关扩容、消息队列消费加速等高并发服务。DigitalOcean Kubernetes(DOKS)凭借对Droplet、Load Balancer等底层资源的深度集成,

chunqingtai2922的博客 422

基于 KEDA 与 Prometheus 的 Kubernetes 业务指标弹性伸缩实践

Kubernetes 的弹性伸缩通常依赖 HPA,但默认情况下它只依据 CPU、内存等资源指标,难以感知业务侧的队列积压、任务堆积等真实压力。事件驱动架构关注 Kafka 消息积压、异步任务队列长度等业务状态,能更及时地触发扩缩容。Prometheus 被广泛用于存储和查询这类自定义业务指标,而 KEDA 作为事件驱动的伸缩组件,可以定时执行 PromQL 从 Prometheus 拉取数据,并将结果转换成 HPA 可读的外部度量值,从而实现 Pod 数量与业务流量对齐。这种模式对异步任务平台、消息消费者等

weixin_33282146的博客 187

高并发系统弹性伸缩实战:从可观测性到K8s HPA自动扩容

在分布式系统架构中,高并发场景下的容量评估与弹性伸缩是保障系统稳定性的核心技术。其核心原理在于构建一个从感知、决策到执行的自动化闭环。首先,通过可观测性三大支柱——指标、日志、追踪,实现对系统状态的实时监控与根因定位,这是感知层的基础。基于此,系统能够依据预设规则(如CPU利用率阈值)自动触发告警与伸缩决策。在技术实现上,Kubernetes Horizontal Pod Autoscaler (HPA) 作为执行层的关键组件,能够根据资源或自定义指标动态调整Pod副本数,实现横向扩容。结合Promethe

weixin_33805743的博客 384

基于 KEDA 监听消息队列实现智能体 Worker 秒级弹性伸缩实战

在以事件驱动为核心的工业级多智能体(Multi-Agent)系统中,任务分发、长程推理与外部工具调用大多采用异步消息队列(如 Kafka、Redis Stream 或 RabbitMQ)进行解耦与削峰。面对双 11 期间秒杀开抢等突发极端脉冲流量,上游瞬间投递数以万计的复杂智能体分析任务,异步消息队列的积压深度在几秒之内便会呈现指数级攀升。然而,传统的 Kubernetes 原生 HPA(Horizontal Pod Autoscaler)主要基于容器的 CPU 或物理内存利用率进行扩缩。

2611_95335967的博客 112

Kubernetes AI 集群实战:KEDA

在云原生AI集群落地体系中,GPU Operator负责底层GPU硬件资源暴露与监控,Volcano负责离线AI训练任务的调度与资源治理。在线推理服务、消息消费服务流量波动极大。原生K8s HPA仅支持CPU、内存指标伸缩,无法感知业务流量、消息堆积、推理QPS,并且不支持缩容到0副本。夜间无流量、业务低谷期依然常驻Pod,昂贵的GPU、CPU资源长期闲置浪费。

2301_76481311的博客 332
上一篇: Jupyter Notebook/Lab高效使用与数据科学工作流优化
下一篇: Hive多表关联查询优化:从执行计划到数据倾斜实战全解析
CarrieYung
博客等级 码龄8年 33粉丝 1万+原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值