KEDA下一代弹性伸缩工具

1.简介

KEDA (Kubernetes-based Event-Driven Autoscaling) 是一个强大的开源组件,专为 Kubernetes 环境设计,用于实现基于事件的弹性伸缩。下面我为你详细介绍一下 KEDA。

2.工作原理

KEDA 的核心在于事件驱动的自动伸缩机制。它与 Kubernetes 原生的 HPA (Horizontal Pod Autoscaler) 并非替代关系,而是协同工作

简单来说:

  • 当需要将工作负载的副本数缩到“闲时”副本数(包括缩到 0),或从“闲时”副本数扩容时,由 KEDA 直接修改工作负载的副本数

  • 其他情况下的扩缩容则由 HPA 负责。KEDA 会自动创建并管理一个 HPA 对象,并向 HPA 提供其收集到的外部指标数据(External Metrics),HPA 再利用这些指标数据驱动扩缩容。这意味着 KEDA 复用了 HPA 的成熟能力。

KEDA 通过其定义的 CRD(如 ScaledObjectScaledJob)来配置伸缩规则,并内置了丰富的 Scaler(伸缩器),用于从各种外部事件源(如消息队列、数据库、监控系统等)获取指标。

3.安装与部署

使用 Helm 安装 KEDA 

  1. 添加 KEDA 的 Helm 仓库

    helm repo add kedacore https://kedacore.github.io/charts helm repo update
    
  2. 创建命名空间(如果尚未存在):

     kubectl create namespace keda
  3. 使用 Helm 安装 KEDA

     helm install keda kedacore/keda --namespace keda

安装完成后,你可以使用 kubectl get pods -n keda 来查看 KEDA 组件的运行状态。

4.配置示例

下面是一个简单的 ScaledObject 配置示例:

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: cpu-scaledobject
  namespace: default
spec:
  scaleTargetRef:
    name: nginx-deployment  # 指定要伸缩的目标 Deployment
  minReplicaCount: 1    # 最小副本数,可以将副本数调整为0
  maxReplicaCount: 10   # 最大副本数
  triggers:
  - type: cpu           # 触发器类型为 cpu
    metadata:
      type: Utilization
      value: "50"       # 目标 CPU 利用率阈值设为 50%

根据 CPU/内存压力扩容:

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: demo
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: a
  minReplicaCount: 10
  maxReplicaCount: 1000
  triggers:
    - type: memory
      metricType: Utilization
      metadata:
        value: "60"
    - type: cpu
      metricType: Utilization
      metadata:
        value: "60"

定时水平伸缩(Cron 触发器):

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: demo
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: demo
  minReplicaCount: 2
  maxReplicaCount: 1000
  triggers:
    - type: cron
      metadata:
        timezone: Asia/Shanghai
        start: 30 9 * * * # 早上9:30开始扩容
        end: 30 10 * * *  # 早上10:30结束,期间副本数设为200
        desiredReplicas: "200"
    - type: cron
      metadata:
        timezone: Asia/Shanghai
        start: 30 17 * * * # 下午5:30开始扩容
        end: 30 18 * * *   # 下午6:30结束,期间副本数设为200
        desiredReplicas: "200"
    - type: memory # 同时配置资源指标触发器,应对突发流量
      metricType: Utilization
      metadata:
        value: "60"
    - type: cpu
      metricType: Utilization
      metadata:
        value: "60"

5.优势

  • 丰富的事件源支持:内置大量 Scaler,轻松集成各种外部系统,无需复杂适配。

  • 支持缩容到零:当完全没有事件时,可以将副本数缩容到零,实现极致的成本节约。

  • 与 HPA 无缝集成:复用 HPA 的稳定能力,同时提供更灵活的触发机制。

  • 云原生且轻量:本身设计为 Kubernetes 的单一用途轻量组件,易于安装和运维。

  • CNCF 毕业项目:表明其成熟度、稳定性和社区活跃度都已达到很高水平,可放心用于生产环境。

 

6.注意事项

KEDA 确实可以将副本数缩减到 0。这实际上是 KEDA 的一个标志性特性,也是它区别于 Kubernetes 原生 HPA 的一个重要方面,但在应用时也需要考虑冷启动延迟问题,即:副本从 0 开始扩容时,应用的启动时间(冷启动)可能会对请求的响应时间有一定影响。你需要确保应用能够处理这种延迟,或者配置就绪检查来避免在应用完全启动前接收流量。