在 Azure 容器应用中设置缩放规则

Azure 容器应用通过一组声明性缩放规则管理自动水平缩放。 随着容器应用修订版的横向扩展,会按需创建修订版的新实例。 这些实例称为副本。

添加或编辑缩放规则会创建容器应用的新修订版。 修订版是容器应用的不可变快照。 要了解哪些类型的更改会触发新修订版的创建,请参阅修订版更改类型

事件驱动的容器应用作业使用缩放规则根据事件触发执行。

缩放定义

缩放是限制、规则和行为组合的结果。

  • 限制定义了当容器应用缩放时,每个修订版可用的最小和最大副本数。

    缩放限制 默认值 最小值 最大值
    每个修订版的最小副本数 0 0 可配置的最大副本数为 1,000。
    每个修订版的最大副本数 10 1 可配置的最大副本数为 1,000。
  • 规则是指由容器应用用来决定何时添加或删除副本的条件。

    缩放规则是作为 HTTP、TCP(传输控制协议)或通过自定义实现的。

  • 行为是规则和限制的组合,用于随时间推移确定缩放决策。

    缩放行为说明如何做出缩放决策。

定义缩放规则时,考虑以下各项很重要:

  • 如果容器应用缩放为零,则不会你计收使用费。
  • 未处理但保留在内存中的副本可能会按较低的“空闲”速率计费。 有关详细信息,请参阅计费
  • 如果你想要确保修订版实例始终运行,请将最小副本数设置为 1 或更高。

缩放规则

缩放由三种不同类别的触发器驱动:

  • HTTP:基于对修订版的并发 HTTP 请求数。
  • TCP:基于与修订版建立的并发 TCP 连接数。
  • 自定义:基于 CPU、内存或支持的事件驱动数据源,例如:
    • Azure 服务总线
    • Azure 事件中心
    • Apache Kafka
    • Redis

如果定义了多个缩放规则,则一旦满足任一规则的第一个条件,容器应用就会开始缩放。

HTTP

使用 HTTP 缩放规则,你可以控制并发 HTTP 请求的阈值,该阈值决定了容器应用修订版的缩放方式。 每 15 秒,并发请求数的计算方式为过去 15 秒的请求数除以 15。 容器应用作业不支持 HTTP 缩放规则。

在以下示例中,修订版最多可以横向扩展为五个副本和横向缩减为零。 缩放属性设置为每秒 100 个并发请求。

示例

http 节定义 HTTP 缩放规则。

缩放属性 说明 默认值 最小值 最大值
concurrentRequests 当 HTTP 请求数超过此值时,将添加另一个副本。 副本继续添加到池中,直到数量达到 maxReplicas 个。 10 1 不适用
{
  ...
  "resources": {
    ...
    "properties": {
      ...
      "template": {
        ...
        "scale": {
          "minReplicas": 0,
          "maxReplicas": 5,
          "rules": [{
            "name": "http-rule",
            "http": {
              "metadata": {
                "concurrentRequests": "100"
              }
            }
          }]
        }
      }
    }
  }
}

注意

使用非 HTTP 事件缩放规则时,请将容器应用的 properties.configuration.activeRevisionsMode 属性设置为 single

--scale-rule-http-concurrencyupdate 命令中使用 create 参数定义 HTTP 缩放规则。

CLI 参数 说明 默认值 最小值 最大值
--scale-rule-http-concurrency 当并发 HTTP 请求数超过此值时,将添加另一个副本。 副本继续添加到池中,直到数量达到 max-replicas 个。 10 1 不适用
az containerapp create \
  --name <CONTAINER_APP_NAME> \
  --resource-group <RESOURCE_GROUP> \
  --environment <ENVIRONMENT_NAME> \
  --image <CONTAINER_IMAGE_LOCATION>
  --min-replicas 0 \
  --max-replicas 5 \
  --scale-rule-name azure-http-rule \
  --scale-rule-type http \
  --scale-rule-http-concurrency 100
  1. 在 Azure 门户中转到你的容器应用

  2. 选择“缩放”。

  3. 选择“编辑并部署”。

  4. 选择“缩放”选项卡。

  5. 选择最小和最大副本数范围。

    Azure 容器应用缩放范围滑块的屏幕截图。

  6. 选择 添加

  7. 在“规则名称”框中输入规则名称。

  8. 从“类型”下拉列表中选择“HTTP 缩放”。

  9. 在“并发请求”框中,输入容器应用的所需并发请求数。

