×

触发器(也称为缩放器)提供自定义指标自动缩放算子用于缩放 Pod 的指标。

自定义指标自动缩放器目前仅支持 Prometheus、CPU、内存和 Apache Kafka 触发器。

您可以使用 `ScaledObject` 或 `ScaledJob` 自定义资源来为特定对象配置触发器,如下节所述。

您可以配置一个证书颁发机构 用于您的缩放对象用于集群中的所有缩放器

了解 Prometheus 触发器

您可以根据 Prometheus 指标缩放 Pod,这些指标可以使用已安装的 OpenShift 专用监控或外部 Prometheus 服务器作为指标来源。有关使用 OpenShift 专用监控作为指标来源所需的配置信息,请参阅“配置自定义指标自动缩放器以使用 OpenShift 专用监控”。

如果 Prometheus 从自定义指标自动缩放器正在缩放的应用程序收集指标,请不要在自定义资源中将最小副本数设置为 `0`。如果没有应用程序 Pod,自定义指标自动缩放器将没有任何要缩放的指标。

带有 Prometheus 目标的示例缩放对象
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: prom-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: prometheus (1)
    metadata:
      serverAddress: https://thanos-querier.openshift-monitoring.svc.cluster.local:9092 (2)
      namespace: kedatest (3)
      metricName: http_requests_total (4)
      threshold: '5' (5)
      query: sum(rate(http_requests_total{job="test-app"}[1m])) (6)
      authModes: basic (7)
      cortexOrgID: my-org (8)
      ignoreNullValues: "false" (9)
      unsafeSsl: "false" (10)
1 指定 Prometheus 作为触发器类型。
2 指定 Prometheus 服务器的地址。此示例使用 OpenShift 专用监控。
3 可选:指定要缩放的对象的命名空间。如果使用 OpenShift 专用监控作为指标来源,则此参数为必填参数。
4 指定在 `external.metrics.k8s.io` API 中标识指标的名称。如果您使用多个触发器,则所有指标名称必须唯一。
5 指定触发缩放的值。必须指定为带引号的字符串值。
6 指定要使用的 Prometheus 查询。
7 指定要使用的身份验证方法。Prometheus 缩放器支持令牌身份验证 ( `bearer` )、基本身份验证 ( `basic` ) 或 TLS 身份验证 ( `tls` )。您可以在触发器身份验证中配置特定的身份验证参数,如下节所述。如有需要,您也可以使用密钥。
8 可选:将 `X-Scope-OrgID` 标头传递给多租户 CortexMimir Prometheus 存储。此参数仅在使用多租户 Prometheus 存储时才需要,用于指示 Prometheus 应返回哪些数据。
9 可选:指定如果丢失 Prometheus 目标,触发器应如何继续。
  • 如果为 `true`,则如果丢失 Prometheus 目标,触发器将继续运行。这是默认行为。

  • 如果为 `false`,则如果丢失 Prometheus 目标,触发器将返回错误。

10 可选:指定是否应跳过证书检查。例如,如果您在测试环境中运行并使用 Prometheus 端点上的自签名证书,则可以跳过检查。
  • 如果为 `false`,则执行证书检查。这是默认行为。

  • 如果为 `true`,则不执行证书检查。

    不建议跳过检查。

配置自定义指标自动缩放器以使用 OpenShift 专用监控

您可以使用已安装的 OpenShift 专用 Prometheus 监控作为自定义指标自动缩放器使用的指标来源。但是,您必须执行一些其他配置。

对于外部 Prometheus 源,不需要执行这些步骤。

您必须执行以下任务,本节中对此进行了说明

  • 创建服务帐户。

  • 创建一个为服务帐户生成令牌的密钥。

  • 创建触发器身份验证。

  • 创建一个角色。

  • 将该角色添加到服务帐户。

  • 在 Prometheus 使用的触发器身份验证对象中引用该令牌。

先决条件
  • 必须安装 OpenShift 专用监控。

  • 必须在 OpenShift 专用监控中启用用户定义工作负载的监控,如“创建用户定义工作负载监控配置映射”部分所述。

  • 必须安装自定义指标自动缩放算子。

