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

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

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

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

比例尺定义

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

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

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

    伸缩规则通过 HTTP、TCP(传输控制协议)或自定义协议实现。

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

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

定义缩放规则时,请考虑以下各项:

  • 如果容器应用程序缩放到零,则不会对你计收使用费。
  • 未处理但保留在内存中的副本可能会按较低的“空闲”速率计费。 有关详细信息,请参阅计费。
  • 如果你想要确保修订版实例始终运行,请将最小副本数设置为 1 或更高。
  • 在平台升级或维护期间,可能会暂时看到比预期更多的副本。 容器应用确保在流量切换之前,对新副本进行预热,以使生产工作负载不受影响,这与 Kubernetes 的默认行为类似。 操作完成后,将自动删除额外的副本。

比例尺规则

三类触发器决定了缩放的发生方式:

  • 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 不适用
resource symbolicname 'Microsoft.App/containerApps@2025-02-02-preview' = {
  ...
  properties: {
    ...
    template: {
      ...
      scale: {
        maxReplicas: 0
        minReplicas: 5
        rules: [
          {
            name: 'http-rule'
            http: {
              metadata: {
                concurrentRequests: '100'
              }
            }
          }
        ]
      }
    }
  }
}

注意事项

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

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-concurrency或create命令中的update参数定义 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 不适用
resource symbolicname 'Microsoft.App/containerApps@2025-02-02-preview' = {
  ...
  properties: {
    ...
    template: {
      ...
      scale: {
        maxReplicas: 0
        minReplicas: 5
        rules: [
          {
            name: 'tcp-rule'
            http: {
              metadata: {
                concurrentConnections: '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-concurrency或create命令中的update参数定义 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 CLI、Azure 资源管理器 或 Bicep 配置 TCP 缩放规则。

自定义

使用以下默认值,基于任何基于 ScaledObject 的 KEDA 缩放器 创建自定义容器应用缩放规则:

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

注意事项

冷却期仅在从最后一个副本缩减至 0 时生效。 冷却期不会影响扩缩容,因为任何其他副本都会被移除。

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

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

示例

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

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

以下过程说明如何将 KEDA 缩放器转换为容器应用缩放规则。 此代码片段是 Bicep 模板的摘录,用于显示每个部分在整体模板的上下文中的位置。

resource symbolicname 'Microsoft.App/containerApps@2025-02-02-preview' = {
  ...
  properties: {
    ...
    configuration: {
      ...
      secrets: [
        {
          name: '<NAME>'
          value: '<VALUE>'
        }
      ]
    }
    template: {
      ...
      scale: {
        maxReplicas: 0
        minReplicas: 5
        rules: [
          {
            name: '<RULE_NAME>'
            custom: {
              metadata: {
                ...
              }
              auth: [
                {
                  secretRef: '<NAME>'
                  triggerParameter: '<PARAMETER>'
                }
              ]
            }
          }
        ]
      }
    }
  }
}

请参阅以下摘录,了解下面的示例如何融入 Bicep 模板。

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

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

    triggers:
     - type: azure-servicebus ⬅️
      metadata:
        queueName: my-queue
        namespace: service-bus-namespace
        messageCount: "5"
    
  2. 在 Bicep 模板中,将缩放因子 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. 在 Bicep 模板中,将所有元数据值添加到缩放规则的 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 缩放程序可以在属性引用的 TriggerAuthenticationauthenticationRef 中使用机密。 可以将 TriggerAuthentication 对象映射到容器应用缩放规则。

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

  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
    
  3. 在 Bicep 模板中,对于每个机密:

    1. 将一个机密添加到容器应用的包含机密名称和值的 secrets 数组。

    2. 向缩放规则的 auth 数组添加一个条目。

      1. 将 triggerParameter 属性的值设置为 secretTargetRef 的 parameter 属性值。

      2. 将 secretRef 属性的值设置为 secretTargetRef 的 key 属性的名称。

        resource symbolicname 'Microsoft.App/containerApps@2025-02-02-preview' = {
          ...
          properties: {
            ...
            configuration: {
              ...
              secrets: [
                {                                          ⬅️
                  name: 'connection-string-secret'         ⬅️
                  value: '<SERVICE_BUS_CONNECTION_STRING>' ⬅️
                }                                          ⬅️
              ]
            }
            template: {
              ...
              scale: {
                maxReplicas: 0
                minReplicas: 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服务进行身份验证。 以下 Bicep 模板传递系统托管标识用于对 Azure 队列扩展器进行身份验证。

在使用以下代码之前,请将由 <> 包围的占位符替换为您的值。

scale: {
  minReplicas: 0
  maxReplicas: 4
  rules: [
    {
      name: 'azure-queue'
      custom: {
        type: 'azure-queue'
        metadata: {
          accountName: '<ACCOUNT_NAME>'
          queueName: '<QUEUE_NAME>'
          queueLength: '1'
        },
        identity: 'system'
      }
    }
  ]
}

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

以下过程说明如何将 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 缩放程序可以在属性引用的 TriggerAuthenticationauthenticationRef 中使用机密。 可以将 TriggerAuthentication 对象映射到容器应用缩放规则。

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

  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
    
  3. 在 ARM 模板中,对于每个机密:

    1. 将一个机密添加到容器应用的包含机密名称和值的 secrets 数组。

    2. 向缩放规则的 auth 数组添加一个条目。

      1. 将 triggerParameter 属性的值设置为 secretTargetRef 的 parameter 属性值。

      2. 将 secretRef 属性的值设置为 secretTargetRef 的 key 属性的名称。

    {
      ...
      "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": "<ACCOUNT_NAME>",
          "queueName": "<QUEUE_NAME>",
          "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 缩放器支持在 TriggerAuthentication 中使用机密,authenticationRef 属性对此进行引用。 可以将对象 TriggerAuthentication 映射到容器应用缩放规则。

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

    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. 在“自定义规则类型”框中输入缩放值 。

  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 TriggerAuthentication 规范引用的 ScaledObject 对象。 识别 secretTargetRef 对象的每个 TriggerAuthentication。

    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 参数创建一个条目。

使用托管标识

Azure portal 不支持托管标识身份验证。 使用 Azure CLI 或 Azure 资源管理器 使用托管标识进行身份验证。

默认缩放规则

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

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

重要

如果您没有启用入口控制,请确保创建比例规则,或者将 minReplicas 设置为 1 或更大。 如果禁用了入站流量且未定义 minReplicas 或自定义缩放规则,您的容器应用将缩减至零,且无法重新启动。

缩放行为

缩放具有以下行为:

行为 值
轮询间隔 30 秒
冷却期 300 秒
扩大稳定窗口 0 秒
缩小稳定窗口 300 秒
扩展步骤 1, 4, 8, 16, 32, ...一直到配置的最大副本计数
缩减步长 需要关闭的 100% 副本
缩放算法 desiredReplicas = ceil(currentMetricValue / targetMetricValue)
  • 轮询间隔 是 KEDA 查询事件源的频率。 此值不适用于 HTTP 和 TCP 缩放规则。
  • 冷却期是指自上次事件发生后,KEDA 在将应用程序缩容到其最小副本数之前所等待的时长。
  • 纵向扩展稳定窗口 是在满足纵向扩展条件后,KEDA 在执行纵向扩展决策之前等待的时间。
  • 缩减稳定窗口 是在满足缩减条件后 KEDA 执行缩减决策之前等待的时间。
  • 纵向扩展步骤 是容器应用横向扩展时添加的副本数。它从 1 开始,然后增加到 4、8、16、32 等,最多达到配置的最大副本计数。
  • 缩减步骤指容器应用缩减时移除的副本数量。 KEDA 会移除 100% 需要关闭的副本。
  • 缩放算法是用于计算当前所需副本数的公式。

示例

对于下列缩放规则:

"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。

注意事项

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

  • 当应用程序缩放到零时,不会产生任何使用费。 有关更多定价信息,请参阅 Azure 容器应用 中的 Billing。

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

已知限制

  • 不支持垂直缩放。

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

  • 如果你正在使用 Dapr Actor 来管理状态,请注意,不支持缩容到零。 Dapr 使用虚拟演员来管理异步调用,这意味着它们在内存中的表示形式不与它们的标识或生命周期绑定。

后续步骤