TCP

使用 TCP 缩放规则,可以控制并发 TCP 连接的阈值,该阈值决定了应用缩放方式。 每 15 秒,并发连接数的计算方式为过去 15 秒的连接数除以 15。 容器应用作业不支持 TCP 缩放规则。

在以下示例中,容器应用修订版最多可以横向扩展为五个副本和横向缩减为零。 缩放阈值设置为每秒 100 个并发连接。

示例

tcp 节定义 TCP 缩放规则。

缩放属性 说明 默认值 最小值 最大值
concurrentConnections 当并发 TCP 连接数超过此值时,将添加另一个副本。 随着并发连接数的增加,继续添加副本直到其数量达到 maxReplicas 10 1 不适用
{
  ...
  "resources": {
    ...
    "properties": {
      ...
      "template": {
        ...
        "scale": {
          "minReplicas": 0,
          "maxReplicas": 5,
          "rules": [{
            "name": "tcp-rule",
            "tcp": {
              "metadata": {
                "concurrentConnections": "100"
              }
            }
          }]
        }
      }
    }
  }
}

--scale-rule-tcp-concurrencyupdate 命令中使用 create 参数定义 TCP 缩放规则。

CLI 参数 说明 默认值 最小值 最大值
--scale-rule-tcp-concurrency 当并发 TCP 连接数超过此值时,将添加另一个副本。 随着并发连接数的增加,继续添加副本直到其数量达到 max-replicas 10 1 不适用
az containerapp create \
  --name <CONTAINER_APP_NAME> \
  --resource-group <RESOURCE_GROUP> \
  --environment <ENVIRONMENT_NAME> \
  --image <CONTAINER_IMAGE_LOCATION>
  --min-replicas 0 \
  --max-replicas 5 \
  --transport tcp \
  --ingress <external/internal> \
  --target-port <CONTAINER_TARGET_PORT> \
  --scale-rule-name azure-tcp-rule \
  --scale-rule-type tcp \
  --scale-rule-tcp-concurrency 100

在 Azure 门户中不受支持。 使用 Azure CLIAzure 资源管理器配置 TCP 缩放规则。

自定义

可以使用以下默认值根据任何基于 ScaledObjectKEDA 缩放器创建自定义容器应用缩放规则:

默认值
轮询间隔 30
冷却期 300

对于事件驱动的容器应用作业,可以根据任何基于 ScaledJob 的 KEDA 缩放器创建自定义缩放规则。

以下示例演示如何创建自定义缩放规则。

示例

此示例演示如何将 Azure 服务总线缩放器转换为容器应用缩放规则,但你将对任何其他基于 ScaledObjectKEDA 缩放器规范使用相同的过程。

对于身份验证,KEDA 缩放器身份验证参数采用容器应用机密托管标识

以下过程说明如何将 KEDA 缩放器转换为容器应用缩放规则。 此代码片段摘自某个 ARM 模板,其中演示了每个节要放在整个模板的上下文中的哪个位置。

