你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
在 Azure 容器应用中设置缩放规则
Azure 容器应用通过一组声明性缩放规则管理自动水平缩放。 随着容器应用修订版的横向扩展,会按需创建修订版的新实例。 这些实例称为副本。
添加或编辑缩放规则会创建容器应用的新修订版。 修订版是容器应用的不可变快照。 参阅修订版更改类型,以查看哪些类型的更改会触发新修订版的创建。
事件驱动的容器应用作业使用缩放规则根据事件触发执行。
缩放定义
缩放是由限制、规则和行为的组合来定义的。
限制是指当容器应用缩放时,每个修订版可用的最小和最大副本数。
缩放限制 默认值 最小值 最大值 每个修订版的最小副本数 0 0 可配置的最大副本数在 Azure 门户中为 300 个,在 Azure CLI 中为 1,000 个。 每个修订版的最大副本数 10 1 可配置的最大副本数在 Azure 门户中为 300 个,在 Azure CLI 中为 1,000 个。 有关详细信息,请参阅 Azure 容器应用的配额。
规则是指由容器应用用来决定何时添加或删除副本的条件。
缩放规则以 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-concurrency
或 update
命令中使用 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
在 Azure 门户中转到你的容器应用
选择“缩放”。
选择“编辑并部署”。
选择“缩放”选项卡。
选择最小和最大副本数范围。
选择 添加 。
在“规则名称”框中输入规则名称。
从“类型”下拉列表中选择“HTTP 缩放”。
在“并发请求”框中,输入容器应用的所需并发请求数。
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-concurrency
或 update
命令中使用 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 \
--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" } } } ] ...
身份验证
KEDA 缩放器支持在 authenticationRef
属性引用的 TriggerAuthentication 中使用机密。 可以将 TriggerAuthentication 对象映射到容器应用缩放规则。
注意
容器应用缩放规则仅支持机密引用。 不支持其他身份验证类型,例如 pod 标识。
找到 KEDA
ScaledObject
规范引用的TriggerAuthentication
对象。在 KEDA 规范中,找到
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 模板中,将所有条目添加到缩放规则的
auth
数组。将一个机密添加到容器应用的包含机密值的
secrets
数组。将
triggerParameter
属性的值设置为TriggerAuthentication
的key
属性值。将
secretRef
属性的值设置为容器应用机密的名称。
{ ... "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 模板中列出的第一个容器中查找该环境变量。有关更多安全相关信息,请参阅注意事项部分。
在 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"
身份验证
KEDA 缩放器支持在 authenticationRef 属性引用的 TriggerAuthentication 中使用机密。 可以将 TriggerAuthentication 对象映射到容器应用缩放规则。
注意
容器应用缩放规则仅支持机密引用。 不支持其他身份验证类型,例如 pod 标识。
找到 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
在容器应用中,创建与
secretTargetRef
属性匹配的机密。在 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 门户中转到你的容器应用。
选择“缩放”。
选择“编辑并部署”。
选择“缩放和副本”选项卡。
选择最小和最大副本数范围。
选择 添加 。
在“规则名称”框中输入规则名称。
从“类型”下拉列表中选择“自定义”。
在 KEDA 缩放器规范中找到
type
值。triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
在“自定义规则类型”框中输入缩放器
type
值。在 KEDA 缩放器规范中找到
metadata
值。triggers: - type: azure-servicebus metadata: queueName: my-queue namespace: service-bus-namespace messageCount: "5"
在门户中找到“元数据”部分,然后选择“添加”。 在 KEDA
ScaledObject
规范元数据节中输入每个项的名称和值。
身份验证
KEDA 缩放器支持在 authenticationRef 属性引用的 TriggerAuthentication 中使用机密。 可以将 TriggerAuthentication 对象映射到容器应用缩放规则。
注意
容器应用缩放规则仅支持机密引用。 不支持其他身份验证类型,例如 pod 标识。
在容器应用中,创建要引用的机密。
找到 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
在“身份验证”部分选择“添加”,为每个 KEDA
secretTargetRef
参数创建一个条目。
默认缩放规则
如果未创建缩放规则,则会将默认缩放规则应用于容器应用。
触发器 | 副本数下限 | 副本数上限 |
---|---|---|
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 使用虚拟执行组件来管理异步调用,这意味着其内存中表示形式未绑定到其标识或生存期。