步骤
  1. 切换到包含要缩放对象的项目

    $ oc project my-project
  2. 如果您的集群没有服务账号和令牌,请创建它们。

    1. 使用以下命令创建service account对象:

      $ oc create serviceaccount thanos (1)
      1 指定服务账号的名称。
    2. 创建secret YAML 文件来生成服务账号令牌。

      apiVersion: v1
      kind: Secret
      metadata:
        name: thanos-token
        annotations:
          kubernetes.io/service-account.name: thanos (1)
      type: kubernetes.io/service-account-token
      1 指定服务账号的名称。
    3. 使用以下命令创建 secret 对象:

      $ oc create -f <file_name>.yaml
    4. 使用以下命令查找分配给服务账号的令牌:

      $ oc describe serviceaccount thanos (1)
      1 指定服务账号的名称。
      示例输出:
      Name:                thanos
      Namespace:           my-project
      Labels:              <none>
      Annotations:         <none>
      Image pull secrets:  thanos-dockercfg-nnwgj
      Mountable secrets:   thanos-dockercfg-nnwgj
      Tokens:              thanos-token (1)
      Events:              <none>
      
      1 在触发器身份验证中使用此令牌。
  3. 使用服务账号令牌创建触发器身份验证。

    1. 创建一个类似于以下内容的 YAML 文件:

      apiVersion: keda.sh/v1alpha1
      kind: TriggerAuthentication
      metadata:
        name: keda-trigger-auth-prometheus
      spec:
        secretTargetRef: (1)
        - parameter: bearerToken (2)
          name: thanos-token (3)
          key: token (4)
        - parameter: ca
          name: thanos-token
          key: ca.crt
      1 指定此对象使用密钥进行授权。
      2 指定使用令牌提供的身份验证参数。
      3 指定要使用的令牌名称。
      4 指定要与指定参数一起使用的令牌中的密钥。
    2. 创建 CR 对象。

      $ oc create -f <file-name>.yaml
  4. 创建一个用于读取 Thanos 指标的角色。

    1. 创建一个包含以下参数的 YAML 文件:

      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
        name: thanos-metrics-reader
      rules:
      - apiGroups:
        - ""
        resources:
        - pods
        verbs:
        - get
      - apiGroups:
        - metrics.k8s.io
        resources:
        - pods
        - nodes
        verbs:
        - get
        - list
        - watch
    2. 创建 CR 对象。

      $ oc create -f <file-name>.yaml
  5. 创建一个用于读取 Thanos 指标的角色绑定。

    1. 创建一个类似于以下内容的 YAML 文件:

      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: thanos-metrics-reader (1)
        namespace: my-project (2)
      roleRef:
        apiGroup: rbac.authorization.k8s.io
        kind: Role
        name: thanos-metrics-reader
      subjects:
      - kind: ServiceAccount
        name: thanos (3)
        namespace: my-project (4)
      1 指定您创建的角色的名称。
      2 指定您要缩放的对象的命名空间。
      3 指定要绑定到角色的服务账号的名称。
      4 指定您要缩放的对象的命名空间。
    2. 创建 CR 对象。

      $ oc create -f <file-name>.yaml

您现在可以部署缩放的对象或缩放作业以启用应用程序的自动缩放,如“了解如何添加自定义指标自动缩放器”中所述。要使用 OpenShift Dedicated 监控作为数据源,在触发器或缩放器中,您必须包含以下参数:

  • triggers.type 必须为 prometheus

  • triggers.metadata.serverAddress 必须为 https://thanos-querier.openshift-monitoring.svc.cluster.local:9092

  • triggers.metadata.authModes 必须为 bearer

  • triggers.metadata.namespace 必须设置为要缩放的对象的命名空间

  • triggers.authenticationRef 必须指向前面步骤中指定的触发器身份验证资源

理解 CPU 触发器

您可以根据 CPU 指标缩放 Pod。此触发器使用集群指标作为指标的来源。

自定义指标自动缩放器会缩放与对象关联的 Pod,以维持您指定的 CPU 使用率。自动缩放器会在最小和最大数量之间增加或减少副本数量,以维持所有 Pod 的指定 CPU 利用率。内存触发器会考虑整个 Pod 的内存使用率。如果 Pod 包含多个容器,则内存触发器会考虑 Pod 中所有容器的总内存使用率。

  • 此触发器不能与ScaledJob自定义资源一起使用。

  • 使用内存触发器缩放对象时,即使使用多个触发器,对象也不会缩放到0

具有 CPU 目标的示例缩放对象
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: cpu-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: cpu (1)
    metricType: Utilization (2)
    metadata:
      value: '60' (3)
  minReplicaCount: 1 (4)
1 指定 CPU 为触发器类型。
2 指定要使用的指标类型,UtilizationAverageValue
3 指定触发缩放的值。必须指定为带引号的字符串值。
  • 使用Utilization时,目标值是所有相关 Pod 的资源指标的平均值,表示为 Pod 资源请求值的百分比。

  • 使用AverageValue时,目标值是所有相关 Pod 的指标平均值。

4 指定缩小时的最小副本数。对于 CPU 触发器,输入的值必须大于或等于1,因为如果您只使用 CPU 指标,则 HPA 无法缩放到零。

理解内存触发器

您可以根据内存指标缩放 Pod。此触发器使用集群指标作为指标的来源。

自定义指标自动缩放器会缩放与对象关联的 Pod,以维持您指定的平均内存使用率。自动缩放器会在最小和最大数量之间增加或减少副本数量,以维持所有 Pod 的指定内存利用率。内存触发器会考虑整个 Pod 的内存使用率。如果 Pod 包含多个容器,则内存使用率为所有容器的总和。

  • 此触发器不能与ScaledJob自定义资源一起使用。

  • 使用内存触发器缩放对象时,即使使用多个触发器,对象也不会缩放到0

具有内存目标的示例缩放对象
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: memory-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: memory (1)
    metricType: Utilization (2)
    metadata:
      value: '60' (3)
      containerName: api (4)
