Skip to content

KEDA(Kubernetes Event-Driven Autoscaling)

讓 Kubernetes 工作負載根據外部事件(如 Queue 深度、Metrics 數值)自動水平擴縮的開源框架。

概述

KEDA(Kubernetes Event-Driven Autoscaling)是 CNCF 的沙箱專案,解決 Kubernetes 原生 HPA(Horizontal Pod Autoscaler)只能基於 CPU/Memory 擴縮的限制。KEDA 透過 ScaledObject 資源定義擴縮規則,支援豐富的外部事件來源(稱為 Scaler),包括 RabbitMQ Queue 深度、Azure Service Bus、Kafka Topic Lag、Prometheus 指標等超過 50 種。

KEDA 本質上是一個 HPA 的擴充層——它監聽外部事件來源,將事件數量轉換為 metrics,再驅動標準 HPA 進行擴縮。當 Queue 為空時,KEDA 可以將 Deployment 縮至零個 Pod(scale-to-zero),這是原生 HPA 無法做到的。

核心內容

架構組件

  • KEDA Operator:監聽 ScaledObject CR,負責建立/刪除對應的 HPA,並處理 scale-to-zero 邏輯
  • Metrics Server:作為 Kubernetes External Metrics API 的實作,提供外部事件數據給 HPA
  • ScaledObject:使用者定義擴縮規則的 Custom Resource,指定目標 Deployment、觸發條件(Trigger)與擴縮參數
  • TriggerAuthentication:集中管理連線外部系統所需的認證資訊(Secret 引用)

安裝方式

KEDA 透過 Helm Chart 安裝,部署至 keda namespace:

bash
helm install keda kedacore/keda --version 2.10.0 \
  --insecure-skip-tls-verify \
  --namespace keda

生產環境應配置正確的 TLS 憑證,移除 --insecure-skip-tls-verify

與 HPA 的關係

KEDA 不替換 HPA,而是在其上建立抽象層。當 ScaledObject 建立後,KEDA 自動建立對應的 HPA 資源,並持續同步外部 metrics 給 HPA 決策。因此 KEDA 的 ScaledObject 與手動建立的 HPA 不應同時作用於同一個 Deployment,否則會發生衝突。

ScaledObject 範例(CPU / Memory)

KEDA 的 CPU 和 Memory Scaler 可達成與原生 HPA 相同效果,但以 ScaledObject 宣告式管理:

yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: cpu-scaledobject
  namespace: default
spec:
  scaleTargetRef:
    name: nginx-test
  minReplicaCount: 1
  maxReplicaCount: 20
  triggers:
  - type: cpu
    metricType: Utilization
    metadata:
      value: "100"
  - type: memory
    metricType: Utilization
    metadata:
      value: "120"
  • metricType 可選 Utilization(相對於 requests 的百分比)或 AverageValue(絕對值)
  • 可同時設定多個 trigger,任一條件達標即觸發擴縮
  • minReplicaCount: 1 保留最低一個副本;改為 0 即啟用 scale-to-zero

關鍵要點

  • KEDA 解決 HPA 只能基於 CPU/Memory 的限制,支援 50+ 種外部事件來源
  • Scale-to-zero 是 KEDA 的核心優勢,適合 worker 類型的批次處理工作負載
  • KEDA 透過 ScaledObject CR 宣告式定義擴縮規則,與 GitOps 工作流整合良好
  • 安裝時 --insecure-skip-tls-verify 僅適用於測試環境

實際應用

典型使用場景:RabbitMQ 消費者服務,當 Queue 中有待處理訊息時自動擴縮 Worker Pods,Queue 清空後縮至零。這樣的事件驅動擴縮比固定副本數更節省資源,也比時間排程更能即時回應工作量變化。搭配 RabbitMQ on Kubernetes 部署 中的 rabbitmq_prometheus 插件,也可以將 Prometheus 指標作為擴縮觸發條件。

部署設定參考

以下為安裝指令,供日後查詢與複製使用。

安裝指令

bash
# 新增 Helm Repo
helm repo add kedacore https://kedacore.github.io/charts
helm repo update

# 安裝 KEDA v2.10.0
helm install keda kedacore/keda \
  --version 2.10.0 \
  --insecure-skip-tls-verify \
  --namespace keda

相關概念

來源