×

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

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

您可以使用ScaledObjectScaledJob 自定义资源来配置特定对象的触发器,如下节所述。

理解 Prometheus 触发器

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

如果 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 Container Platform 监控。
3 可选:指定要缩放的对象的命名空间。如果使用 OpenShift Container Platform 监控作为指标源,则此参数是必需的。
4 指定在external.metrics.k8s.io API 中标识指标的名称。如果您使用多个触发器,则所有指标名称必须唯一。
5 指定触发缩放的值。必须指定为带引号的字符串值。
6 指定要使用的 Prometheus 查询。
7 指定要使用的身份验证方法。Prometheus 缩放器支持 bearer 身份验证(bearer)、基本身份验证(basic)或 TLS 身份验证(tls)。您可以在触发器身份验证中配置特定的身份验证参数,如下节所述。如有需要,您也可以使用密钥。
8 可选:将X-Scope-OrgID 头传递给多租户CortexMimir 的 Prometheus 存储。此参数仅在使用多租户 Prometheus 存储时才需要,用于指示 Prometheus 应返回哪些数据。
9 可选:指定如果丢失 Prometheus 目标,触发器应如何继续。
  • 如果为true,则如果丢失 Prometheus 目标,触发器将继续运行。这是默认行为。

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

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

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

    不建议跳过检查。

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

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

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

您必须执行以下任务,如本节所述

  • 创建一个服务帐户。

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

  • 创建触发器身份验证。

  • 创建一个角色。

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

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

先决条件
  • 必须安装 OpenShift Container Platform 监控。

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

  • 必须安装自定义指标自动缩放器操作员。

步骤
  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. 使用以下命令创建密钥对象

      $ 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 Container Platform 监控作为源,在触发器或缩放器中,您必须包含以下参数

  • 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 可选:指定触发器包含还是排除当前偏移量与前一个轮询周期的当前偏移量相同的 partition 的 partition lag。
  • 如果为true,则缩放器将排除这些分区中的分区滞后。

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

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

理解 Cron 触发器

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

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

以下示例将与该缩放对象关联的 Pod 从0缩放至100,时间范围为印度标准时间上午 6:00 至下午 6:30。

带有 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相同。