Skip to content

KEDA — 事件驱动弹性伸缩

什么是 KEDA

KEDA(Kubernetes Event-Driven Autoscaling)扩展了 HPA,支持基于外部事件源(消息队列、数据库、HTTP 请求等)进行伸缩,最重要的是支持缩容到 0

安装

bash
helm repo add kedacore https://kedacore.github.io/charts
helm install keda kedacore/keda --namespace keda --create-namespace

ScaledObject 示例

Kafka 消息队列

yaml
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: kafka-consumer-scaler
spec:
  scaleTargetRef:
    name: kafka-consumer
  minReplicaCount: 0    # 无消息时缩容到 0
  maxReplicaCount: 50
  pollingInterval: 15
  cooldownPeriod: 300
  triggers:
  - type: kafka
    metadata:
      bootstrapServers: kafka-broker:9092
      consumerGroup: my-consumer-group
      topic: orders
      lagThreshold: "100"      # 每个副本处理 100 条消息积压
      offsetResetPolicy: latest

Redis 列表

yaml
triggers:
- type: redis
  metadata:
    address: redis:6379
    listName: task-queue
    listLength: "10"
  authenticationRef:
    name: redis-auth

Prometheus 指标

yaml
triggers:
- type: prometheus
  metadata:
    serverAddress: http://prometheus:9090
    metricName: http_requests_pending
    query: sum(http_requests_pending{service="my-app"})
    threshold: "100"
    activationThreshold: "10"  # 从 0 扩容的阈值

HTTP 请求(需要 KEDA HTTP Add-on)

yaml
apiVersion: http.keda.sh/v1alpha1
kind: HTTPScaledObject
metadata:
  name: my-app-http-scaler
spec:
  hosts:
  - my-app.example.com
  targetPendingRequests: 100
  scaleTargetRef:
    deployment: my-app
    service: my-app
    port: 80
  replicas:
    min: 0
    max: 30

TriggerAuthentication(认证配置)

yaml
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
  name: kafka-auth
spec:
  secretTargetRef:
  - parameter: sasl
    name: kafka-secret
    key: sasl-mechanism
  - parameter: username
    name: kafka-secret
    key: username
  - parameter: password
    name: kafka-secret
    key: password
  - parameter: tls
    name: kafka-secret
    key: tls

常用操作

bash
# 查看 ScaledObject 状态
kubectl get scaledobject
kubectl describe scaledobject kafka-consumer-scaler

# 查看 HPA(KEDA 底层创建)
kubectl get hpa

# 查看伸缩事件
kubectl get events --field-selector reason=KEDAScaleTargetActivated

本站内容由 褚成志 整理编写,仅供学习参考