华为云kubernetes基于keda自动伸缩deployment副本(监听redis队列长度)
1 概述
KEDA(Kubernetes-based Event-Driven Autoscaler,网址是https://keda.sh)是在 Kubernetes 中事件驱动的弹性伸缩器,功能非常强大。不仅支持根据基础的CPU和内存指标进行伸缩,还支持根据各种消息队列中的长度、数据库中的数据统计、QPS、Cron 定时计划以及您可以想象的任何其他指标进行伸缩。KEDA支持的所有scaler,可从如下网址里查询:
https://keda.sh/docs/2.16/scalers
该项目于2020年3月被 CNCF 接收,并于2021年8月开始孵化,最终在2023年8月宣布毕业,目前已经非常成熟,可放心在生产环境中使用。
本文介绍在华为云kubernetes中部署keda v2.16.1,keda监听redis队列中的长度来伸缩目标deployment的副本数。
2 架构图
KEDA 并不是要替代HPA,而是作为HPA的补充或者增强。实际上,KEDA 经常与 HPA 一起协同工作。以下是 KEDA 官方的架构图

- 当要将工作负载的副本数缩到闲时副本数,或从闲时副本数开始扩容时,由KEDA通过修改工作负载的副本数实现(闲时副本数小于 minReplicaCount,包括0,即可以缩到0)。
- 其他情况下的扩缩容过程都由Kubernetes HPA实现,HPA被KEDA管理,HPA使用External Metrics作为数据源,而External Metrics实际的数据由KEDA提供。
- KEDA 各种Scalers的目的其实就是为HPA暴露External Metrics格式的数据,KEDA会将各种外部事件转换为所需的External Metrics数据,最终实现HPA读取这些External Metrics数据进行自动伸缩,因此KEDA直接复用了HPA 已有的能力,如果需要控制扩缩容的行为细节(例如快速扩容、缓慢缩容),可以直接通过配置 HPA 的 behavior 字段来实现(要求 Kubernetes 版本 ≥1.18)。
3 环境准备
3.1 华为云kubernetes集群
准备一个kubernetes集群,如下图所示:

如果你需要KEDA基于传统的CPU和内存来伸缩工作负载,则需要为kubernetes集群开启metrics插件。
如果你需要KEDA基于传统的CPU和内存来伸缩工作负载,则需要为kubernetes集群开启metrics插件。
如果你需要KEDA基于传统的CPU和内存来伸缩工作负载,则需要为kubernetes集群开启metrics插件。
开启metrics插件只需要在华为云kubernetes控制台的插件中心里安装即可,如下图:



3.2 redis服务
准备一个redis实例,如下图所示:

4 部署
4.1 部署keda
为helm添加新的repo,命令如下:
helm repo add kedacore https://kedacore.github.io/charts
helm repo update
下载values.yaml,命令如下:
helm show values kedacore/keda > values.yaml
修改values.yaml文件中的容器镜像,方便在国内环境拉取,如下所示:
image:keda:registry: docker.iorepository: imroc/kedatag: "2.16.1"metricsApiServer:registry: docker.iorepository: imroc/keda-metrics-apiserver tag: "2.16.1"webhooks:registry: docker.iorepository: imroc/keda-admission-webhookstag: "2.16.1"
部署keda,命令如下所示:
helm upgrade --install keda kedacore/keda \
--namespace keda --create-namespace \
-f values.yaml

4.2 部署待被伸缩的目标deployment
创建一个零副本的服务,如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:name: php-apachenamespace: default
spec:replicas: 0selector:matchLabels:run: php-apachetemplate:metadata:labels:run: php-apachespec:containers:- image: deis/hpa-exampleimagePullPolicy: Alwaysname: php-apacheports:- containerPort: 80protocol: TCPresources:limits:cpu: 100mrequests:cpu: 20m
5 创建伸缩对象ScaledObject
创建如下对象:
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:name: hpa-appnamespace: default
spec:scaleTargetRef: # 扩容目标对象name: php-apachekind: DeploymentapiVersion: apps/v1minReplicaCount: 1 # 最小副本数maxReplicaCount: 6 # 最大副本数triggers: # 触发规则- metadata:address: redis-****.cn-south-1.dcs.myhuaweicloud.com:6379 # Redis地址listName: keda-hpa-demo-list # Redis的列表的key名称listLength: "10" # 触发伸缩的队列长度password: "********your-redis-password********"type: redis # 事件源类型为redis

6 往redis中的队列添加元素
队列名称为keda-hpa-demo-list,往里面添加20个元素,命令如下:
RPUSH keda-hpa-demo-list value1 value2 value3 value4 value5 value6 value7 value8 value9 value10
RPUSH keda-hpa-demo-list value11 value12 value13 value14 value15 value16 value17 value18 value19 value20
LRANGE keda-hpa-demo-list 0 -1

7 伸缩现象
查看kubernetes event,可见副本数量伸缩为2了。
kubectl get event
31m Normal SuccessfulRescale horizontalpodautoscaler/keda-hpa-hpa-app New size: 2; reason: external metric s0-redis-keda-hpa-demo-list(&LabelSelector{MatchLabels:map[string]string{scaledobject.keda.sh/name: hpa-app,},MatchExpressions:[]LabelSelectorRequirement{},}) above target


仔细发现,keda自动创建了HPA对象,这个对象里的一些字段是来自,如下所示:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:annotations:kubectl.kubernetes.io/last-applied-configuration: |{"apiVersion":"keda.sh/v1alpha1","kind":"ScaledObject","metadata":{"annotations":{},"name":"hpa-app","namespace":"default"},"spec":{"maxReplicaCount":6,"minReplicaCount":1,"scaleTargetRef":{"apiVersion":"apps/v1","kind":"Deployment","name":"php-apache"},"triggers":[{"metadata":{"address":"redis-6482e5d4-6f37-4138-ab01-64f7ca6a4a6d.cn-south-1.dcs.myhuaweicloud.com:6379","listLength":"10","listName":"keda-hpa-demo-list","password":"iloveredis@2025"},"type":"redis"}]}}creationTimestamp: "2025-02-12T14:28:56Z"labels:app.kubernetes.io/managed-by: keda-operatorapp.kubernetes.io/name: keda-hpa-hpa-appapp.kubernetes.io/part-of: hpa-appapp.kubernetes.io/version: 2.16.1scaledobject.keda.sh/name: hpa-appname: keda-hpa-hpa-appnamespace: defaultownerReferences:- apiVersion: keda.sh/v1alpha1blockOwnerDeletion: truecontroller: truekind: ScaledObjectname: hpa-appuid: 795e92f1-da13-4281-a460-9cfe750ec753resourceVersion: "99768"uid: 629c14c2-b0a0-4007-8c38-eaa104dc20a2
spec:maxReplicas: 6metrics:- external:metric:name: s0-redis-keda-hpa-demo-listselector:matchLabels:scaledobject.keda.sh/name: hpa-apptarget:averageValue: "10"type: AverageValuetype: ExternalminReplicas: 1scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: php-apache
status:conditions:- lastTransitionTime: "2025-02-12T14:29:11Z"message: the HPA controller was able to get the target's current scalereason: SucceededGetScalestatus: "True"type: AbleToScale- lastTransitionTime: "2025-02-12T15:34:36Z"message: 'the HPA was unable to compute the replica count: unable to get externalmetric default/s0-redis-keda-hpa-demo-list/&LabelSelector{MatchLabels:map[string]string{scaledobject.keda.sh/name:hpa-app,},MatchExpressions:[]LabelSelectorRequirement{},}: unable to fetch metricsfrom external metrics API: rpc error: code = Unknown desc = error when gettingmetric values error getting scalers connection to redis failed: dial tcp: lookupredis-6482e5d4-6f37-4138-ab01-64f7ca6a4a6d.cn-south-1.dcs.myhuaweicloud.comon 169.254.1.1:53: no such host'reason: FailedGetExternalMetricstatus: "False"type: ScalingActive- lastTransitionTime: "2025-02-12T14:29:11Z"message: the desired count is within the acceptable rangereason: DesiredWithinRangestatus: "False"type: ScalingLimitedcurrentMetrics:- type: ""currentReplicas: 2desiredReplicas: 2lastScaleTime: "2025-02-12T14:30:11Z"
同时,还创建了external metrics对象,如下所示:

kubectl get apiservices | grep external.metrics.k8s.io

kubectl get apiservice v1beta1.external.metrics.k8s.io -o yaml
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:annotations:meta.helm.sh/release-name: kedameta.helm.sh/release-namespace: kedacreationTimestamp: "2025-02-12T07:52:48Z"labels:app.kubernetes.io/component: operatorapp.kubernetes.io/instance: kedaapp.kubernetes.io/managed-by: Helmapp.kubernetes.io/name: v1beta1.external.metrics.k8s.ioapp.kubernetes.io/part-of: keda-operatorapp.kubernetes.io/version: 2.16.1helm.sh/chart: keda-2.16.1name: v1beta1.external.metrics.k8s.ioresourceVersion: "47073"uid: 0428df85-50ed-4363-9799-f3c03dee88e9
spec:caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0************************DdBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==group: external.metrics.k8s.iogroupPriorityMinimum: 100service:name: keda-operator-metrics-apiservernamespace: kedaport: 443version: v1beta1versionPriority: 100
status:conditions:- lastTransitionTime: "2025-02-12T13:26:19Z"message: all checks passedreason: Passedstatus: "True"type: Available
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/s0-redis-keda-hpa-demo-list?labelSelector=scaledobject.keda.sh%2Fname%3Dhpa-app" | jq .

可见keda namespace下的keda-operator-metrics-apiserver服务是kube-apiserver的指标类接口的后端,也是keda各个scaler的前端网关。

8 小结
通过内置很多scaler的伸缩神器keda,以redis队列的长度为依据对目标工作负载deployment进行伸缩,开箱即用,解决了以往的HPA Controller + Prometheus Adaptor + Prometheus + Exporter的自定义流程。
相关文章:
华为云kubernetes基于keda自动伸缩deployment副本(监听redis队列长度)
1 概述 KEDA(Kubernetes-based Event-Driven Autoscaler,网址是https://keda.sh)是在 Kubernetes 中事件驱动的弹性伸缩器,功能非常强大。不仅支持根据基础的CPU和内存指标进行伸缩,还支持根据各种消息队列中的长度、…...
Spring源码分析のBean扫描流程
文章目录 前言一、scanCandidateComponents1.1 isCandidateComponent1.1.1、排除/包含过滤器1.1.2、条件装配1.1.3、重载一1.1.4、重载二1.1.5、补充:Lookup注解 总结 前言 原生的Spring在构造ApplicationContext时,会调用refresh方法。其中就包含了扫描…...
Ubuntu安装docker:docker-desktop : 依赖: docker-ce-cli 但无法安装它、无法定位软件包 docker-ce-cli
具体错误 sudo apt-get install ./docker-desktop-amd64.deb [sudo] password for weiyu: 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 注意,选中 docker-desktop 而非 ./docker-desktop-amd64.de…...
基于大数据的奥运会获奖数据分析系统设计与实现
【大数据】基于大数据的奥运会获奖数据分析系统设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统通过集成先进的数据抓取、处理、存储与可视化技术,为深入理解奥运会…...
数据结构 堆和priority_queue
一、堆的定义 堆(heap),是⼀棵有着特殊性质的完全⼆叉树,可以⽤来实现优先级队列(priorityqueue)。 堆需要满⾜以下性质: 1. 是⼀棵完全⼆叉树; 2. 对于树中每个结点,如…...
Dockerfile 编写推荐
一、导读 本文主要介绍在编写 docker 镜像的时候一些需要注意的事项和推荐的做法。 虽然 Dockerfile 简化了镜像构建的过程,并且把这个过程可以进行版本控制,但是不正当的 Dockerfile 使用也会导致很多问题。 docker 镜像太大。如果你经常使用镜像或者…...
【抽象代数】1.2. 半群与群
群的定义 群非空集合二元运算性质 定义1. 设 为一个非空集合,上有二元运算,满足结合律,则称或为一个半群。 定义2. 设 为半群,若元素 满足 ,则称 为 的左幺元(右幺元:)&#…...
Django中实现简单易用的分页工具
如何在Django中实现简单易用的分页工具?📚 嗨,小伙伴们!今天我们来看看如何在 Django 中实现一个超简单的分页工具。无论你是在处理博客文章、产品列表,还是用户评论,当数据量一大时,分页显得尤…...
「软件设计模式」装饰者模式(Decorator)
深入解析装饰者模式:动态扩展功能的艺术(C实现) 一、模式思想与应用场景 1.1 模式定义 装饰者模式(Decorator Pattern)是一种结构型设计模式,它通过将对象放入包含行为的特殊封装对象中,动态地…...
CI/CD(二)docker-compose安装Jenkins
1、docker-compose.yml version: 3.8services:jenkins:image: jenkins/jenkins:lts # 使用官方的 Jenkins LTS 镜像container_name: jenkinsuser: root # 如果需要以 root 用户运行ports:- "8080:8080" # Jenkins Web 界面端口- "50000:50000" # 用于 Jen…...
OpenCV机器学习(1)人工神经网络 - 多层感知器类cv::ml::ANN_MLP
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::ml::ANN_MLP 是 OpenCV 库中的一部分,用于实现人工神经网络 - 多层感知器(Artificial Neural Network - Multi-Layer…...
ProxySQL构建PolarDB-X标准版高可用路由服务三节点集群
ProxySQL构建PolarDB-X标准版高可用路由服务三节点集群 一、PolarDB-X标准版主备集群搭建 三台机器上传 polardbx 包,包可以从官网https://openpolardb.com/download获取,这里提供离线rpm。 1、上传 polardbx 安装包 到 /opt目录下 rpm -ivh t-pol…...
15.1 Process(进程)类
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 通常开发时想要获得进程是比较困难的事,必须要调用CreateToolhelpSnapshot、ProcessFirst、ProcessNext等API或者诸如 Zw…...
elasticsearch8 linux版以服务的方式启动
1.创建系统服务文件 对于使用 systemd 作为系统初始化系统的 Linux 发行版(如 CentOS 7 及以上、Ubuntu 16.04 及以上),需要创建一个 systemd 服务文件。以 root 用户或具有 sudo 权限的用户身份执行以下操作: sudo vim /etc/sy…...
小米 R3G 路由器刷机教程(Pandavan)
小米 R3G 路由器刷机教程(Pandavan) 一、前言 小米 R3G 路由器以其高性价比和稳定的性能备受用户青睐。然而,原厂固件的功能相对有限,难以满足高级用户的个性化需求。刷机不仅可以解锁路由器的潜能,还能通过第三方固…...
某大型业务系统技术栈介绍【应对面试】
微服务架构【图】 微服务架构【概念】 微服务架构,是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。在微服务架构中,服务与服务之间通信时,通常是…...
【区块链】零知识证明基础概念详解
🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 💫个人格言: "如无必要,勿增实体" 文章目录 零知识证明基础概念详解引言1. 零知识证明的定义与特性1.1 基本定义1.2 三个核心…...
建筑行业安全技能竞赛流程方案
一、比赛时间: 6月23日8:30分准时到场;9:00-10:00理论考试;10:10-12:00现场隐患答疑;12:00-13:30午餐;下午13:30-15:30现场…...
数据结构:图;邻接矩阵和邻接表
邻接矩阵: 1.概念: 邻接矩阵是图的存储结构之一,通过二维数组表示顶点间的连接关系。 2.具体例子 : 一.无向图邻接矩阵示例: 示例图(顶点:A、B、C,边:A-B、B-C&…...
DeepSeek-R1论文阅读及蒸馏模型部署
DeepSeek-R1论文阅读及蒸馏模型部署 文章目录 DeepSeek-R1论文阅读及蒸馏模型部署摘要Abstract一、DeepSeek-R1论文1. 论文摘要2. 引言3. DeepSeek-R1-Zero的方法3.1 强化学习算法3.2 奖励建模3.3 训练模版3.4 DeepSeek-R1-Zero的性能、自进化过程和顿悟时刻 4. DeepSeek-R1&am…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
