×

触发器,也称为缩放器,提供自定义指标自动缩放运算符用于缩放 Pod 的指标。

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

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

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

了解 Prometheus 触发器

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

如果 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 服务器的地址。此示例使用 Red Hat OpenShift Service on AWS 监控。
3 可选:指定要缩放的对象的命名空间。如果使用 Red Hat OpenShift Service on AWS 监控作为指标源,则此参数为必填项。
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,则不执行证书检查。

    不建议跳过检查。

将自定义指标自动缩放器配置为使用 Red Hat OpenShift Service on AWS 监控

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

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

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

  • 创建一个服务帐户。

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

  • 创建触发器身份验证。

  • 创建一个角色。

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

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

先决条件
  • 必须安装 Red Hat OpenShift Service on AWS 监控。

  • 必须在 Red Hat OpenShift Service on AWS 监控中启用用户定义工作负载的监控,如**创建用户定义工作负载监控 ConfigMap** 部分所述。

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

步骤
  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

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

  • 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相同。