华为云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.io
    repository: imroc/keda
    tag: "2.16.1"
  metricsApiServer:
    registry: docker.io
    repository: imroc/keda-metrics-apiserver 
    tag: "2.16.1"
  webhooks:
    registry: docker.io
    repository: imroc/keda-admission-webhooks
    tag: "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-apache
  namespace: default
spec:
  replicas: 0
  selector:
    matchLabels:
      run: php-apache
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - image: deis/hpa-example
        imagePullPolicy: Always
        name: php-apache
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          limits:
            cpu: 100m
          requests:
            cpu: 20m

5 创建伸缩对象ScaledObject

创建如下对象:

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: hpa-app
  namespace: default
spec:
  scaleTargetRef:                           # 扩容目标对象
    name: php-apache
    kind: Deployment
    apiVersion: apps/v1
  minReplicaCount: 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-operator
    app.kubernetes.io/name: keda-hpa-hpa-app
    app.kubernetes.io/part-of: hpa-app
    app.kubernetes.io/version: 2.16.1
    scaledobject.keda.sh/name: hpa-app
  name: keda-hpa-hpa-app
  namespace: default
  ownerReferences:
  - apiVersion: keda.sh/v1alpha1
    blockOwnerDeletion: true
    controller: true
    kind: ScaledObject
    name: hpa-app
    uid: 795e92f1-da13-4281-a460-9cfe750ec753
  resourceVersion: "99768"
  uid: 629c14c2-b0a0-4007-8c38-eaa104dc20a2
spec:
  maxReplicas: 6
  metrics:
  - external:
      metric:
        name: s0-redis-keda-hpa-demo-list
        selector:
          matchLabels:
            scaledobject.keda.sh/name: hpa-app
      target:
        averageValue: "10"
        type: AverageValue
    type: External
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
status:
  conditions:
  - lastTransitionTime: "2025-02-12T14:29:11Z"
    message: the HPA controller was able to get the target's current scale
    reason: SucceededGetScale
    status: "True"
    type: AbleToScale
  - lastTransitionTime: "2025-02-12T15:34:36Z"
    message: 'the HPA was unable to compute the replica count: unable to get external
      metric default/s0-redis-keda-hpa-demo-list/&LabelSelector{MatchLabels:map[string]string{scaledobject.keda.sh/name:
      hpa-app,},MatchExpressions:[]LabelSelectorRequirement{},}: unable to fetch metrics
      from external metrics API: rpc error: code = Unknown desc = error when getting
      metric values error getting scalers connection to redis failed: dial tcp: lookup
      redis-6482e5d4-6f37-4138-ab01-64f7ca6a4a6d.cn-south-1.dcs.myhuaweicloud.com
      on 169.254.1.1:53: no such host'
    reason: FailedGetExternalMetric
    status: "False"
    type: ScalingActive
  - lastTransitionTime: "2025-02-12T14:29:11Z"
    message: the desired count is within the acceptable range
    reason: DesiredWithinRange
    status: "False"
    type: ScalingLimited
  currentMetrics:
  - type: ""
  currentReplicas: 2
  desiredReplicas: 2
  lastScaleTime: "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: keda
    meta.helm.sh/release-namespace: keda
  creationTimestamp: "2025-02-12T07:52:48Z"
  labels:
    app.kubernetes.io/component: operator
    app.kubernetes.io/instance: keda
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: v1beta1.external.metrics.k8s.io
    app.kubernetes.io/part-of: keda-operator
    app.kubernetes.io/version: 2.16.1
    helm.sh/chart: keda-2.16.1
  name: v1beta1.external.metrics.k8s.io
  resourceVersion: "47073"
  uid: 0428df85-50ed-4363-9799-f3c03dee88e9
spec:
  caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0************************DdBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
  group: external.metrics.k8s.io
  groupPriorityMinimum: 100
  service:
    name: keda-operator-metrics-apiserver
    namespace: keda
    port: 443
  version: v1beta1
  versionPriority: 100
status:
  conditions:
  - lastTransitionTime: "2025-02-12T13:26:19Z"
    message: all checks passed
    reason: Passed
    status: "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的自定义流程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/970863.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解锁机器学习核心算法 | 决策树:机器学习中高效分类的利器

引言 前面几篇文章我们学习了机器学习的核心算法线性回归和逻辑回归。这篇文章我们继续学习机器学习的经典算法——决策树(Decision Tree) 一、决策树算法简介 决策树算法是一种典型的分类方法,也是一种逼近离散函数值的方法。它的核心思想…

CRISPR spacers数据库;CRT和PILER-CR用于MAGs的spacers搜索

iPHoP:病毒宿主预测-CSDN博客 之前介绍了这个方法来预测病毒宿主,今天来介绍另一种比较用的多的方法CRISPR比对 CRISPR spacers数据库 Dash 在这可以下载作者搜集的spacers用于后期比对 CRT和PILER-CR 使用 CRT 和 PILERCR 识别 CRISPR 间隔区&#x…

TestHubo基础教程-创建项目

TestHubo是一款国产开源一站式测试工具,涵盖功能测试、接口测试、性能测试,以及 Web 和 App 测试,可以满足不同类型项目的测试需求。本文将介绍如何快速创建第一个项目,以快速入门上手。 1、创建项目 在 TestHubo 中,…

多模态基础模型第二篇-deepseek-r1部署

分别使用本地windows和云端linux进行部署,测试不同硬件资源的模型推理性能: windos部署:直接打开Download Ollama on Linux 下载,然后本地启动服务, linux部署:curl -fsSL https://ollama.ai/install.sh …

本地 Ollama 部署 Deepseek R1 并使用 Spring AI Alibaba 构建 Chat 应用示例