{
  ...
  "resources": {
    ...
    "properties": {
      ...
      "configuration": {
        ...
        "secrets": [
          {
            "name": "<NAME>",
            "value": "<VALUE>"
          }
        ]
      },
      "template": {
        ...
        "scale": {
          "minReplicas": 0,
          "maxReplicas": 5,
          "rules": [
            {
              "name": "<RULE_NAME>",
              "custom": {
                "metadata": {
                  ...
                },
                "auth": [
                  {
                    "secretRef": "<NAME>",
                    "triggerParameter": "<PARAMETER>"
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

有关如何将以下示例放入 ARM 模板的上下文信息,请参阅此摘录。

首先,定义缩放规则的类型和元数据。

  1. 在 KEDA 缩放器规范中找到 type 值。

    triggers:
    - type: azure-servicebus
      metadata:
        queueName: my-queue
        namespace: service-bus-namespace
        messageCount: "5"
    
  2. 在 ARM 模板中,将缩放器 type 值输入缩放规则的 custom.type 属性中。

    ...
    "rules": [
      {
        "name": "azure-servicebus-queue-rule",
        "custom": {
          "type": "azure-servicebus",
          "metadata": {
            "queueName": "my-queue",
            "namespace": "service-bus-namespace",
            "messageCount": "5"
          }
        }
      }
    ]
    ...
    
  3. 在 KEDA 缩放器规范中找到 metadata 值。

    triggers:
    - type: azure-servicebus
      metadata:
        queueName: my-queue
        namespace: service-bus-namespace
        messageCount: "5"
    
  4. 在 ARM 模板中,将所有元数据值添加到缩放规则的 custom.metadata 节。

    ...
    "rules": [
      {
        "name": "azure-servicebus-queue-rule",
        "custom": {
          "type": "azure-servicebus",
          "metadata": {
            "queueName": "my-queue",
            "namespace": "service-bus-namespace",
            "messageCount": "5"
          }
        }
      }
    ]
    ...
    

身份验证

容器应用缩放规则支持基于机密的身份验证。 Azure 资源(包括 Azure 队列存储、Azure 服务总线和 Azure 事件中心)的缩放规则也支持托管标识。 尽可能使用托管标识身份验证来避免在应用中存储机密。

使用机密

若要使用机密进行身份验证,需要在容器应用的 secrets 数组中创建机密。 机密值用于缩放规则的 auth 数组中。

KEDA 缩放器可以在 authenticationRef 属性引用的 TriggerAuthentication 中使用机密。 可以将 TriggerAuthentication 对象映射到容器应用缩放规则。

  1. 找到 KEDA ScaledObject 规范引用的 TriggerAuthentication 对象。

  2. TriggerAuthentication 对象中,找到每个 secretTargetRef 及其关联机密。

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-secrets
      namespace: my-project
    type: Opaque
    data:
      connection-string-secret: <SERVICE_BUS_CONNECTION_STRING>
    ---
    apiVersion: keda.sh/v1alpha1
    kind: TriggerAuthentication
    metadata:
      name: azure-servicebus-auth
    spec:
      secretTargetRef:
      - parameter: connection
        name: my-secrets
        key: connection-string-secret
    ---
    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      name: azure-servicebus-queue-rule
      namespace: default
    spec:
      scaleTargetRef:
        name: my-scale-target
      triggers:
      - type: azure-servicebus
        metadata:
          queueName: my-queue
          namespace: service-bus-namespace
          messageCount: "5"
        authenticationRef:
            name: azure-servicebus-auth
    
    1. 向缩放规则的 auth 数组添加一个条目。

      1. triggerParameter 属性的值设置为 secretTargetRefparameter 属性值。

      2. secretRef 属性的值设置为 secretTargetRefkey 属性的名称。

{
  ...
  "resources": {
    ...
    "properties": {
      ...
      "configuration": {
        ...
        "secrets": [
          {
            "name": "connection-string-secret",
            "value": "<SERVICE_BUS_CONNECTION_STRING>"
          }
        ]
      },
      "template": {
        ...
        "scale": {
          "minReplicas": 0,
          "maxReplicas": 5,
          "rules": [
            {
              "name": "azure-servicebus-queue-rule",
              "custom": {
                "type": "azure-servicebus",
                "metadata": {
                  "queueName": "my-queue",
                  "namespace": "service-bus-namespace",
                  "messageCount": "5"
                },
                "auth": [
                  {
                    "secretRef": "connection-string-secret",
                    "triggerParameter": "connection"
                  }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

某些缩放器支持使用后缀为 FromEnv 的元数据来引用环境变量中的值。 容器应用在 ARM 模板中列出的第一个容器中查找该环境变量。

有关更多安全相关信息,请参阅注意事项部分

使用托管标识

容器应用缩放规则可以使用托管标识向 Azure 服务进行身份验证。 以下 ARM 模板会传入基于系统的托管标识,以便针对 Azure 队列缩放器进行身份验证。

"scale": {
  "minReplicas": 0,
  "maxReplicas": 4,
  "rules": [
    {
      "name": "azure-queue",
      "custom": {
        "type": "azure-queue",
        "metadata": {
          "accountName": "apptest123",
          "queueName": "queue1",
          "queueLength": "1"
        },
        "identity": "system"
      }
    }
  ]
}

若要详细了解如何将托管标识与缩放规则配合使用,请参阅托管标识

  1. 在 KEDA 缩放器规范中找到 type 值。

    triggers:
    - type: azure-servicebus
      metadata:
        queueName: my-queue
        namespace: service-bus-namespace
        messageCount: "5"
    
  2. 在 CLI 命令中,将 --scale-rule-type 参数设置为规范 type 值。

    az containerapp create \
      --name <CONTAINER_APP_NAME> \
      --resource-group <RESOURCE_GROUP> \
      --environment <ENVIRONMENT_NAME> \
      --image <CONTAINER_IMAGE_LOCATION>
      --min-replicas 0 \
      --max-replicas 5 \
      --secrets "connection-string-secret=<SERVICE_BUS_CONNECTION_STRING>" \
      --scale-rule-name azure-servicebus-queue-rule \
      --scale-rule-type azure-servicebus \
      --scale-rule-metadata "queueName=my-queue" \
                            "namespace=service-bus-namespace" \
                            "messageCount=5" \
      --scale-rule-auth "connection=connection-string-secret"
    
  3. 在 KEDA 缩放器规范中找到 metadata 值。

    triggers:
    - type: azure-servicebus
      metadata:
        queueName: my-queue
        namespace: service-bus-namespace
        messageCount: "5"
    
  4. 在 CLI 命令中,将 --scale-rule-metadata 参数设置为元数据值。

    需要将值从 YAML 格式转换为键/值对才能在命令行中使用。 用空格分隔每个键值对。

    az containerapp create \
      --name <CONTAINER_APP_NAME> \
      --resource-group <RESOURCE_GROUP> \
      --environment <ENVIRONMENT_NAME> \
      --image <CONTAINER_IMAGE_LOCATION>
      --min-replicas 0 \
      --max-replicas 5 \
      --secrets "connection-string-secret=<SERVICE_BUS_CONNECTION_STRING>" \
      --scale-rule-name azure-servicebus-queue-rule \
      --scale-rule-type azure-servicebus \
      --scale-rule-metadata "queueName=my-queue" \
                            "namespace=service-bus-namespace" \
                            "messageCount=5" \
      --scale-rule-auth "connection=connection-string-secret"
    

身份验证

容器应用缩放规则支持基于机密的身份验证。 Azure 资源(包括 Azure 队列存储、Azure 服务总线和 Azure 事件中心)的缩放规则也支持托管标识。 尽可能使用托管标识身份验证来避免在应用中存储机密。

使用机密

若要为容器应用缩放规则配置基于机密的身份验证,请在容器应用中配置机密,并在缩放规则中引用它们。

KEDA 缩放器支持 authenticationRef 属性引用 TriggerAuthentication 中的机密。 可以将对象 TriggerAuthentication 映射到容器应用缩放规则。

  1. 找到 KEDA ScaledObject 规范引用的 TriggerAuthentication 对象。 标识 TriggerAuthentication 对象的每个 secretTargetRef

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-secrets
      namespace: my-project
    type: Opaque
    data:
      connection-string-secret: <SERVICE_BUS_CONNECTION_STRING>
    ---
    apiVersion: keda.sh/v1alpha1
    kind: TriggerAuthentication
    metadata:
      name: azure-servicebus-auth
    spec:
      secretTargetRef:
      - parameter: connection
        name: my-secrets
        key: connection-string-secret
    ---
    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      name: azure-servicebus-queue-rule
      namespace: default
    spec:
      scaleTargetRef:
        name: my-scale-target
      triggers:
      - type: azure-servicebus
        metadata:
          queueName: my-queue
          namespace: service-bus-namespace
          messageCount: "5"
        authenticationRef:
            name: azure-servicebus-auth
    
  2. 在容器应用中,创建与 secretTargetRef 属性匹配的机密

  3. 在 CLI 命令中,为每个 secretTargetRef 条目设置参数。

    1. 使用 --secrets 参数创建机密条目。 如果有多个机密,请用空格分隔它们。

    2. 使用 --scale-rule-auth 参数创建身份验证条目。 如果有多个条目,请用空格分隔它们。

az containerapp create \
  --name <CONTAINER_APP_NAME> \
  --resource-group <RESOURCE_GROUP> \
  --environment <ENVIRONMENT_NAME> \
  --image <CONTAINER_IMAGE_LOCATION>
  --min-replicas 0 \
  --max-replicas 5 \
  --secrets "connection-string-secret=<SERVICE_BUS_CONNECTION_STRING>" \
  --scale-rule-name azure-servicebus-queue-rule \
  --scale-rule-type azure-servicebus \
  --scale-rule-metadata "queueName=my-queue" \
                        "namespace=service-bus-namespace" \
                        "messageCount=5" \
  --scale-rule-auth "connection=connection-string-secret"

使用托管标识

容器应用缩放规则可以使用托管标识向 Azure 服务进行身份验证。 以下命令使用用户分配的托管标识创建容器应用,并使用它针对 Azure 队列缩放器进行身份验证。

az containerapp create \
  --resource-group <RESOURCE_GROUP> \
  --name <APP_NAME> \
  --environment <ENVIRONMENT_ID> \
  --user-assigned <USER_ASSIGNED_IDENTITY_ID> \
  --scale-rule-name azure-queue \
  --scale-rule-type azure-queue \
  --scale-rule-metadata "accountName=<AZURE_STORAGE_ACCOUNT_NAME>" "queueName=queue1" "queueLength=1" \
  --scale-rule-identity <USER_ASSIGNED_IDENTITY_ID>

将占位符替换成自己的值。

  1. 在 Azure 门户中转到你的容器应用。

  2. 选择“缩放”。

  3. 选择“编辑并部署”。

  4. 选择“缩放和副本”选项卡

  5. 选择最小和最大副本数范围。

    Azure 容器应用缩放范围滑块的屏幕截图。

  6. 选择 添加

  7. 在“规则名称”框中输入规则名称。

  8. 从“类型”下拉列表中选择“自定义”。

  9. 在 KEDA 缩放器规范中找到 type 值。

    triggers:
    - type: azure-servicebus
      metadata:
        queueName: my-queue
        namespace: service-bus-namespace
        messageCount: "5"
    
  10. 在“自定义规则类型”框中输入缩放器 type 值。

  11. 在 KEDA 缩放器规范中找到 metadata 值。

    triggers:
    - type: azure-servicebus
      metadata:
        queueName: my-queue
        namespace: service-bus-namespace
        messageCount: "5"
    
  12. 在门户中找到“元数据”部分,然后选择“添加”。 在 KEDA ScaledObject 规范元数据节中输入每个项的名称和值。

身份验证

容器应用缩放规则支持基于机密的身份验证。 Azure 资源(包括 Azure 队列存储、Azure 服务总线和 Azure 事件中心)的缩放规则也支持托管标识。 尽可能使用托管标识身份验证来避免在应用中存储机密。

使用机密

  1. 在容器应用中,创建要引用的机密

  2. 找到 KEDA ScaledObject 规范引用的 TriggerAuthentication 对象。 标识 TriggerAuthentication 对象的每个 secretTargetRef

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-secrets
      namespace: my-project
    type: Opaque
    data:
      connection-string-secret: <SERVICE_BUS_CONNECTION_STRING>
    ---
    apiVersion: keda.sh/v1alpha1
    kind: TriggerAuthentication
    metadata:
      name: azure-servicebus-auth
    spec:
      secretTargetRef:
      - parameter: connection
        name: my-secrets
        key: connection-string-secret
    ---
    apiVersion: keda.sh/v1alpha1
    kind: ScaledObject
    metadata:
      name: azure-servicebus-queue-rule
      namespace: default
    spec:
      scaleTargetRef:
        name: my-scale-target
      triggers:
      - type: azure-servicebus
        metadata:
          queueName: my-queue
          namespace: service-bus-namespace
          messageCount: "5"
        authenticationRef:
            name: azure-servicebus-auth
    
  3. 在“身份验证”部分选择“添加”,为每个 KEDA secretTargetRef 参数创建一个条目。

使用托管标识

Azure 门户不支持托管标识身份验证。 请使用 Azure CLIAzure 资源管理器通过托管标识进行身份验证。

默认缩放规则

如果未创建缩放规则,则会将默认缩放规则应用于容器应用。

触发器 副本数下限 副本数上限
HTTP 0 10

重要

如果未启用入口,请确保创建缩放规则,或者将 minReplicas 设置为 1 或更大。 如果已禁用入口并且未定义 minReplicas 或自定义缩放规则,则容器应用将缩放为零并且无法重新启动。

缩放行为

缩放行为具有以下默认值:

参数
轮询间隔 30 秒
冷却期 300 秒
纵向扩展稳定时段 0 秒
纵向缩减稳定时段 300 秒
纵向扩展步长 1、4、当前值的 100%
纵向缩减步长 当前值的 100%
缩放算法 desiredReplicas = ceil(currentMetricValue / targetMetricValue)
  • 轮询间隔是 KEDA 查询事件源的频率。 此值不适用于 HTTP 和 TCP 缩放规则。
  • 冷却期是观察到最后一个事件之后,在应用程序纵向缩减到其最小副本计数之前经过的时间。
  • 纵向扩展稳定时段是满足纵向扩展条件后,在执行纵向扩展决策之前等待的时间。
  • 纵向缩减稳定时段是满足纵向缩减条件后,在执行纵向缩减决策之前等待的时间。
  • 纵向扩展步长是新实例的添加速率。 它从 1、4、8、16、32 开始,不超过配置的最大副本计数。
  • 纵向缩减步长是移除副本的速率。 默认情况下,会移除需要关闭的所有副本。
  • 缩放算法是用于计算当前所需副本数的公式。

示例

对于下列缩放规则:

"minReplicas": 0,
"maxReplicas": 20,
"rules": [
  {
    "name": "azure-servicebus-queue-rule",
    "custom": {
      "type": "azure-servicebus",
      "metadata": {
        "queueName": "my-queue",
        "namespace": "service-bus-namespace",
        "messageCount": "5"
      }
    }
  }
]

随着应用扩展,KEDA 从一个空队列开始,并执行以下步骤:

  1. 每 30 秒查看一次 my-queue
  2. 如果队列长度等于 0,请返回到 (1)。
  3. 如果队列长度为 > 0,请将应用缩放为 1。
  4. 如果队列长度为 50,则计算 desiredReplicas = ceil(50/5) = 10
  5. 将应用缩放到 min(maxReplicaCount, desiredReplicas, max(4, 2*currentReplicaCount))
  6. 返回到 (1)。

如果将应用缩放到最大副本计数 20,则缩放将执行与前面相同的步骤。 仅当满足 300 秒(纵向缩减稳定时段)这一条件时,才进行纵向缩减。 一旦队列长度为 0,KEDA 就将等待 300 秒(冷却期),然后再将应用缩放为 0。

注意事项

  • 在“多修订版”模式下,添加新的缩放触发器会创建应用程序的新修订版,但旧修订版仍可与旧缩放规则配合使用。 使用“修订版管理”页管理流量分配。

  • 当应用程序缩放为 0 时,不会产生任何使用费用。 有关定价的详细信息,请参阅 Azure 容器应用中的计费

  • 需要在 Azure 容器应用上为所有 .NET 应用启用数据保护。 有关详细信息,请参阅在 Azure 容器应用上部署和缩放 ASP.NET Core 应用

已知限制

  • 不支持垂直缩放。

  • 副本数量是一个目标数量,并不作保证。

  • 如果使用 Dapr 执行组件管理状态,则应考虑到不支持缩放到零的情况。 Dapr 使用虚拟执行组件来管理异步调用,这意味着其内存中表示形式未绑定到其标识或生存期。

后续步骤