基于 KEDA 的 Kubernetes 自动缩放机制

简介: 基于 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

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
14天前
|
运维 Kubernetes 监控
Kubernetes 集群的持续性能优化实践
【4月更文挑战第26天】 在动态且不断增长的云计算环境中,维护高性能的 Kubernetes 集群是一个挑战。本文将探讨一系列实用的策略和工具,旨在帮助运维专家监控、分析和优化 Kubernetes 集群的性能。我们将讨论资源分配的最佳实践,包括 CPU 和内存管理,以及集群规模调整的策略。此外,文中还将介绍延迟和吞吐量的重要性,并提供日志和监控工具的使用技巧,以实现持续改进的目标。
|
2天前
|
Kubernetes Java API
Kubernetes详解(三)——Kubernetes集群组件
Kubernetes详解(三)——Kubernetes集群组件
12 1
|
7天前
|
运维 监控 Kubernetes
Kubernetes 集群的监控与维护策略
【5月更文挑战第4天】 在当今微服务架构盛行的时代,容器化技术已成为软件开发和部署的标准实践。Kubernetes 作为一个开源的容器编排平台,因其强大的功能和灵活性而广受欢迎。然而,随着 Kubernetes 集群规模的扩大,集群的监控和维护变得日益复杂。本文将探讨 Kubernetes 集群监控的重要性,分析常见的监控工具,并提出一套有效的集群维护策略,以帮助运维人员确保集群的健康运行和高可用性。
39 10
|
8天前
|
存储 运维 监控
Kubernetes 集群的持续监控与优化策略
【5月更文挑战第3天】在微服务架构和容器化部署日益普及的背景下,Kubernetes 已成为众多企业的首选容器编排平台。然而,随着集群规模的增长和业务复杂度的提升,有效的集群监控和性能优化成为确保系统稳定性和提升资源利用率的关键。本文将深入探讨针对 Kubernetes 集群的监控工具选择、监控指标的重要性解读以及基于数据驱动的性能优化实践,为运维人员提供一套系统的持续监控与优化策略。
|
10天前
|
运维 Kubernetes 监控
Kubernetes 集群的监控与维护策略
【4月更文挑战第30天】 在现代云计算环境中,容器化技术已成为应用程序部署和管理的重要手段。其中,Kubernetes 作为一个开源的容器编排平台,以其强大的功能和灵活性受到广泛欢迎。然而,随之而来的是对 Kubernetes 集群监控和维护的复杂性增加。本文将探讨针对 Kubernetes 集群的监控策略和维护技巧,旨在帮助运维人员确保集群的稳定性和高效性。通过分析常见的性能瓶颈、故障诊断方法以及自动化维护工具的应用,我们将提供一套实用的解决方案,以优化 Kubernetes 环境的性能和可靠性。
|
11天前
|
运维 Kubernetes 监控
Kubernetes集群的持续性能优化策略
【4月更文挑战第30天】 在动态且不断扩展的云计算环境中,保持应用性能的稳定性是一个持续的挑战。本文将探讨针对Kubernetes集群的持续性能优化策略,旨在为运维工程师提供一套系统化的性能调优框架。通过分析集群监控数据,我们将讨论如何诊断常见问题、实施有效的资源管理和调度策略,以及采用自动化工具来简化这一过程。
|
11天前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理策略
【4月更文挑战第30天】 在微服务架构日益普及的当下,容器化技术与编排工具如Kubernetes成为了运维领域的重要话题。有效的监控和日志管理对于保障系统的高可用性和故障快速定位至关重要。本文将探讨在Kubernetes环境中实施监控和日志管理的最佳实践,包括选用合适的工具、部署策略以及如何整合这些工具来提供端到端的可见性。我们将重点讨论Prometheus监控解决方案和EFK(Elasticsearch, Fluentd, Kibana)日志管理堆栈,分析其在Kubernetes集群中的应用,并给出优化建议。
|
11天前
|
Kubernetes 应用服务中间件 nginx
K8S二进制部署详解,一文教会你部署高可用K8S集群(二)
K8S二进制部署详解,一文教会你部署高可用K8S集群(二)
|
11天前
|
Kubernetes 网络安全 数据安全/隐私保护
K8S二进制部署详解,一文教会你部署高可用K8S集群(一)
K8S二进制部署详解,一文教会你部署高可用K8S集群(一)
|
12天前
|
SQL Kubernetes 调度
【一文看懂】部署Kubernetes模式的Havenask集群
本次分享内容为havenask的kubernetes模式部署,由下面2个部分组成(部署Kubernetes模式Havenask集群、 Kubernetes模式相关问题排查),希望可以帮助大家更好了解和使用Havenask。
26 1