4. 事件源通用参数:authenticationRef、metadata、name、type、useCachedMetrics、fallback 配置

KEDA 的 ScaledObject 是连接事件源与工作负载的核心 CRD。每个 ScaledObject 必须定义一个事件源(triggers 字段),而事件源中的通用参数决定了 KEDA 如何连接外部系统、获取指标以及处理异常。本章逐一拆解 authenticationRef、metadata、name、type、useCachedMetrics 和 fallback 六个通用参数,并给出生产级配置建议。

4.1 参数总览与作用域

以下表格概括了每个通用参数的作用域、是否必填及典型用途:

参数名 作用域 必填 典型用途
type 事件源级别 是 指定事件源类型(如 prometheus、kafka、rabbitmq)
name 事件源级别 否 为事件源命名,便于日志和监控区分
metadata 事件源级别 是 传递事件源特有的连接参数和查询条件
authenticationRef 事件源级别 否 引用 TriggerAuthentication 或 ClusterTriggerAuthentication 资源
useCachedMetrics 事件源级别 否 是否使用缓存指标(默认 false)
fallback 事件源级别 否 当事件源不可用时,使用静态回退副本数
最佳实践: 在同一个 ScaledObject 中定义多个事件源时,每个事件源独立配置上述参数。KEDA 会取所有事件源返回的最大值作为目标副本数。

4.2 type 与 name:事件源的身份标识

type 是事件源的唯一标识符,KEDA 根据此字段加载对应的 Scaler 插件。常见的内置类型包括 prometheus、kafka、rabbitmq、aws-sqs-queue、azure-servicebus 等。社区或自定义 Scaler 也可通过 type 字段注册。

name 为可选字段,用于在日志、指标和事件中区分同一 ScaledObject 下的多个事件源。当 ScaledObject 包含两个相同类型的事件源(例如两个不同的 Prometheus 查询)时,name 必须唯一。

triggers:
- type: prometheus
  name: request-latency-p99
  metadata:
    serverAddress: http://prometheus:9090
    query: histogram_quantile(0.99, ...)
- type: prometheus
  name: error-rate-5m
  metadata:
    serverAddress: http://prometheus:9090
    query: rate(errors_total[5m])

4.3 metadata:事件源的连接参数

metadata 是一个键值对映射,承载事件源所需的全部连接信息和查询参数。不同事件源类型的 metadata 字段差异较大,但通常包含以下三类:

  • 连接地址:如 serverAddress、brokerList、host。
  • 查询条件:如 query(Prometheus)、topicName(Kafka)、queueName(RabbitMQ)。
  • 阈值与维度:如 threshold、targetValue、activationThreshold。
安全提示: 不要在 metadata 中直接写入密码、 或 。敏感信息应通过 authenticationRef 引用外部 Secret。

4.4 authenticationRef:安全凭证的引用

authenticationRef 指向一个 TriggerAuthentication(命名空间级别)或 ClusterTriggerAuthentication(集群级别)资源。该资源定义了如何从 Kubernetes Secret、环境变量、Vault 或云厂商托管身份中获取凭证。

典型配置流程:

  1. 创建包含敏感信息的 Secret:kubectl create secret generic kafka-credentials --from-literal=username=admin --from-literal=password=secret
  2. 创建 TriggerAuthentication 资源,引用上述 Secret:
apiVersion: keda.sh/v1alpha1
kind: TriggerAuthentication
metadata:
  name: kafka-auth
spec:
  secretTargetRef:
  - parameter: sasl
    name: kafka-credentials
    key: username
  - parameter: sasl
    name: kafka-credentials
    key: password
  1. 在 ScaledObject 的事件源中引用:
triggers:
- type: kafka
  authenticationRef:
    name: kafka-auth
  metadata:
    bootstrapServers: kafka-cluster:9092
    topic: orders
    consumerGroup: keda-consumer
常见错误: 如果 TriggerAuthentication 与 ScaledObject 不在同一命名空间,必须使用 ClusterTriggerAuthentication,否则 KEDA 无法解析凭证。

4.5 useCachedMetrics:指标缓存策略

useCachedMetrics 控制 KEDA 是否复用上一次轮询的指标值。默认值为 false,即每次轮询都向事件源发起实时查询。当设置为 true 时,KEDA 在轮询间隔内返回上一次缓存的指标值,避免对后端系统造成过大压力。

适用场景:

  • 事件源响应较慢(如复杂 PromQL 查询)
  • 事件源存在限流或配额限制(如云 API)
  • 指标变化不频繁,允许一定延迟

不适用场景:

  • 需要秒级精确响应的流量突发场景
  • 事件源本身已提供缓存(如 Redis 缓存层)

4.6 fallback:事件源故障时的保底策略

fallback 是 KEDA 2.8+ 引入的容错参数。当事件源连续多次返回错误或超时时,KEDA 不再使用 0 副本缩容,而是回退到用户指定的静态副本数,防止因监控系统故障导致服务完全停止。

fallback 配置包含两个子字段:

子字段 类型 说明
replicas 整数 回退时的目标副本数(必须 ≥ 1)
failureThreshold 整数 触发回退前连续失败的轮询次数(默认 3)
triggers:
- type: prometheus
  metadata:
    serverAddress: http://prometheus:9090
    query: up{job="my-app"}
    threshold: "1"
  fallback:
    replicas: 3
    failureThreshold: 5
生产建议: 对于关键业务工作负载,始终配置 fallback。回退副本数建议设置为日常峰值流量的 50%~70%,避免回退后资源不足或过度浪费。

4.7 参数协作关系图

下图展示了六个通用参数在 KEDA 事件源中的协作流程:

事件源通用参数协作流程 ScaledObject triggers[0] 事件源 type + name metadata authenticationRef useCachedMetrics fallback Scaler 实例 参数协作说明 1. type 决定加载哪个 Scaler 插件;name 用于日志区分。 2. metadata 提供连接参数;authenticationRef 提供安全凭证。 3. useCachedMetrics 控制是否复用上次指标;fallback 在故障时保底。

4.8 参数配置避坑清单

  • authenticationRef 未生效:检查 TriggerAuthentication 的 parameter 字段是否与事件源 metadata 中的参数名完全匹配。
  • fallback 未触发:确认 KEDA 版本 ≥ 2.8,且 failureThreshold 值小于 KEDA 的 cooldownPeriod 轮询次数。
  • useCachedMetrics 导致缩放滞后:在流量突增场景下,建议关闭缓存或缩短 pollingInterval。
  • metadata 中硬编码敏感信息:始终使用 authenticationRef 引用 Secret,避免 YAML 泄露。
调试命令: 使用 kubectl get ScaledObject <name> -o yaml 查看 KEDA 控制器实际解析后的事件源参数;使用 kubectl logs -n keda deployment/keda-operator 查看轮询错误日志。