你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:使用 Java 指标缩放容器应用

Azure 容器应用通过一组声明性缩放规则管理自动水平缩放。 你可以使用自定义事件源创建自己的缩放规则。

在本教程中,请添加自定义缩放规则,以使用 Java 指标缩放容器应用并观察应用程序的缩放方式。

先决条件

设置环境

使用以下步骤定义环境变量并设置环境。

  1. 创建变量来支持规模配置。

    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_GROUP Azure 容器应用的 Azure 资源组名称。
    APP_NAME Azure 容器应用的应用名称。
    IDENTITY_NAME 托管标识的名称,分配给 Azure 容器应用。
  2. 通过 Azure CLI 登录 Azure。

    az login
    

为 Azure 容器应用设置托管标识

为了通过 Azure 容器应用平台指标进行扩展,需要使用托管身份来访问来自 Azure Monitor 的指标。

  1. 创建用户分配的标识并将其分配给 Azure 容器应用。 可以按照此文档操作:添加用户分配的标识。 创建标识后,运行 CLI 命令来设置标识 ID。

    USER_ASSIGNED_IDENTITY_ID=$(az identity show --resource-group $RESOURCE_GROUP --name $IDENTITY_NAME --query "id" --output tsv)
    
  2. 为托管标识授予 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 指标触发自动缩放。

  1. 转到 Azure 门户中 Azure 容器应用的 Metrics 边栏选项卡。
  2. 添加一个图表,使用指标 jvm.gc.count 和筛选器 Revision=<your-revision>,使用 Sum 进行聚合,并按 Replica 进行拆分。 可以在此聊天中看到每个副本的 JvmGcCount 指标值。
  3. 添加一个图表,使用指标 jvm.gc.count 和筛选器 Revision=<your-revision>,并使用 Sum 进行聚合。 你可在此聊天中查看修订的总聚合 JvmGcCount 指标值。
  4. 添加一个图表,使用指标 Replica Count 和筛选器 Revision=<your-revision>,并使用 Max 进行聚合。 你可在此聊天中查看修订的副本数。

以下是示例缩放规则的指标快照。

KEDA 使用 JVM 指标缩放的屏幕截图。

  1. 最初,应用有一个副本 (minReplicas)。
  2. 请求激增导致 Java 应用频繁进行 Java 虚拟机(JVM)垃圾回收(GC)。
  3. KEDA 观察到 jvm.gc.count 的聚合指标值增加到 256,并将 desiredReplicas 值计算为 ceil(256/30)=9
  4. KEDA 将容器应用的副本计数扩展到 9。
  5. http 流量分布在更多副本上,减少了平均 GC 计数。
  6. 无请求进入时 GC 计数进一步减少。
  7. 冷却期过后,KEDA 将副本计数缩减至 minReplicas=1

缩放日志

若要查看 KEDA 缩放日志,可以在“Logs”窗格中运行查询。

ContainerAppSystemLogs
| where RevisionName == "<your-revision>"
| where EventSource == "KEDA"
| project TimeGenerated, Type, Reason, ContainerAppName, Log

KEDA 缩放日志查询的屏幕截图。

清理资源

本教程中创建的资源会影响 Azure 帐单。 如果不打算长期使用这些服务,请运行以下命令来删除本教程中创建的所有内容。

az group delete --resource-group $RESOURCE_GROUP