3.4. 了解自定义指标自动扩展触发器
触发器(也称为 scalers)提供自定义 Metrics Autoscaler Operator 用来扩展 pod 的指标。
自定义指标自动扩展目前只支持 Prometheus、CPU、内存和 Apache Kafka 触发器。
您可以使用 ScaledObject
或 ScaledJob
自定义资源为特定对象配置触发器,如后面的章节中所述。
您可以配置一个证书颁发机构与扩展对象一起使用,或配置为集群中的所有扩展程序。
3.4.1. 了解 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 scalers 支持 bearer 身份验证 (
bearer
)、基本身份验证 (basic
) 或 TLS 身份验证 (tls
)。您可以在触发器身份验证中配置特定的身份验证参数,如以下部分所述。根据需要,您还可以使用 secret。 - 8
- 9
- 可选:指定在 Prometheus 目标丢失时触发器应如何进行操作。
-
如果为
true
,当 Prometheus 目标丢失时触发器将继续操作。这是默认的行为。 -
如果为
false
,当 Prometheus 目标丢失时触发器会返回错误。
-
如果为
- 10
- 可选:指定是否应跳过证书检查。例如,如果在测试环境中运行并使用 Prometheus 端点上的自签名证书,您可以跳过检查。
-
如果为
false
,则执行证书检查。这是默认的行为。 如果为
true
,则不会执行证书检查。重要不建议跳过检查。
-
如果为
3.4.1.1. 配置自定义指标自动扩展以使用 OpenShift Container Platform 监控
您可以使用已安装的 OpenShift Container Platform Prometheus 监控作为自定义指标自动扩展使用的指标的来源。但是,需要执行一些额外的配置。
外部 Prometheus 源不需要这些步骤。
您必须执行以下任务,如本节所述:
- 创建一个服务帐户。
- 创建为服务帐户生成令牌的 secret。
- 创建触发器身份验证。
- 创建角色。
- 将该角色添加到服务帐户。
- 在 Prometheus 使用的触发器验证对象中引用令牌。
先决条件
- 必须安装 OpenShift Container Platform 监控。
- OpenShift Container Platform 监控中必须启用对用户定义的工作负载的监控监控,如创建用户定义的工作负载监控配置映射部分所述。
- 必须安装 Custom Metrics Autoscaler Operator。
流程
使用您要缩放的对象切换到项目:
$ oc project my-project
如果集群没有服务帐户和令牌,请创建服务帐户和令牌:
使用以下命令创建
服务帐户
对象:$ oc create serviceaccount thanos 1
- 1
- 指定服务帐户的名称。
可选:创建一个
secret
YAML 来生成服务帐户令牌:重要如果您禁用
ImageRegistry
功能,或者在 Cluster Image Registry Operator 配置中禁用集成的 OpenShift 镜像 registry,则不会为每个服务帐户生成镜像 pull secret。在这种情况下,您必须执行此步骤。apiVersion: v1 kind: Secret metadata: name: thanos-token annotations: kubernetes.io/service-account.name: thanos 1 type: kubernetes.io/service-account-token
- 1
- 指定服务帐户的名称。
使用以下命令创建 secret 对象:
$ oc create -f <file_name>.yaml
使用以下命令查找分配给服务帐户的令牌:
$ 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
- 在触发器身份验证中使用此令牌。
使用服务帐户令牌创建触发器身份验证:
创建一个类似以下示例的 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
创建 CR 对象:
$ oc create -f <file-name>.yaml
创建用于读取 Thanos 指标的角色:
使用以下参数创建 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
创建 CR 对象:
$ oc create -f <file-name>.yaml
创建用于读取 Thanos 指标的角色绑定:
创建一个类似以下示例的 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
创建 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 minReplicaCount: 1 4
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
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 tls: enable 13
- 1
- 指定 Kafka 作为触发器类型。
- 2
- 指定 Kafka 在处理偏移滞后的 Kafka 主题的名称。
- 3
- 指定要连接的 Kafka 代理的逗号分隔列表。
- 4
- 指定用于检查主题上的偏移以及处理相关滞后的 Kafka 消费者组的名称。
- 5
- 可选:指定触发扩展的平均目标值。必须指定为带引号的字符串值。默认值为
5
。 - 6
- 可选:指定激活阶段的目标值。必须指定为带引号的字符串值。
- 7
- 可选:为 Kafka 使用者指定 Kafka 偏移重置策略。可用值包括:
latest
和earliest
。默认为latest
。 - 8
- 可选:指定 Kafka 副本数是否可以超过主题中的分区数量。
-
如果为
true
,则 Kafka 副本数可能会超过主题上的分区数量。这允许闲置 Kafka 用户。 -
如果为
false
,则 Kafka 副本数不能超过主题上的分区数量。这是默认值。
-
如果为
- 9
- 指定当 Kafka 分区没有有效偏移时触发器的行为方式。
-
如果为
true
,则该分区的用户将缩减为零。 -
如果为
false
,则 scaler 为该分区保留单个消费者。这是默认值。
-
如果为
- 10
- 可选:指定触发器是否为当前偏移与之前轮询周期的当前偏移量相同或排除分区滞后。
-
如果为
true
,则扩展程序会排除这些分区中的分区滞后。 -
如果为
false
,则触发器在所有分区中包含所有消费者滞后。这是默认值。
-
如果为
- 11
- 可选:指定 Kafka 代理的版本。必须指定为带引号的字符串值。默认值为
1.0.0
。 - 12
- 可选:指定一个以逗号分隔的分区 ID 列表来限制缩放。如果设置,则仅考虑计算滞后列出的 ID。必须指定为带引号的字符串值。默认为考虑所有分区。
- 13
- 可选:指定是否对 Kafka 使用 TSL 客户端身份验证。默认为
禁用
。有关配置 TLS 的详情,请参考 "Understanding custom metrics autoscaler trigger authentications"。
3.4.5. 了解 Cron 触发器
您可以根据时间范围扩展 pod。
当时间范围启动时,自定义指标自动扩展会将与对象关联的 pod 从配置的最少 pod 数量扩展到所需的 pod 数量。在时间范围结束时,容器集将重新扩展到配置的最小值。时间段必须以 cron 格式进行配置。
在以下示例中,从印度标准时间 6:00 AM 到 6:30 PM 时将与此扩展对象关联的 pod 从 0
扩展到 100
。
使用 Cron trigger 扩展对象示例
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