当前位置: 首页 > news >正文

KEDA:Kubernetes 事件驱动自动扩缩容

KEDA:Kubernetes 事件驱动自动扩缩容

Kubernetes 原生的 HPA(Horizontal Pod Autoscaler)只能基于 CPU 和内存指标进行扩缩容,面对消息队列积压、数据库连接数、自定义业务指标等场景时显得力不从心。KEDA(Kubernetes Event-driven Autoscaling)正是为填补这一空缺而生。KEDA 作为 HPA 的扩展层,支持 50+ 种外部事件源(Kafka、Redis、RabbitMQ、Prometheus、AWS SQS、Azure Queue 等),能够根据这些外部事件动态调整 Pod 副本数,甚至可以将副本数缩减至零以节省资源,并在有事件到来时迅速从零扩容。KEDA 已是 CNCF 毕业项目,在生产环境中被广泛采用。


服务器配置

KEDA 控制器本身资源占用很少,但要发挥弹性扩缩容的价值,集群需要有足够的资源池来承载突发流量下的 Pod 扩容需求。推荐配置如下:

组件规格
CPU4 核
内存8 GB
系统盘60 GB SSD
操作系统Ubuntu 22.04 LTS
网络公网 IP

搭建 K3s 集群可以考虑 雨云服务器 rainyun。注册填2026off领 5 折,4 核 8GB 机型在演示 KEDA 弹性扩缩容时,能够为多个 Kafka 消费者 Pod 的快速启停提供充足的资源缓冲,同时还可以部署 Kafka、Redis 等消息中间件作为测试用的事件源。

确认集群状态:

kubectl get nodes# NAME STATUS ROLES AGE VERSION# k3s-node1 Ready control-plane,master 3d v1.29.0+k3s1

安装

添加 Helm 仓库

helm repoaddkedacore https://kedacore.github.io/charts helm repo update

安装 KEDA

kubectl create namespace keda helminstallkeda kedacore/keda\--namespacekeda\--setwatchNamespace=""\--setresources.operator.requests.cpu=100m\--setresources.operator.requests.memory=100Mi\--setresources.metricServer.requests.cpu=100m\--setresources.metricServer.requests.memory=100Mi

验证安装

kubectl get pods-nkeda# NAME READY STATUS AGE# keda-operator-7d8f5b6b8-xk9pv 1/1 Running 2m# keda-operator-metrics-apiserver-abc123 1/1 Running 2m# keda-admission-webhooks-6b9b4f9-lmn2p 1/1 Running 2m# 验证 CRD 已注册kubectl get crd|grepkeda# scaledobjects.keda.sh# scaledjobs.keda.sh# triggerauthentications.keda.sh# clustertriggerauthentications.keda.sh

核心概念

ScaledObject

ScaledObject是 KEDA 的核心 CRD,用于将外部事件源绑定到一个 Deployment、StatefulSet 或自定义资源上,控制其副本数的伸缩。你在 ScaledObject 中定义:

  • scaleTargetRef:目标工作负载(Deployment/StatefulSet 等)
  • minReplicaCount:最小副本数(设为 0 即启用缩零)
  • maxReplicaCount:最大副本数上限
  • triggers:触发扩缩容的事件源列表,支持多个触发器
  • cooldownPeriod:缩容前的冷却等待时间(秒)
  • pollingInterval:KEDA 轮询事件源的间隔(秒)

ScaledJob

ScaledJob用于基于事件驱动的批处理场景。与 ScaledObject 不同,ScaledJob 每次扩容时创建新的 Job 来处理消息,处理完成后 Job 自动删除,适合每条消息都需要一个独立 Pod 处理的场景(如视频转码、报告生成等)。

TriggerAuthentication / ClusterTriggerAuthentication

TriggerAuthentication用于安全地将认证信息(API Key、连接字符串、证书等)传递给触发器,避免直接在 ScaledObject 中硬编码敏感信息。ClusterTriggerAuthentication是集群级别的,可跨命名空间共用。

与 HPA 的关系

KEDA 并不替代 HPA,而是作为 HPA 的外部指标提供者(External Metrics Provider)。KEDA 创建 ScaledObject 后,会自动为目标工作负载生成对应的 HPA 对象,并向 HPA 暴露外部指标。你可以通过kubectl get hpa看到 KEDA 自动创建的 HPA 资源。


实战示例

1. 基于 Kafka 消费者积压扩缩容

场景:根据 Kafka Topic 中未消费的消息数量,动态调整消费者 Pod 数量。

首先创建 Kafka 连接认证:

# kafka-trigger-auth.yamlapiVersion:keda.sh/v1alpha1kind:TriggerAuthenticationmetadata:name:kafka-trigger-authnamespace:defaultspec:secretTargetRef:-parameter:saslname:kafka-credentialskey:sasl-parameter:usernamename:kafka-credentialskey:username-parameter:passwordname:kafka-credentialskey:password-parameter:tlsname:kafka-credentialskey:tls
kubectl create secret generic kafka-credentials\--from-literal=sasl=plaintext\--from-literal=username=kafka-user\--from-literal=password=kafka-password\--from-literal=tls=disable

