Azure 容器应用通过一组声明性缩放规则管理自动水平缩放。 随着容器应用修订版的横向扩展,会按需创建修订版的新实例。 这些实例称为副本。
添加或编辑缩放规则会创建容器应用的新修订版。 修订版是容器应用的不可变快照。 要了解哪些类型的更改会触发新修订版的创建,请参阅修订版更改类型。
事件驱动的容器应用作业使用缩放规则根据事件触发执行。
缩放是限制、规则和行为组合的结果。
限制定义了当容器应用缩放时,每个修订版可用的最小和最大副本数。
缩放限制 默认值 最小值 最大值 每个修订版的最小副本数 0 0 可配置的最大副本数为 1,000。 每个修订版的最大副本数 10 1 可配置的最大副本数为 1,000。 规则是指由容器应用用来决定何时添加或删除副本的条件。
缩放规则是作为 HTTP、TCP(传输控制协议)或通过自定义实现的。
行为是规则和限制的组合,用于随时间推移确定缩放决策。
缩放行为说明如何做出缩放决策。
定义缩放规则时,考虑以下各项很重要:
- 如果容器应用缩放为零,则不会你计收使用费。
- 未处理但保留在内存中的副本可能会按较低的“空闲”速率计费。 有关详细信息,请参阅计费。
- 如果你想要确保修订版实例始终运行,请将最小副本数设置为 1 或更高。
三类触发器决定了缩放的发生方式:
- HTTP:基于对修订版的并发 HTTP 请求数。
- TCP:基于与修订版建立的并发 TCP 连接数。
-
自定义:基于自定义指标,例如:
- 中央处理器
- 内存
- 支持的事件驱动数据源:
- Azure 服务总线
- Azure 事件中心
- Apache Kafka
- 雷迪斯
如果定义了多个缩放规则,则一旦满足任一规则的第一个条件,容器应用就会开始缩放。
使用 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-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
在 Azure 门户中转到你的容器应用
选择“缩放”。
选择“编辑并部署”。
选择“缩放”选项卡。
选择最小和最大副本数范围。
选择 添加 。
在“规则名称”框中输入规则名称。
从“类型”下拉列表中选择“HTTP 缩放”。
在“并发请求”框中,输入容器应用的所需并发请求数。
使用 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-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 资源管理器配置 TCP 缩放规则。
可以使用以下默认值根据任何基于 ScaledObject 的 KEDA 缩放器创建自定义容器应用缩放规则:
默认值 | 秒 |
---|---|
轮询间隔 | 30 |
冷却期 | 300 |
对于事件驱动的容器应用作业,可以根据任何基于 ScaledJob 的 KEDA 缩放器创建自定义缩放规则。
以下示例演示如何创建自定义缩放规则。
此示例演示如何将 Azure 服务总线缩放器转换为容器应用缩放规则,但你将对任何其他基于 ScaledObject 的 KEDA 缩放器规范使用相同的过程。
对于身份验证,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 模板的上下文信息,请参阅此摘录。
首先,定义缩放规则的类型和元数据。
在 KEDA 缩放器规范中找到
type
值。triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
在 ARM 模板中,将缩放器
type
值输入缩放规则的custom.type
属性中。... "rules": [ { "name": "azure-servicebus-queue-rule", "custom": { "type": "azure-servicebus", "metadata": { "queueName": "my-queue", "namespace": "service-bus-namespace", "messageCount": "5" } } } ] ...
在 KEDA 缩放器规范中找到
metadata
值。triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
在 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 对象映射到容器应用缩放规则。
找到 KEDA
TriggerAuthentication
规范引用的ScaledObject
对象。在
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
在 ARM 模板中,对于每个机密:
将一个机密添加到容器应用的包含机密名称和值的
secrets
数组。向缩放规则的
auth
数组添加一个条目。将
triggerParameter
属性的值设置为secretTargetRef
的parameter
属性值。将
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": "apptest123",
"queueName": "queue1",
"queueLength": "1"
},
"identity": "system"
}
}
]
}
若要详细了解如何将托管标识与缩放规则配合使用,请参阅托管标识。
在 KEDA 缩放器规范中找到
type
值。triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
在 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"
在 KEDA 缩放器规范中找到
metadata
值。triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
在 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
映射到容器应用缩放规则。
找到 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
在 CLI 命令中,为每个
secretTargetRef
条目设置参数。使用
--secrets
参数创建机密条目。 如果有多个机密,请用空格分隔它们。使用
--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>
将占位符替换成自己的值。
在 Azure 门户中转到你的容器应用。
选择“缩放”。
选择“编辑并部署”。
选择“缩放和副本”选项卡。
选择最小和最大副本数范围。
选择 添加 。
在“规则名称”框中输入规则名称。
从“类型”下拉列表中选择“自定义”。
在 KEDA 缩放器规范中找到
type
值。triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
在“自定义规则类型”框中输入缩放器 值。
在 KEDA 缩放器规范中找到
metadata
值。triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
在门户中找到“元数据”部分,然后选择“添加”。 在 KEDA
ScaledObject
规范元数据节中输入每个项的名称和值。
容器应用缩放规则支持基于机密的身份验证。 Azure 资源(包括 Azure 队列存储、Azure 服务总线和 Azure 事件中心)的缩放规则也支持托管标识。 尽可能使用托管标识身份验证来避免在应用中存储机密。
在容器应用中,创建要引用的机密。
找到 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
在“身份验证”部分选择“添加”,为每个 KEDA 参数创建一个条目。
Azure 门户不支持托管标识身份验证。 请使用 Azure CLI 或 Azure 资源管理器通过托管标识进行身份验证。
如果未创建缩放规则,则会将默认缩放规则应用于容器应用。
触发器 | 副本数下限 | 副本数上限 |
---|---|---|
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 从一个空队列开始,并执行以下步骤:
- 每 30 秒查看一次
my-queue
。 - 如果队列长度等于 0,请返回到 (1)。
- 如果队列长度为 > 0,请将应用缩放为 1。
- 如果队列长度为 50,则计算
desiredReplicas = ceil(50/5) = 10
。 - 将应用缩放到
min(maxReplicaCount, desiredReplicas, max(4, 2*currentReplicaCount))
- 返回到 (1)。
如果将应用缩放到最大副本计数 20,则缩放将执行与前面相同的步骤。 仅当满足 300 秒(纵向缩减稳定时段)这一条件时,才进行纵向缩减。 一旦队列长度为 0,KEDA 就将等待 300 秒(冷却期),然后再将应用缩放为 0。
在“多修订版”模式下,添加新的缩放触发器会创建应用程序的新修订版,但旧修订版仍可与旧缩放规则配合使用。 使用“修订版管理”页管理流量分配。
当应用程序缩放为 0 时,不会产生任何使用费用。 有关定价的详细信息,请参阅 Azure 容器应用中的计费。
需要在 Azure 容器应用上为所有 .NET 应用启用数据保护。 有关详细信息,请参阅在 Azure 容器应用上部署和缩放 ASP.NET Core 应用。
不支持垂直缩放。
副本数量是一个目标数量,并不作保证。
如果使用 Dapr 执行组件管理状态,则应考虑到不支持缩放到零的情况。 Dapr 使用虚拟执行组件来管理异步调用,这意味着其内存中表示形式未绑定到其标识或生存期。