Appearance
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相關概念
- Kubernetes HPA 水平自動擴縮 — K8s 原生 HPA(autoscaling/v2):KEDA 在其上建立的抽象層
- RabbitMQ on Kubernetes 部署 — KEDA 常見的事件來源之一,以 Queue 深度觸發擴縮
- Prometheus on Kubernetes 部署 — KEDA 可基於 Prometheus 指標進行擴縮
- Kubernetes RBAC 帳號管理 — KEDA 需要適當的 RBAC 權限存取目標 Deployment
- RabbitMQ Exporter 部署 — 採集 RabbitMQ 指標供 KEDA ScaledObject 使用