本地部署 Deepseek R1 并使用 Spring AI Alibaba 构建 Chat 应用示例 Ollama 部署 Deepseek R1 官网:https://www.deepseek.com/ Github:https://github.com/deepseek-ai Ollama:https://ollama.com/ Docker Compose 部署一个 Ollama 和…

【TI C2000】F28002x的系统延时、GPIO配置及SCI(UART)串口发送、接收

【TI C2000】F28002x的系统延时、GPIO配置及SCI(UART)串口发送、接收 文章目录 系统延时GPIO配置GPIO输出SCI配置SCI发送、接收测试附录:F28002x开发板上手、环境配置、烧录及TMS320F280025C模板工程建立F28002x叙述烧录SDK库文件说明工程建…

LabVIEW中的icon.llb 库

icon.llb 库位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform 目录下,是 LabVIEW 系统中的一个重要库。它的主要功能是与图标相关的操作,提供了一些实用的 VI 用于处理 LabVIEW 图标的显示、修改和设置。通过该库&#x…

C语言-章节 1:变量与数据类型 ——「未初始化的诅咒」

在那神秘且广袤无垠的「比特大陆」上,阳光奋力地穿过「内存森林」中错综复杂的代码枝叶缝隙,洒下一片片斑驳陆离、如梦似幻的光影。林间的空气里,弥漫着一股浓郁的十六进制锈蚀味,仿佛在诉说着这片森林中隐藏的古老秘密。 一位零基…

Dest1ny漏洞库:用友 U8-CRM 系统 ajaxgetborrowdata.php 存在 SQL 注入漏洞

大家好,今天是Dest1ny漏洞库的专题!! 会时不时发送新的漏洞资讯!! 大家多多关注,多多点赞!!! 用友U8-CRM系统ajaxgetborrowdata.php存在SQL注入漏洞,文件多…

全平台搭载旭日5!科沃斯GOAT智能割草机器人全新系列正式开售

要闻 近日,科沃斯全新发布的GOAT A Series 和 GOAT O Series割草机器人,将在多国市场正式上市发售。作为业界最强的割草机器人产品之一,GOAT致力为割草机带来基于机器人视觉的专业定位解决方案。科沃斯GOAT全新系列产品全平台搭载地瓜机器人…

HCIA综合项目之多技术的综合应用实验

十五 HCIA综合实验 15.1 IP规划 #内网分配网段192.168.1.0 24#内网包括骨干链路和两个用户网段,素以需要划分三个,借两位就够用了192.168.1.0 26--骨干192.168.1.64 26---R1下网络192.168.1.128 26---R2下网络192.168.1.192 26--备用​192.168.1.64 26--…

PbootCMS增加可允许上传文件类型,例如webp、mov等文件格式扩展

在PbootCMS日常使用过程中,会涉及一些非常见的文件格式上传。 这时候就需要在PbootCMS配置文件中追加一些允许上传文件扩展名。 操作步骤 1、打开/config/config.php文件,大约在30行,修改upload配置信息: // 上传配置upload &…

DeepSeek应用——与PyCharm的配套使用

目录 一、配置方法 二、使用方法 三、注意事项 1、插件市场无continue插件 2、无结果返回,且在本地模型报错 记录自己学习应用DeepSeek的过程,使用的是自己电脑本地部署的私有化蒸馏模型...... (举一反三,这个不单单是可以用…

本地快速部署DeepSeek-R1模型以及可视化工具

这里写目录标题 安装 Ollama下载和部署DeepSeek模型可视化工具 安装 Ollama Ollama 是一个轻量级的可扩展框架,用于在本地计算机上构建和运行语言模型。它提供了一个用于创建、运行和管理模型的简单 API,以及一个可在各种应用程序中轻松使用的预构建模型…

hive高频写入小数据,导致hdfs小文件过多,出现查询效率很低的情况

问题描述 hive高频写入小数据,导致hdfs小文件过多,出现查询效率很低的情况分析过程 先复现现象 select count() from ads.ads_sdd_flow_managemlt_to_ids_mm;–15分钟,小文件10983 select max(mm) from ads.ads_sdd_flow_managemlt_to_ids…

Docker 部署 MySQL 8 详细图文教程

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …

Pythong 解决Pycharm 运行太慢

Pythong 解决Pycharm 运行太慢 官方给Pycharm自身占用的最大内存设低估了限制,我的Pycharm刚开始默认是256mb。 首先找到自己的Pycharm安装目录 根据合适自己的改 保存,重启Pycharm

图像生成GAN和风格迁移

文章目录 摘要abstract1.生成对抗网络 GAN1.1 算法步骤 2.风格迁移2.1 损失函数2.2 论文阅读2.2.1 简介2.2.2 方法2.2.3 实验2.2.4 结论 3.总结 摘要 本周学习了生成对抗网络(GAN)与风格迁移技术在图像生成中的应用。首先介绍了GAN模型中生成器与判别器…

three.js+WebGL踩坑经验合集(8.1):用于解决z-fighting叠面问题的polygonOffset远没我们想象中那么简单

初八开工后,笔者又停了下来,今天总算又抽出来了一丢丢的时间继续。今天打算给大家聊聊困扰很多3D开发者的z-fighting叠面闪烁问题。 该问题从严格意义上说,是属于业务问题,因为现实中是不会有完全重叠的两个平面物体存在&#xf…

2025年-G4-Lc78--121. 买卖股票的最佳时机--(java版)

1.题目描述 2.思路 思路1: 做两轮排序,第一轮排序找到最小的那个数,然后再判断最小的那个数之后还有其他数吗,如果有在进行排序,选出最大的那个数,然后值相减。 问题要点: (1)你需要…