创建 ScaledObject:

# kafka-scaledobject.yamlapiVersion:keda.sh/v1alpha1kind:ScaledObjectmetadata:name:kafka-consumer-scalernamespace:defaultspec:scaleTargetRef:apiVersion:apps/v1kind:Deploymentname:kafka-consumerminReplicaCount:0# 无消息时缩减为零maxReplicaCount:20# 最多扩容到 20 个 PodpollingInterval:15# 每 15 秒检查一次cooldownPeriod:60# 缩容前等待 60 秒triggers:-type:kafkametadata:bootstrapServers:kafka.kafka.svc.cluster.local:9092consumerGroup:my-consumer-grouptopic:orderslagThreshold:"50"# 每个 Pod 处理 50 条积压消息offsetResetPolicy:latestauthenticationRef:name:kafka-trigger-auth
kubectl apply-fkafka-trigger-auth.yaml kubectl apply-fkafka-scaledobject.yaml

2. 基于 Redis List 队列深度扩缩容

场景:根据 Redis List 中待处理任务数量,自动调整 Worker Pod 数量:

# redis-scaledobject.yamlapiVersion:keda.sh/v1alpha1kind:TriggerAuthenticationmetadata:name:redis-trigger-authnamespace:defaultspec:secretTargetRef:-parameter:addressname:redis-secretkey:address-parameter:passwordname:redis-secretkey:password---apiVersion:keda.sh/v1alpha1kind:ScaledObjectmetadata:name:redis-worker-scalernamespace:defaultspec:scaleTargetRef:apiVersion:apps/v1kind:Deploymentname:task-workerminReplicaCount:1maxReplicaCount:30pollingInterval:10cooldownPeriod:120triggers:-type:redisauthenticationRef:name:redis-trigger-authmetadata:listName:task-queuelistLength:"20"# 每个 Pod 处理 20 个队列项enableTLS:"false"databaseIndex:"0"
kubectl create secret generic redis-secret\--from-literal=address=redis.default.svc.cluster.local:6379\--from-literal=password=your-redis-password kubectl apply-fredis-scaledobject.yaml

3. 基于 Prometheus 指标扩缩容

场景:根据业务自定义指标(如 HTTP 请求 QPS)进行扩缩容:

# prometheus-scaledobject.yamlapiVersion:keda.sh/v1alpha1kind:ScaledObjectmetadata:name:api-server-scalernamespace:defaultspec:scaleTargetRef:apiVersion:apps/v1kind:Deploymentname:api-serverminReplicaCount:2maxReplicaCount:50pollingInterval:30cooldownPeriod:180triggers:-type:prometheusmetadata:serverAddress:http://prometheus.monitoring.svc.cluster.local:9090metricName:http_requests_per_second# 当平均每个 Pod QPS 超过 100 时扩容threshold:"100"query:sum(rate(http_requests_total{namespace="default",deployment="api-server"}[1m]))
kubectl apply-fprometheus-scaledobject.yaml

4. ScaledJob 批处理任务

场景:视频转码任务队列,每条消息独立启动一个 Pod 进行处理:

# video-transcode-scaledjob.yamlapiVersion:keda.sh/v1alpha1kind:ScaledJobmetadata:name:video-transcode-jobnamespace:defaultspec:jobTargetRef:parallelism:5# 最多同时运行 5 个 Jobcompletions:1template:spec:containers:-name:transcoderimage:my-transcoder:latestenv:-name:QUEUE_URLvalue:"sqs://my-video-queue"resources:requests:cpu:"1"memory:"2Gi"limits:cpu:"2"memory:"4Gi"restartPolicy:NeverpollingInterval:30maxReplicaCount:20successfulJobsHistoryLimit:3failedJobsHistoryLimit:5triggers:-type:redisauthenticationRef:name:redis-trigger-authmetadata:listName:video-transcode-queuelistLength:"1"# 每条消息触发一个 Job
kubectl apply-fvideo-transcode-scaledjob.yaml

5. Cron 触发器(定时扩缩容)

场景:工作时间保持最少 5 个副本,非工作时间缩减至 1 个:

# cron-scaledobject.yamlapiVersion:keda.sh/v1alpha1kind:ScaledObjectmetadata:name:business-hours-scalernamespace:defaultspec:scaleTargetRef:apiVersion:apps/v1kind:Deploymentname:web-appminReplicaCount:1maxReplicaCount:20triggers:-type:cronmetadata:timezone:Asia/Shanghaistart:"0 9 * * 1-5"# 工作日早 9 点开始end:"0 18 * * 1-5"# 工作日晚 6 点结束desiredReplicas:"5"# 工作时间维持 5 个副本

常用命令

