基于KEDA的Kubernetes自动缩放机制

news2024/11/15 1:50:17

KEDA以事件驱动的方式实现Kubernetes Pod的动态自动扩容机制,以满足不同的负载需求,从而提高应用可伸缩性和弹性。原文: Dynamic Scaling with Kubernetes Event-driven Autoscaling (KEDA)

alt

Kubernetes是容器编排平台的事实标准,已经彻底改变了部署和管理应用的方式。对应用进行有效扩容的关键挑战之一是确保基础设施适应工作负载的动态需求,这就是Kubernetes pod autoscaling发挥作用的地方,可以根据预定义指标自动调整pod数量。虽然Kubernetes提供了内置的自动缩放功能,但Kubernetes事件驱动自动缩放(KEDA, Kubernetes Event-driven Autoscaling)项目提供了更强大的解决方案来增强和扩展自动缩放功能。本文将探讨Kubernetes和KEDA中内置自动缩放的区别,重点介绍KEDA的优缺点,并提供真实用例来展示其潜力。

Kubernetes内置自动缩放

Kubernetes提供了一种称为水平Pod自动缩放(HPA,Horizontal Pod Autoscaler)的本地自动缩放机制。HPA可以定义指标(例如CPU利用率或基于指标服务器的自定义指标),从而让Kubernetes根据指定阈值自动调整pod副本数量。这种内置解决方案适用于许多场景,但在事件驱动的工作负载或基于自定义指标的扩展方面存在局限性。

Kubernetes事件驱动自动缩放(KEDA,Kubernetes Event-driven Autoscaling)

KEDA(Kubernetes事件驱动自动缩放)项目,是一个开源项目,将Kubernetes的自动缩放功能扩展到更广泛的工作负载。KEDA充当事件源(如消息队列或流平台)与Kubernetes之间的桥梁,支持基于事件驱动触发器的自动扩容。利用KEDA,可以实时扩展应用pod,对传入事件做出反应并优化资源利用率。

alt
KEDA优缺点

与Kubernetes内置的自动缩放功能相比,KEDA有如下优势:

  • 事件驱动扩容: KEDA支持基于各种事件源的自动扩容,可以处理突发工作负载或适应不可预测的需求峰值。
  • 支持自定义指标: 与HPA不同,KEDA可以基于自定义指标进行扩容,从而在定义特定于应用需求的扩容触发器时提供更多灵活性。
  • 资源效率: 当没有工作负载时,KEDA可以缩容到零副本,从而有效降低资源消耗和成本。
  • 可扩展架构: KEDA与各种事件源无缝集成,并通过可插拔架构进行扩展,可以根据特定需求进行调整。

尽管有很多好处,但使用KEDA也有一些注意事项:

  • 额外的复杂性: 集成和配置KEDA需要额外设置和管理开销,需要根据应用复杂性进行权衡。
  • 学习曲线: KEDA引入了新的概念和工具,对于新的项目开发人员和运维人员来说,可能需要一些学习。
alt
通过Helm 3安装KEDA
  1. 添加Helm repo
helm repo add kedacore https://kedacore.github.io/charts
  1. 更新Helm repo
helm repo update
  1. 安装 KEDAHelm chart
kubectl create namespace keda helm install keda kedacore/keda --namespace keda
用例

基于Azure服务总线队列长度的Kubernetes pod自动伸缩

在这个用例中,我们有一个微服务应用程序,负责处理来自Azure服务总线队列的消息。工作负载是偶尔发生的,根据传入流量具有不同的队列长度。我们希望动态扩展Kubernetes pod,以便通过KEDA有效的处理消息。

前置条件

  1. 安装了KEDA的Kubernetes集群。
  2. 访问队列的Azure服务总线和凭据。

步骤1: 部署示例应用程序。首先部署应用,侦听Azure服务总线队列并处理消息。我们用一个简单的Python应用程序进行演示。

# app.py

from azure.servicebus import ServiceBusClient, ServiceBusMessage

def process_message(message):
    # Process the message here
    print(f"Processing message: {message}")

# Configure Azure Service Bus connection string
connection_string = "your-connection-string"

# Create a Service Bus client
service_bus_client = ServiceBusClient.from_connection_string(connection_string)

# Create a receiver to listen to the queue
receiver = service_bus_client.get_queue_receiver(queue_name="your-queue-name")

# Start receiving and processing messages
with receiver:
    for message in receiver:
        process_message(message)
        message.complete()  # Mark the message as completed after processing

将上述代码部署为Kubernetes中的容器化应用程序。

步骤2: 配置KEDA支持自动缩放。为了使KEDA能够监控队列长度并触发自动缩放,需要创建ScaledObject并进行相应部署。

# scaledobject.yaml

