基于KEDA的Kubernetes自动缩放机制

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.hqwc.cn/news/267705.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【TCP/IP协议】LDAP,轻型目录访问协议(Lightweight Directory Access Protocol)

文章目录 LDAP名词解释LDAP protocolLDAP协议的特点LDAP的主要功能和用途LDAP工作原理LDAP的工作步骤LDAP查询范例 LDAP数据组件LDAP操作类型LDAP认证类型LDAP可能的风险如何保护LDAP推荐阅读 LDAP名词解释 LDAP,全称轻型目录访问协议(Lightweight Dire…

STM32超声波——HC_SR04

文章目录 一.超声波图片二.时序图三.超声波流程四.单位换算五.取余计算六.换算距离七.超声波代码 一.超声波图片 测量距离:2cm——400cm 二.时序图 (1).以下时序图要先提供一个至少10us的脉冲触发信号,告诉单片机我准备好了,然后该超声波…

springcloud微服务篇--1.认识微服务

一、服务架构演变。 单体架构: 将业务的所有功能集中在一个项目中开发,打成一个包部署。 优点:架构简单 ,部署成本低。 缺点:耦合度高 分布式架构 根据业务功能对系统进行拆分,每个业务模块作为独立项…

【FAQ】推送前台应用的通知处理功能没生效,如何进行排查?

一、前台应用的通知处理简介 在调用推送接口时可以设置“foreground_show”字段控制前台应用的通知栏消息是否通过NC展示。“foreground_show”默认值为“true”,应用在前台时由NC展示通知栏消息;当设置为“false”时,应用在前台时&#xff…

Kotlin基础——基础内容

文章目录 1 函数和变量1.1 基本程序1.2 函数1.3 变量1.3.1 变量的类型推导1.3.2 可变变量和不可变量1.3.3 变量使用规则 1.4 字符串模板 2 类和属性2.1 属性2.2 自定义访问器2.3 目录和包2.3.1 同包访问2.3.2 不同包导入2.3.3 包名类名定义规则 3 枚举和“when”3.1 声明枚举类…

医学多模态模型总结(一)

概念 医学多模态大模型是指利用多种不同的医学数据源和模型,通过深度学习和人工智能技术,构建一个综合性的大型模型,以实现更加准确和全面的医学数据分析和预测。 这种模型可以同时处理多种医学数据类型,如医学图像、病历文本、…

【Jeecg Boot 3 - 第二天】2.1、nginx 部署 JEECGBOOT VUE3

一、场景 二、实战 ▶ 2.1、打包(build 前端) > Stage 1:修改配置文件 .env.production(作用:指向后端接口地址) > Stage 2:点击build(作用&#xff1…

vue宝典之项目结构介绍

文章目录 🍁前言🍁Vue.js基本概念🍁Vue.js核心特性🍁Vue.js应用场景🍁Vue项目结构🍁Vue开发流程 目前在学习vue项目,之前只是学习vue中基本语法,当接触项目时发现vue项目结构之间配置…

我的NPI项目之Android 显示 -- 背光的电路小知识

由于使用的高通平台一直在演化,从SDM660,QCM4290,QCM4490再到QCM6490。产品的背光设计也是一直在迭代。 简单罗列了一下所经历的一些设计,简单的背光也涉及到了很多学问。 先说有哪些类型: 1. SDM660上由PMIC提供了wled给背光, 透过驱动直…

cordic 算法学习记录

参考:b站教学视频FPGA:Cordic算法介绍与实现_哔哩哔哩_bilibili FPGA硬件实现加减法、移位等操作比较简单,但是实现乘除以及函数计算复杂度高且占用资源多,常见的计算三角函数/平方根的求解方式有①查找表:先把函数对应…

记录 DevEco 开发 HarmonyOS 应用开发问题记录 【持续更新】

HarmonyOS 应用开发问题记录 HarmonyOS 应用开发问题记录一、预览器无法成功运行?如何定位预览器无法编译问题? 开发遇到的问题 HarmonyOS 应用开发问题记录 一、预览器无法成功运行? 大家看到这个是不是很头疼? 网上能看到许多方案,基本都是关闭一个配置 但是他们并…

【ZYNQ】AXI4总线接口协议学习

建议翻看着底部的参考文档资料和本文一起辅助阅读 本文带你详细的了解AXI总线协议,并且基于官方手册,能够提高你的手册阅读能力。 什么是AXI AXI 的英文全称是 Advanced eXtensible Interface,即高级可扩展接口,它是 ARM 公司所提…