培训
模块
本模块介绍 Azure 容器应用中的修订概念,并讨论应用程序生命周期管理的选项。 本模块还介绍缩放选项和流入量设置,包括 Azure 容器应用的流量拆分。
你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure 容器应用通过一组声明性缩放规则管理自动水平缩放。 随着容器应用修订版的横向扩展,会按需创建修订版的新实例。 这些实例称为副本。
添加或编辑缩放规则会创建容器应用的新修订版。 修订版是容器应用的不可变快照。 要了解哪些类型的更改会触发新修订版的创建,请参阅修订版更改类型。
事件驱动的容器应用作业使用缩放规则根据事件触发执行。
缩放是限制、规则和行为组合的结果。
限制定义了当容器应用缩放时,每个修订版可用的最小和最大副本数。
缩放限制 | 默认值 | 最小值 | 最大值 |
---|---|---|---|
每个修订版的最小副本数 | 0 | 0 | 可配置的最大副本数为 1,000。 |
每个修订版的最大副本数 | 10 | 1 | 可配置的最大副本数为 1,000。 |
规则是指由容器应用用来决定何时添加或删除副本的条件。
缩放规则是作为 HTTP、TCP(传输控制协议)或通过自定义实现的。
行为是规则和限制的组合,用于随时间推移确定缩放决策。
缩放行为说明如何做出缩放决策。
定义缩放规则时,考虑以下各项很重要:
缩放由三种不同类别的触发器驱动:
如果定义了多个缩放规则,则一旦满足任一规则的第一个条件,容器应用就会开始缩放。
使用 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 连接的阈值,该阈值决定了应用缩放方式。 每 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 \
--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 中使用机密。 可以将 TriggerAuthentication 对象映射到容器应用缩放规则。
找到 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
在 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 中的机密。 可以将对象 TriggerAuthentication
映射到容器应用缩放规则。
找到 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 服务进行身份验证。 以下命令使用用户分配的托管标识创建容器应用,并使用它针对 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"
在“自定义规则类型”框中输入缩放器 type
值。
在 KEDA 缩放器规范中找到 metadata
值。
triggers:
- type: azure-servicebus
metadata:
queueName: my-queue
namespace: service-bus-namespace
messageCount: "5"
在门户中找到“元数据”部分,然后选择“添加”。 在 KEDA ScaledObject
规范元数据节中输入每个项的名称和值。
容器应用缩放规则支持基于机密的身份验证。 Azure 资源(包括 Azure 队列存储、Azure 服务总线和 Azure 事件中心)的缩放规则也支持托管标识。 尽可能使用托管标识身份验证来避免在应用中存储机密。
在容器应用中,创建要引用的机密。
找到 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
参数创建一个条目。
Azure 门户不支持托管标识身份验证。 请使用 Azure CLI 或 Azure 资源管理器通过托管标识进行身份验证。
如果未创建缩放规则,则会将默认缩放规则应用于容器应用。
触发器 | 副本数下限 | 副本数上限 |
---|---|---|
HTTP | 0 | 10 |
重要
如果未启用入口,请确保创建缩放规则,或者将 minReplicas
设置为 1 或更大。 如果已禁用入口并且未定义 minReplicas
或自定义缩放规则,则容器应用将缩放为零并且无法重新启动。
缩放行为具有以下默认值:
参数 | 值 |
---|---|
轮询间隔 | 30 秒 |
冷却期 | 300 秒 |
纵向扩展稳定时段 | 0 秒 |
纵向缩减稳定时段 | 300 秒 |
纵向扩展步长 | 1、4、当前值的 100% |
纵向缩减步长 | 当前值的 100% |
缩放算法 | desiredReplicas = ceil(currentMetricValue / targetMetricValue) |
对于下列缩放规则:
"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 从一个空队列开始,并执行以下步骤:
my-queue
。desiredReplicas = ceil(50/5) = 10
。min(maxReplicaCount, desiredReplicas, max(4, 2*currentReplicaCount))
如果将应用缩放到最大副本计数 20,则缩放将执行与前面相同的步骤。 仅当满足 300 秒(纵向缩减稳定时段)这一条件时,才进行纵向缩减。 一旦队列长度为 0,KEDA 就将等待 300 秒(冷却期),然后再将应用缩放为 0。
在“多修订版”模式下,添加新的缩放触发器会创建应用程序的新修订版,但旧修订版仍可与旧缩放规则配合使用。 使用“修订版管理”页管理流量分配。
当应用程序缩放为 0 时,不会产生任何使用费用。 有关定价的详细信息,请参阅 Azure 容器应用中的计费。
需要在 Azure 容器应用上为所有 .NET 应用启用数据保护。 有关详细信息,请参阅在 Azure 容器应用上部署和缩放 ASP.NET Core 应用。
不支持垂直缩放。
副本数量是一个目标数量,并不作保证。
如果使用 Dapr 执行组件管理状态,则应考虑到不支持缩放到零的情况。 Dapr 使用虚拟执行组件来管理异步调用,这意味着其内存中表示形式未绑定到其标识或生存期。
培训
模块
本模块介绍 Azure 容器应用中的修订概念,并讨论应用程序生命周期管理的选项。 本模块还介绍缩放选项和流入量设置,包括 Azure 容器应用的流量拆分。