apiVersion: keda.k8s.io/v1alpha1
kind: ScaledObject
metadata:
  name: queue-scaler
spec:
  scaleTargetRef:
    deploymentName: your-deployment-name
  triggers:
    - type: azure-servicebus
      metadata:
        connection: "your-connection-string"
        queueName: "your-queue-name"
        name: queue-length-trigger
        queueLength: "5"  # Scale when the queue length is greater than or equal to 5
# deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: your-deployment-name
spec:
  replicas: 1  # Initial number of replicas
  template:
    spec:
      containers:
        - name: your-container-name
          image: your-container-image

将上述YAML文件应用到Kubernetes集群,以创建ScaledObject和部署。

步骤3: 现在,当消息到达Azure服务总线队列时,KEDA将监控队列长度并根据定义的阈值触发自动缩放(在本例中,阈值为队列长度大于或等于5)。

可以通过监控部署的副本数量来观察自动伸缩:

kubectl get deployment your-deployment-name

当队列长度超过定义的阈值时,KEDA将自动扩展副本数量以处理增加的工作负载。一旦队列长度减少,KEDA将相应的减少副本,从而优化资源利用率。

这个用例演示了KEDA如何根据Azure服务总线队列的长度自动扩展Kubernetes pod。通过利用KEDA的可扩展性和事件驱动的扩展功能,可以确保有效的资源利用和对不同工作负载的响应。示例说明了KEDA在基于自定义指标动态调整pod数量方面的强大功能,使其成为一种有价值的扩展工具。

结论

Kubernetes pod自动伸缩是有效管理动态工作负载的基本特性。Kubernetes通过HPA提供了内置的自动缩放功能,KEDA为事件驱动缩放和自定义指标提供了强大扩展。通过将KEDA整合到Kubernetes集群中,可以释放实时自动扩展的潜力,使应用程序能够无缝适应不断变化的需求。虽然KEDA引入了额外的复杂性,但有助于提高应用集群的资源效率、可扩展性和可伸缩性。


你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

- END -

本文由 mdnice 多平台发布

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vp与相机连接

1.网线 2.相机电源线 1.相机电源线 接头 (使用红色和黑色 线头要串联) 1.光源连接口 2.光源控制器 开关 3.光源控制器通电接口 4.光源自动感应接口 (一般用于自动控制光源 开关) 1.两种不同类型的光源 1.光源亮度控制 2.切…

Leetcode—209.长度最小的子数组【中等】

2023每日刷题&#xff08;五十六&#xff09; Leetcode—209.长度最小的子数组 实现代码 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int left 0, right 0;int ans nums.size() 1, s 0;for(; right < nums.size(); righ…

基于单片机的自动售货机(论文+源码)

1.系统设计 本设计以这样的工作流程开始自动售货机的自动售货过程&#xff1a; 启动系统&#xff0c;开始待机&#xff1b;顾客通过按键选择商品的种类以及数量并确认&#xff1b; 售货机检查是否有足够的货物并通过LCD提示等待顾客投币&#xff1b;顾客投入货币&#xff0c;…

使用yum/dnf管理软件包

本章主要介绍使用 yum 对软件包进行管理。 yum 的介绍搭建yum源创建私有仓库yum客户端的配置yum的基本使用使用第三方yum源 使用rpm安装包时经常会遇到一个问题就是包依赖&#xff0c;如下所示。 [rootrhel03 ~]# rpm -ivh /mnt/AppStream/Packages/httpd-2.4.37-41.modulee…

【漏洞复现】云时空社会化商业ERP系统gpy文件上传

漏洞描述 用友软件的先进管理理念,汇集各医药企业特色管理需求,通过规范各个流通环节从而提高企业竞争力、降低人员成本,最终实现全面服务于医药批发、零售连锁企业的信息化建设的目标,是一款全面贴合最新GSP要求的医药流通行业一站式管理系统。 时空云社会化商业ERP gpy…

GNSS - PPP软件 - GAMP 在VS2019/2022下完成调试、跑通程序(超详细!)

目录 一、前期准备 二、调试详细步骤 1.VS中新建项目 2.复制源码至项目文件夹 3.将源码中“.c”文件和“.h”文件添加至项目指定位置 4.修改项目属性&#xff1a; (1)【 配置属性 -> C/C ->预处理器 ->预处理器定义】添加如下 (2)【配置属性->链接器->调…

产品固件烧写方案

1、前言 一成熟的量产的嵌入式产品&#xff0c;软件一般分为BootLoader和App&#xff0c;BootLoader用于启动校验、App升级、App版本回滚等功能&#xff0c;BootLoader在cpu上电第一阶段中运行&#xff0c;之后跳转至App地址执行应用程序。 因此&#xff0c;在发布固件的时候&a…

12.11 C++ 作业

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…