# 查看所有 ScaledObject 及其状态kubectl get scaledobject-Akubectl describe scaledobject kafka-consumer-scaler-ndefault# 查看 KEDA 自动创建的 HPAkubectl get hpa-ndefault kubectl describe hpa keda-hpa-kafka-consumer-scaler-ndefault# 查看 ScaledJobkubectl get scaledjob-A# 查看 TriggerAuthenticationkubectl get triggerauthentication-Akubectl get clustertriggerauthentication-A# 查看 KEDA 控制器日志(排查扩缩容问题)kubectl logs-nkeda deploy/keda-operator-fkubectl logs-nkeda deploy/keda-operator-metrics-apiserver-f# 监控扩缩容事件kubectl get events-ndefault --field-selectorreason=KEDAScaleTargetActivated kubectl get events-ndefault --field-selectorreason=KEDAScaleTargetDeactivated# 查看当前外部指标值(用于验证触发器是否正常工作)kubectl get--raw"/apis/external.metrics.k8s.io/v1beta1/namespaces/default/s0-kafka-orders"|python3-mjson.tool# 强制立即触发扩缩容检查(通过重启 KEDA operator)kubectl rollout restart deploy/keda-operator-nkeda# 临时暂停 ScaledObject(不影响工作负载,只暂停 KEDA 管理)kubectl patch scaledobject kafka-consumer-scaler-ndefault\--typemerge\-p'{"metadata":{"annotations":{"autoscaling.keda.sh/paused-replicas":"2"}}}'# 恢复 ScaledObjectkubectl patch scaledobject kafka-consumer-scaler-ndefault\--typemerge\-p'{"metadata":{"annotations":{"autoscaling.keda.sh/paused-replicas":null}}}'

KEDA 将 Kubernetes 的弹性扩缩容能力提升到了一个全新的维度。通过与 Kafka、Redis、Prometheus 等生产级事件源的深度集成,以及独特的缩零能力,KEDA 在显著提升系统弹性的同时大幅降低了空闲资源的浪费。无论是高并发消息处理、批量数据处理还是业务流量的波峰波谷应对,KEDA 都能给出优雅的解决方案。

http://www.jsqmd.com/news/847368/

相关文章:

  • 复盘与导出工具最新版V53.0更新-新增ETF轮动和重写板块叠加功能
  • 2026 年面向 LLM 的 RL方法总结:从 PPO 到 DPO 到 GRPO,再到多智能体 RL
  • Linux入门指南:从内核到终端,掌握核心命令与文件操作
  • cert-manager:Kubernetes 自动 TLS 证书管理
  • 别再让LDO白费电!用MP2307+SGM3209+SGM2211搭建高效低噪±5V双电源(附完整电路图)
  • 从零开始:MOOTDX通达信数据接口的5步实战指南
  • [特殊字符]️ 顶层可视化大盘·锁的来龙去脉 v1.0
  • 2026洛阳信用卡 pos 机免费上门办理,银联授权带积分,大额刷卡稳定不涨价 - 资讯速览
  • Tina Linux嵌入式图形系统开发实战指南:从架构解析到性能优化
  • NGSIM数据集:如何成为自动驾驶算法开发的‘黄金标准’测试集?
  • 突发!多地教育局已启用Perplexity替代传统教务查询系统——你还在手动翻Excel?(附迁移自查表)
  • 我自己写的论文为什么被判 AI 率 60%?这款工具帮我降到 5% 通过 985 知网严查
  • AI模型部署实战:用Docker部署一个深度学习模型
  • 终极Windows系统优化指南:如何快速解决C盘空间不足问题
  • ComfyUI Segment Anything:零基础实现AI智能图像分割的终极指南
  • 本地大模型部署进入深水区:企业AI Agent开发面临的真实问题
  • Python-docx实战:给你的爬虫数据穿上“Word外衣”,从标题到段落样式一键美化
  • Fedora 44 下 fcitx5 拼音输入法在部分应用中无法使用的排查与解决
  • 紧急通知:司法部2024新规倒逼法律检索升级!Perplexity法律模式已适配新《民法典司法解释(三)》全文语义索引
  • 告别GUI!在VS2017里用RTKLIB 2.4.3命令行玩转PPP数据处理(附.conf文件生成与调试技巧)
  • 5分钟搭建拼多多数据采集系统:电商运营的终极指南
  • 在自动化脚本中使用Taotoken实现多模型聚合调用与路由
  • 行列式的哲学意义:一个数字,丈量无限世界
  • 终极Lenovo Legion Toolkit指南:轻量级笔记本控制解决方案完全解析
  • 保姆级教程:在鲁班猫4(RK3588S)上搞定Realsense D435i和T265的ROS驱动(附内核避坑指南)
  • 【Perplexity设计灵感查询实战指南】:20年架构师亲授3大反直觉设计哲学与5个落地场景
  • AI 应用生成平台爆发:腾讯吐司 + Ardot 与编程民主化新浪潮
  • 【Perplexity图书推荐查询实战指南】:20年AI工具专家亲授3大精准检索公式与5个避坑红线
  • 零成本IM与微信分账绝杀竞品!三角洲游戏俱乐部接单平台首选,游戏电竞护航陪玩源码系统小程序重塑护航平台 - 壹软科技
  • 从Sobel到Laplace:用PyTorch复现经典CV算子,理解边缘检测的底层逻辑