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

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

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

先决条件

设置环境

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

  1. 创建变量来支持缩放配置。

    export LOCATION=chinanorth3
    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
    
    Variable Description
    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 cloud set -n AzureChinaCloud
    az login
    # az cloud set -n AzureCloud   //means return to Public Azure.
    

为 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. 授予托管标识从 Azure Monitor 读取数据所需的“Monitoring Reader”角色。 可以在 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 KEDA 缩放程序来定义容器应用缩放规则。

下面是用于设置缩放规则的核心元数据的列表。

元数据键 Description
tenantId 包含 Azure 资源的租户的 ID。
订阅编号 包含 Azure 资源的 Azure 订阅的 ID。
resourceGroupName Azure 资源的资源组的名称。
resourceURI 缩短了的 Azure 资源 URI,其格式为 <resourceProviderNamespace>/<resourceType>/<resourceName>
metricName 要查询的指标的名称。
metricAggregationType Azure Monitor 指标的聚合方法。 选项包括“平均值”、“总计”、“最大值”。
metricFilter 筛选器的名称,使用官方文档中列出的维度可以更具体地对其进行说明。 (可选)
metricAggregationInterval 指标收集时间,格式为“hh:mm:ss”(默认值:“0:5:0”,可选)
targetValue 可触发缩放操作的目标值。 (此值可以是浮点数)

为应用程序添加一项包含 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 进行聚合。 可以在此聊天中看到修订的副本计数。

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

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

  1. 最初,该应用有一个副本 (minReplicas)。
  2. 请求激增导致 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