[UNILM]论文实现:Unified Language Model Pre-training for Natural Language.........

文章目录 一、完整代码二、论文解读2.1 介绍2.2 架构2.3 输入端2.4 结果 三、过程实现四、整体总结 论文&#xff1a;Unified Language Model Pre-training for Natural Language Understanding and Generation 作者&#xff1a;Li Dong, Nan Yang, Wenhui Wang, Furu Wei, Xia…

编程实战:自己编写HTTP服务器(系列4:查看文件、下载等一般功能)

系列入口&#xff1a;编程实战&#xff1a;自己编写HTTP服务器&#xff08;系列1&#xff1a;概述和应答&#xff09;-CSDN博客 本文介绍各种功能的实现。大部分是特定内置入口。 目录 一、默认页 二、查看文件 三、关闭服务 四、下载页面 一、默认页 前面在已经介绍过重定…

UE4/UE5 修改/还原场景所有Actor的材质

使用蓝图方法&#xff1a; 1.修改场景所有Actor 材质&#xff1a; Wirframe&#xff1a;一个材质类 MatList&#xff1a;获取到的所有模型的全部材质 的列表 TempAllClass&#xff1a;场景中所有获取的 Actor 的列表 功能方法如下&#xff1a; 蓝图代码可复制在&#xff1a…

MongoDB在Windows系统和Linux系统中实现自动定时备份

本文主要介绍MongoDB在Windows系统和Linux系统中如何实现自动定时备份。 目录 MongoDB在Windows系统中实现自动定时备份MongoDB在Linux系统中实现自动定时备份备份步骤备份恢复 MongoDB在Windows系统中实现自动定时备份 要在Windows系统中实现自动定时备份MongoDB数据库&#…

界面控件DevExpress中文教程 - 如何用Office File API组件填充PDF表单

DevExpress Office File API是一个专为C#, VB.NET 和 ASP.NET等开发人员提供的非可视化.NET库。有了这个库&#xff0c;不用安装Microsoft Office&#xff0c;就可以完全自动处理Excel、Word等文档。开发人员使用一个非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

《Spring Cloud Alibaba 从入门到实战》分布式消息(事件)驱动

分布式消息&#xff08;事件&#xff09;驱动 1、简介 事件驱动架构(Event-driven 架构&#xff0c;简称 EDA)是软件设计领域内的一套程序设计模型。 这套模型的意义是所有的操作通过事件的发送/接收来完成。 传统软件设计 举个例子&#xff0c;比如一个订单的创建在传统软…

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 NLP 部分

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 NLP 部分 概述NLP 简介文本处理词嵌入上下文理解 文本数据加载to_device 函数构造数据加载样本数量 len获取样本 getitem 分词构造函数调用函数轮次嵌入 RobertaRoberta 创新点NSP (Next Sentence Prediction…

如何将用户有过行为的item用list形式记录下来,另外如何计算list里的个数

导语&#xff1a; 最近做项目&#xff0c;发现有些语法想一想是知道&#xff0c;但实际操作起来跟想的情况不一样哈哈。不是遇见bug就是输出的结果不是自己想要的&#xff0c;CSDN跟知乎找了很多没怎么解决&#xff0c;后面多摸索多实操终于解决&#xff01; test_data[item_…

Oracle中LISTAGG 函数 的使用

概念&#xff1a;对于查询中的每个组&#xff0c;LISTAGG 聚合函数根据 ORDER BY 表达式对该组的行进行排序&#xff0c;然后将值串联成一个字符串

Appium微信小程序自动化环境准备

一、前置说明 微信从8.0.19开始内核从x5换成xweb之后&#xff0c;原先的开启webview调试的原方案已经会报503错误。 点击下面的链接&#xff0c;都会报503错误&#xff1a; http://debugmm.qq.com/?forcex5ture http://debugx5.qq.com 微信内核升级为xweb之后&#xff0c;需要…

数据结构之----逻辑结构、物理结构

数据结构之----逻辑结构、物理结构 目前我们常见的数据结构分别有&#xff1a; 数组、链表、栈、队列、哈希表、树、堆、图 而它们可以从 逻辑结构和物理结构两个维度进行分类。 什么是逻辑结构&#xff1f; 逻辑结构是指数据元素之间的逻辑关系&#xff0c;而逻辑结构又分为…

有趣的数学 数学建模入门三 数学建模入门示例两例 利用微积分求解

一、入门示例1 1、问题描述 某宾馆有150间客房&#xff0c;经过一段时间的经营&#xff0c;该宾馆经理得到一些数据&#xff1a;如果每间客房定价为200元&#xff0c;入住率为55&#xff05;&#xff1b;定价为180元&#xff0c;入住率为65&#xff05;&#xff1b;定价为160元…