3.4. 了解自定义指标自动扩展触发器


触发器(也称为 scalers)提供自定义 Metrics Autoscaler Operator 用来扩展 pod 的指标。

自定义指标自动扩展目前只支持 Prometheus、CPU、内存和 Apache Kafka 触发器。

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

3.4.1. 了解 Prometheus 触发器

您可以基于 Prometheus 指标扩展 pod,该指标可以使用已安装的 OpenShift Container Platform 监控或外部 Prometheus 服务器作为指标源。有关使用 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 scalers 支持 bearer 身份验证 (bearer)、基本身份验证 (basic) 或 TLS 身份验证 (tls)。您可以在触发器身份验证中配置特定的身份验证参数,如以下部分所述。根据需要,您还可以使用 secret。
8
可选:将 X-Scope-OrgID 标头传递给多租户 Cortex 或 Prometheus 的 Mimir 存储。这个参数只需要带有多租户 Prometheus 存储,以指示 Prometheus 应该返回哪些数据。
9
可选:指定在 Prometheus 目标丢失时触发器应如何进行操作。
  • 如果为 true,当 Prometheus 目标丢失时触发器将继续操作。这是默认的行为。
  • 如果为 false,当 Prometheus 目标丢失时触发器会返回错误。
10
可选:指定是否应跳过证书检查。例如,如果在 Prometheus 端点中使用自签名证书,您可以跳过检查。
  • 如果为 true,则执行证书检查。
  • 如果为 false,则不会执行证书检查。这是默认的行为。

3.4.1.1. 配置自定义指标自动扩展以使用 OpenShift Container Platform 监控

您可以使用已安装的 OpenShift Container Platform Prometheus 监控作为自定义指标自动扩展使用的指标的来源。但是,需要执行一些额外的配置。

注意

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

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

  • 创建服务帐户以获取令牌。
  • 创建角色。
  • 将该角色添加到服务帐户。
  • 在 Prometheus 使用的触发器验证对象中引用令牌。

先决条件

  • 必须安装 OpenShift Container Platform 监控。
  • OpenShift Container Platform 监控中必须启用对用户定义的工作负载的监控监控,如创建用户定义的工作负载监控配置映射部分所述。
  • 必须安装 Custom Metrics Autoscaler Operator。

流程

  1. 使用您要缩放的对象切换到项目:

    $ oc project my-project
  2. 如果您的集群没有服务帐户,请使用以下命令来创建服务帐户:

    $ oc create serviceaccount <service_account>

    其中:

    <service_account>
    指定服务帐户的名称。
  3. 使用以下命令查找分配给服务帐户的令牌:

    $ oc describe serviceaccount <service_account>

    其中:

    <service_account>
    指定服务帐户的名称。

    输出示例

    Name:                thanos
    Namespace:           my-project
    Labels:              <none>
    Annotations:         <none>
    Image pull secrets:  thanos-dockercfg-nnwgj
    Mountable secrets:   thanos-dockercfg-nnwgj
    Tokens:              thanos-token-9g4n5 1
    Events:              <none>

    1
    在触发器身份验证中使用此令牌。
  4. 使用服务帐户令牌创建触发器身份验证:

    1. 创建一个类似以下示例的 YAML 文件:

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

      $ oc create -f <file-name>.yaml
  5. 创建用于读取 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
  6. 创建用于读取 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 监控用作源,在触发器或 scaler 中,您必须包括以下参数:

  • triggers.type 必须是 prometheus
  • triggers.metadata.serverAddress 必须是 https://thanos-querier.openshift-monitoring.svc.cluster.local:9092
  • triggers.metadata.authModes 必须是 bearer
  • triggers.metadata.namespace 必须设置为要缩放的对象的命名空间
  • triggers.authenticationRef 必须指向上一步中指定的触发器身份验证资源

3.4.2. 了解 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
      containerName: api 4

1
指定 CPU 作为触发器类型。
2
指定要使用的指标类型,可以是 UtilizationAverageValue
3
指定触发扩展的值。必须指定为带引号的字符串值。
  • 在使用 Utilization 时,target 值是所有相关 pod 中资源指标的平均值,以 pod 资源请求的值的百分比表示。
  • 使用 AverageValue 时,target 值是所有相关 Pod 的指标平均值。
4
可选:根据该容器的内存使用率,而不是整个 pod,指定要缩放的独立容器。在本例中,只有名为 api 的容器才会扩展。

3.4.3. 了解内存触发器

您可以根据内存指标扩展 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
将 memory 指定为触发器类型。
2
指定要使用的指标类型,可以是 UtilizationAverageValue
3
指定触发扩展的值。必须指定为带引号的字符串值。
  • 在使用 Utilization 时,target 值是所有相关 pod 中资源指标的平均值,以 pod 资源请求的值的百分比表示。
  • 使用 AverageValue 时,target 值是所有相关 Pod 的指标平均值。
4
可选:根据该容器的内存使用率,而不是整个 pod,指定要缩放的独立容器。在本例中,只有名为 api 的容器才会扩展。

3.4.4. 了解 Kafka 触发器

您可以根据 Apache Kafka 主题或支持 Kafka 协议的其他服务扩展 pod。自定义指标自动扩展不会缩放 Kafka 分区数量,除非在扩展的对象或扩展任务中将 allowIdleConsumers 参数设置为 true

注意

如果消费者组数量超过主题中的分区数量,则额外的消费者组处于闲置状态。要避免这种情况,默认情况下副本数不会超过:

  • 如果指定了主题,则主题上的分区数量
  • 如果没有指定主题,则消费者组中的所有主题的分区数量
  • 在扩展对象或扩展作业 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

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,则 scaler 为该分区保留单个消费者。这是默认值。
10
可选:指定触发器是否为当前偏移与之前轮询周期的当前偏移量相同或排除分区滞后。
  • 如果为 true,则扩展程序会排除这些分区中的分区滞后。
  • 如果为 false,则触发器在所有分区中包含所有消费者滞后。这是默认值。
11
可选:指定 Kafka 代理的版本。必须指定为带引号的字符串值。默认值为 1.0.0
12
可选:指定一个以逗号分隔的分区 ID 列表来限制缩放。如果设置,则仅考虑计算滞后列出的 ID。必须指定为带引号的字符串值。默认为考虑所有分区。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.