1 指定内存为触发器类型。
2 指定要使用的指标类型,UtilizationAverageValue
3 指定触发缩放的值。必须指定为带引号的字符串值。
  • 使用Utilization时,目标值是所有相关 Pod 的资源指标的平均值,表示为 Pod 资源请求值的百分比。

  • 使用AverageValue时,目标值是所有相关 Pod 的指标平均值。

4 可选:指定要缩放的单个容器,基于该容器的内存使用率,而不是整个 Pod。在此示例中,仅缩放名为api的容器。

理解 Kafka 触发器

您可以根据 Apache Kafka 主题或支持 Kafka 协议的其他服务来缩放 Pod。除非您在缩放的对象或缩放作业中将allowIdleConsumers参数设置为true,否则自定义指标自动缩放器不会缩放超过 Kafka 分区数。

如果使用者组的数量超过主题中的分区数,则额外的使用者组将保持空闲状态。为避免这种情况,默认情况下,副本数不会超过:

  • 如果指定了主题,则为主题上的分区数

  • 如果未指定主题,则为使用者组中所有主题的分区数

  • 缩放对象或缩放作业 CR 中指定的maxReplicaCount

您可以使用allowIdleConsumers参数禁用这些默认行为。

具有 Kafka 目标的示例缩放对象
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: kafka-scaledobject
  namespace: my-namespace
spec:
# ...
  triggers:
  - type: kafka (1)
    metadata:
      topic: my-topic (2)
      bootstrapServers: my-cluster-kafka-bootstrap.openshift-operators.svc:9092 (3)
      consumerGroup: my-group (4)
      lagThreshold: '10' (5)
      activationLagThreshold: '5' (6)
      offsetResetPolicy: latest (7)
      allowIdleConsumers: true (8)
      scaleToZeroOnInvalidOffset: false (9)
      excludePersistentLag: false (10)
      version: '1.0.0' (11)
      partitionLimitation: '1,2,10-20,31' (12)
      tls: enable (13)
1 指定 Kafka 为触发器类型。
2 指定 Kafka 正在处理偏移量滞后的 Kafka 主题的名称。
3 指定要连接到的 Kafka 代理的逗号分隔列表。
4 指定用于检查主题上的偏移量和处理相关滞后的 Kafka 使用者组的名称。
5 可选:指定触发缩放的平均目标值。必须指定为带引号的字符串值。默认为5
6 可选:指定激活阶段的目标值。必须指定为带引号的字符串值。
7 可选:指定 Kafka 使用者的 Kafka 偏移量重置策略。可用值为:latestearliest。默认为latest
8 可选:指定 Kafka 副本数是否可以超过主题上的分区数。
  • 如果为true,则 Kafka 副本数可以超过主题上的分区数。这允许空闲的 Kafka 使用者。

  • 如果为false,则 Kafka 副本数不能超过主题上的分区数。这是默认值。

9 指定当 Kafka 分区没有有效的偏移量时触发器的行为。
  • 如果为true,则将该分区的使用者缩放到零。

  • 如果为false,则缩放器将为该分区保留一个使用者。这是默认值。

10 可选:指定触发器是否包含或排除当前偏移量与上一轮轮询周期的当前偏移量相同的区间的分区滞后。
  • 如果为true,则缩放器将排除这些分区中的分区滞后。

  • 如果为false,则触发器包含所有分区中的所有使用者滞后。这是默认值。

11 可选:指定 Kafka 代理的版本。必须指定为带引号的字符串值。默认为1.0.0
12 可选:指定逗号分隔的分区 ID 列表以限制缩放范围。如果设置,则计算滞后时仅考虑列出的 ID。必须指定为带引号的字符串值。默认为考虑所有分区。
13 可选:指定是否为 Kafka 使用 TSL 客户端身份验证。默认为disable。有关配置 TLS 的信息,请参阅“了解自定义指标自动缩放器触发器身份验证”。

理解 Cron 触发器

您可以根据时间范围缩放 Pod。

时间范围开始时,自定义指标自动缩放器会将与对象关联的 Pod 从配置的最小 Pod 数缩放至指定的所需 Pod 数。时间范围结束时,Pod 将缩减回配置的最小数量。时间段必须使用cron 格式进行配置。

以下示例将与该缩放对象关联的 Pod 从早上 6:00 到下午 6:30(印度标准时间)从0 缩放至 100

带有 Cron 触发器的示例缩放对象
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: cron-scaledobject
  namespace: default
spec:
  scaleTargetRef:
    name: my-deployment
  minReplicaCount: 0 (1)
  maxReplicaCount: 100 (2)
  cooldownPeriod: 300
  triggers:
  - type: cron (3)
    metadata:
      timezone: Asia/Kolkata (4)
      start: "0 6 * * *" (5)
      end: "30 18 * * *" (6)
      desiredReplicas: "100" (7)
1 指定时间范围结束时缩减到的最小 Pod 数。
2 向上缩放时的最大副本数。此值应与desiredReplicas相同。默认为100
3 指定 Cron 触发器。
4 指定时间范围的时区。此值必须来自IANA 时区数据库
5 指定时间范围的开始时间。
6 指定时间范围的结束时间。
7 指定在时间范围的开始和结束之间要缩放到的 Pod 数。此值应与maxReplicaCount相同。