基于 KEDA 的 Kubernetes 自动缩放机制

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 基于 KEDA 的 Kubernetes 自动缩放机制

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



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,对传入事件做出反应并优化资源利用率。


KEDA 优缺点

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


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


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


  • 额外的复杂性: 集成和配置 KEDA 需要额外设置和管理开销,需要根据应用复杂性进行权衡。
  • 学习曲线: KEDA 引入了新的概念和工具,对于新的项目开发人员和运维人员来说,可能需要一些学习。


通过 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

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
消息中间件 Java Kafka
Kafka ACK机制详解!
本文深入剖析了Kafka的ACK机制,涵盖其原理、源码分析及应用场景,并探讨了acks=0、acks=1和acks=all三种级别的优缺点。文中还介绍了ISR(同步副本)的工作原理及其维护机制,帮助读者理解如何在性能与可靠性之间找到最佳平衡。适合希望深入了解Kafka消息传递机制的开发者阅读。
172 0
|
3月前
|
Kubernetes 监控 Perl
在k8S中,自动扩容机制是什么?
在k8S中,自动扩容机制是什么?
|
3月前
|
存储 网络安全 API
【Azure Service Bus】 Service Bus如何确保消息发送成功,发送端是否有Ack机制 
【Azure Service Bus】 Service Bus如何确保消息发送成功,发送端是否有Ack机制 
|
3月前
|
Kubernetes Java 调度
在K8S中,Pod突然挂掉,K8S有什么机制或功能自动清除Pod?
在K8S中,Pod突然挂掉,K8S有什么机制或功能自动清除Pod?
|
3月前
|
Kubernetes 安全 Linux
在k8S中,PodSecurityPolicy 机制能实现哪些安全策略?
在k8S中,PodSecurityPolicy 机制能实现哪些安全策略?
|
3月前
|
Kubernetes 安全 调度
在k8S中, PodSecurityPolicy机制是什么?
在k8S中, PodSecurityPolicy机制是什么?
|
3月前
|
Kubernetes 监控 Perl
在K8S中,RC的机制是什么?
在K8S中,RC的机制是什么?
|
6月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理实践深入理解PHP的命名空间与自动加载机制
【5月更文挑战第30天】 在容器化和微服务架构日益普及的背景下,Kubernetes 已成为众多企业的首选容器编排工具。然而,随之而来的挑战是集群的监控与日志管理。本文将深入探讨 Kubernetes 集群监控的最佳实践,包括节点资源使用情况、Pods 健康状态以及网络流量分析等关键指标的监控方法。同时,我们也将讨论日志聚合、存储和查询策略,以确保快速定位问题并优化系统性能。文中将介绍常用的开源工具如 Prometheus 和 Fluentd,并分享如何结合这些工具构建高效、可靠的监控和日志管理系统。
|
6月前
|
消息中间件 Java Spring
五、消息确认机制(ACK)
五、消息确认机制(ACK)
213 1
|
11月前
|
存储 Kubernetes Unix
k8s教程(Volume篇)-CSI存储机制详解
k8s教程(Volume篇)-CSI存储机制详解
1407 0
k8s教程(Volume篇)-CSI存储机制详解