你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure 容器应用通过一组声明性缩放规则管理自动水平缩放。 你可以使用自定义事件源创建自己的缩放规则。
在本教程中,请添加自定义缩放规则,以使用 Java 指标缩放容器应用并观察应用程序的缩放方式。
先决条件
- 具有活动订阅的 Azure 帐户。 如果你没有,可以免费创建一个。
- Azure CLI。
- 在 Azure 容器应用中部署的 Java 应用程序。
设置环境
使用以下步骤定义环境变量并设置环境。
创建变量来支持规模配置。
export LOCATION=eastus export TENANT_ID={tenant-id} export SUBSCRIPTION_ID={subscription-id} export RESOURCE_GROUP=my-resource-group export APP_NAME=my-aca-app export IDENTITY_NAME=my-identity变量 说明 LOCATION创建 Azure 容器应用的 Azure 区域位置。 TENANT_ID你的租户的 ID。 SUBSCRIPTION_ID用于创建 Azure 容器应用的订阅 ID。 RESOURCE_GROUPAzure 容器应用的 Azure 资源组名称。 APP_NAMEAzure 容器应用的应用名称。 IDENTITY_NAME托管标识的名称,分配给 Azure 容器应用。 通过 Azure CLI 登录 Azure。
az login
为 Azure 容器应用设置托管标识
为了通过 Azure 容器应用平台指标进行扩展,需要使用托管身份来访问来自 Azure Monitor 的指标。
创建用户分配的标识并将其分配给 Azure 容器应用。 可以按照此文档操作:添加用户分配的标识。 创建标识后,运行 CLI 命令来设置标识 ID。
USER_ASSIGNED_IDENTITY_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $IDENTITY_NAME --query "id" --output tsv)为托管标识授予
Monitoring Reader角色,以从 Azure Monitor 读取数据。 可以在 Azure 内置 Monitor 角色中找到有关 Azure Monitor 角色的更多详细信息。# Get the principal ID for your managed identity PRINCIPAL_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $IDENTITY_NAME --query "principalId" --output tsv) az role assignment create --assignee $PRINCIPAL_ID --role "Monitoring Reader" --scope /subscriptions/$SUBSCRIPTION_ID
添加一项包含 Azure Monitor 指标的缩放规则
若要使用 Azure Monitor 指标进行缩放,可以参考 Azure Monitor Kubernetes 事件驱动的自动缩放(KEDA)缩放程序 来定义容器应用缩放规则。
下面是用于设置缩放规则的核心元数据的列表。
| 元数据键 | 说明 |
|---|---|
| 租户ID | 包含 Azure 资源的租户的 ID。 |
| subscriptionId(订阅ID) | 包含 Azure 资源的 Azure 订阅的 ID。 |
| 资源组名称 | Azure 资源的资源组的名称。 |
| resourceURI | 缩短了的 Azure 资源 URI,其格式为 <resourceProviderNamespace>/<resourceType>/<resourceName>。 |
| metricName | 要查询的指标的名称。 |
| metricAggregationType | Azure Monitor 指标的聚合方法。 选项包括“平均值”、“总计”、“最大值”。 |
| metricFilter | 筛选器的名称可以通过使用官方文档中列出的维度来更具体化。 (可选) |
| metricAggregationInterval | 指标收集时间(格式:hh:mm:ss,默认:0:5:0,可选) |
| 目标值 | 可触发缩放操作的目标值。 (此值可以是浮点数) |
为应用程序添加一项包含 Azure 容器应用的 Azure Monitor 指标的缩放规则。
az containerapp update \
--name $APP_NAME \
--resource-group $RESOURCE_GROUP \
--min-replicas 1 \
--max-replicas 10 \
--scale-rule-name scale-with-azure-monitor-metrics \
--scale-rule-type azure-monitor \
--scale-rule-metadata "tenantId=${TENANT_ID}" \
"subscriptionId=${SUBSCRIPTION_ID}" \
"resourceGroupName=${RESOURCE_GROUP}" \
"resourceURI=Microsoft.App/containerapps/${APP_NAME}" \
"metricName=JvmGcCount" \
"metricAggregationType=Total" \
"metricAggregationInterval=0:1:0" \
"targetValue=30" \
--scale-rule-identity $USER_ASSIGNED_IDENTITY_ID
此命令将一项缩放规则添加到容器应用,其名称为 scale-with-azure-monitor-metrics
- 缩放类型设置为
azure-monitor。 - KEDA 使用资源 ID 为
USER_ASSIGNED_IDENTITY_ID的托管标识与 Azure Monitor 身份验证并查询容器应用的指标。 - KEDA 会查询指标
JvmGcCount,并以聚合类型Total聚合 1 分钟内的指标值。 - 目标值设置为
30,这意味着 KEDA 使用desiredReplicas计算ceil(AggregatedMetricValue(JvmGcCount)/30)。
注意
指标 JvmGcCount 仅用作示例。 可以使用 Azure Monitor 中的任何指标。 在设置缩放规则之前,请查看 Azure 门户中的指标,以根据应用程序的要求确定适当的指标、聚合间隔和目标值。 此外,在选择自定义指标之前,请考虑使用内置的 HTTP/TCP 缩放规则,这些规则可以满足最常见缩放方案的要求。
在 Azure 门户中查看缩放(可选)
新修订准备就绪后,请向容器应用发送请求,以使用 Java 指标触发自动缩放。
- 转到 Azure 门户中 Azure 容器应用的
Metrics边栏选项卡。 - 添加一个图表,使用指标
jvm.gc.count和筛选器Revision=<your-revision>,使用Sum进行聚合,并按Replica进行拆分。 可以在此聊天中看到每个副本的JvmGcCount指标值。 - 添加一个图表,使用指标
jvm.gc.count和筛选器Revision=<your-revision>,并使用Sum进行聚合。 你可在此聊天中查看修订的总聚合JvmGcCount指标值。 - 添加一个图表,使用指标
Replica Count和筛选器Revision=<your-revision>,并使用Max进行聚合。 你可在此聊天中查看修订的副本数。
以下是示例缩放规则的指标快照。
- 最初,应用有一个副本 (
minReplicas)。 - 请求激增导致 Java 应用频繁进行 Java 虚拟机(JVM)垃圾回收(GC)。
- KEDA 观察到
jvm.gc.count的聚合指标值增加到256,并将desiredReplicas值计算为ceil(256/30)=9。 - KEDA 将容器应用的副本计数扩展到 9。
- http 流量分布在更多副本上,减少了平均 GC 计数。
- 无请求进入时 GC 计数进一步减少。
- 冷却期过后,KEDA 将副本计数缩减至
minReplicas=1。
缩放日志
若要查看 KEDA 缩放日志,可以在“Logs”窗格中运行查询。
ContainerAppSystemLogs
| where RevisionName == "<your-revision>"
| where EventSource == "KEDA"
| project TimeGenerated, Type, Reason, ContainerAppName, Log
清理资源
本教程中创建的资源会影响 Azure 帐单。 如果不打算长期使用这些服务,请运行以下命令来删除本教程中创建的所有内容。
az group delete --resource-group $RESOURCE_GROUP