次の方法で共有

应用程序迁移概述

注释

基本标准计划于 2025 年 3 月 17 日进入退休期。 有关详细信息,请参阅 Azure Spring Apps 停用公告

标准消耗和专用计划于 2024 年 9 月 30 日进入停用期,并将在 2025 年 3 月底之前完全关闭。

本文概述了从 Azure Spring Apps 到 Azure 容器应用的应用迁移方法。

先决条件

部署应用程序

使用 Azure 容器应用可以从容器注册表(例如 Azure 容器注册表 (ACR) 或 Docker Hub)进行部署。 可以使用 Azure 门户、Azure CLI 或其他工具进行部署。 以下示例演示如何将应用程序部署到目标托管环境 my-container-apps。 有关详细信息,请参阅使用 containerapp up 部署第一个容器应用使用 Azure 门户部署第一个容器应用

az containerapp up \
    --resource-group my-container-apps \
    --name my-container-app \
    --location chinanorth2 \
    --environment 'my-container-apps' \
    --image mcr.microsoft.com/k8se/quickstart:latest \
    --target-port 80 \
    --ingress external

Azure 容器应用现在为 Java 应用程序提供预览功能。 此功能让用户能够直接从 JAR 文件或者本地或代码存储库中的源代码部署应用程序。 强烈建议使用容器映像部署容器应用。

环境变量

使用 Azure 容器应用可以配置环境变量。 可以在创建新应用时设置它们,也可以稍后通过创建新修订来设置它们。

若要通过 Azure 门户更改环境变量,需要显式创建新修订。 使用 Azure CLI 时,可以使用命令 az containerapp update 更新应用,如以下示例中所示,它会自动创建新修订。 请务必不要复制环境变量。 如果多个变量具有相同的名称,则列表中只有最后一个变量生效。

az containerapp update \
    --resource-group <RESOURCE_GROUP_NAME> \
    --name <APP NAME> \
    --set-env-vars <VAR_NAME>=<VAR_VALUE>

Azure 容器应用还提供内置环境变量。 这些变量在运行时提供有用的平台元数据。 有关详细信息,请参阅管理 Azure 容器应用中的环境变量内置环境变量部分。

机密

Azure 容器应用有助于安全地存储敏感配置值(称为机密)。 这些机密在应用程序级别定义为名称/值对,可供所有容器应用修订访问。

建议将机密存储在 Azure Key Vault 中,而不是直接输入它们。 可以使用以下格式之一引用 Azure Key Vault 中每个机密的值:

  • https://myvault.vault.azure.cn/secrets/mysecret 引用最新版本的机密。
  • https://myvault.vault.azure.cn/secrets/mysecret/<version-ID> 引用特定版本的机密。

对于此方法,必须为容器应用启用托管标识,并向其授予对 Key Vault 的访问权限。 Key Vault 中的访问策略应允许应用使用 GET 获取机密。 或者,如果 Key Vault 使用 Azure 基于角色的访问控制,则需要分配 Key Vault Secrets User 角色。 设置托管标识后,可以通过指定机密的 URI 来将 Key Vault 引用添加为应用中的机密。 然后,应用可以使用托管标识在运行时检索机密。

请记住以下规则:

  • 删除或更改机密不会自动影响现有修订。 更新或删除机密时,需要部署新的修订或重启现有修订以反映更改。
  • 还可以在缩放规则中使用机密。

可以通过在环境变量中引用机密或在卷中装载机密来在容器应用中使用机密。 在环境变量中,会自动填充机密的值。 或者,可以在卷中装载机密。 在这种情况下,每个机密都存储为一个文件,其中机密名称为文件名,机密值为文件的内容。 这种灵活性使你能够安全地处理机密并在应用环境中访问它们。 有关详细信息,请参阅管理 Azure 容器应用中的机密

如果工作负载使用 spring-cloud-azure-starter-keyvault-secrets 库保护敏感配置并从 Key Vault 检索属性,则可以在 Azure 容器应用中使用 Azure SDK 或 Spring KeyVault PropertySource。 迁移期间无需更改代码。

JVM 选项

若要在 Azure 容器应用中打印 JVM 选项,请按照从 JAR 或 WAR 生成容器映像中的步骤来容器化应用程序。 可以在 Dockerfile 的 -XX:+PrintFlagsFinal 中添加 ENTRYPOINT,如以下示例所示:

# filename: JAR.dockerfile

FROM mcr.microsoft.com/openjdk/jdk:17-mariner

ARG JAR_FILENAME

COPY $JAR_FILENAME /opt/app/app.jar
ENTRYPOINT ["java", "-XX:+PrintFlagsFinal", "-jar", "/opt/app/app.jar"]

若要在 Azure 容器应用中查询 JVM 选项,请使用以下查询:

ContainerAppConsoleLogs_CL
| where ContainerAppName_s == "<APP_NAME>"
| where Log_s has_any ('{default}', '{command line}', '{ergonomic}')

以下日志是运行查询后显示 JVM 选项的示例:

size_t MinHeapSize = 8388608 {product} {ergonomic}
size_t MaxHeapSize = 268435456 {product} {ergonomic}

若要调整 Azure 容器应用中的 JVM 选项,可以在 Dockerfile 的 ENTRYPOINT 中添加 JVM 选项,如以下示例所示:

# filename: JAR.dockerfile

FROM mcr.microsoft.com/openjdk/jdk:17-mariner

ARG JAR_FILENAME

COPY $JAR_FILENAME /opt/app/app.jar
ENTRYPOINT ["java", "-XX:+PrintFlagsFinal", "-Xmx400m", "-Xss200m", "-jar", "/opt/app/app.jar"]

有关 JVM 选项的详细信息,请参阅 Java HotSpot VM 选项配置 JVM 选项

储存

Azure Spring Apps 和 Azure 容器应用都支持容器范围的存储,这意味着仅当容器正在运行时,容器上存储的数据才可用。 对于 Azure Spring Apps,应用的总存储为 5 GiB。 Azure 容器应用提供从 1 GiB 到 8 GiB 的存储,具体取决于分配的 vCPU 总数。 此存储包括分配给每个副本的所有临时存储。 有关详细信息,请参阅在 Azure 容器应用中使用存储装载临时存储部分。

Azure Spring Apps 和 Azure 容器应用都支持通过 Azure 文件存储永久存储。 Azure 容器应用支持使用 SMB 和 NFS 协议装载文件共享。 需要在托管环境中创建存储定义,然后在修订中定义 AzureFile (SMB) 或 NfsAzureFile (NFS) 的卷。 可以在 Azure 门户中完成 AzureFile (SMB) 的整个配置。 有关详细信息,请参阅在 Azure 容器应用中创建 Azure 文件存储卷装载。 对装载 NFS 共享的支持目前处于预览状态。 可以使用 Azure CLI 或 ARM 模板对其进行配置。 有关详细信息,请参阅 NFS Azure 文件共享教程:使用 Azure 门户创建 NFS Azure 文件共享并将其装载到 Linux VM 上创建 NFS Azure 文件共享部分。

托管标识

每个容器应用都有一个系统分配的托管标识或用户分配的托管标识来访问受保护的 Azure 资源。 若要了解如何管理标识和授予权限,请参阅 Azure 容器应用中的托管标识

每个容器应用都有一个内部 REST 终结点,可通过 IDENTITY_ENDPOINT 环境变量进行访问,这不同于 Azure Spring Apps 中使用的终结点。 如果应用使用直接 HTTP GET 请求,则需要调整代码以获取正确的终结点。 如果应用通过 Azure 标识客户端库使用托管标识,则无需进行任何代码更改,因为 Azure 标识会自动管理此详细信息。

当工作负载访问受保护的 Azure 资源时,需要使用托管标识的应用程序 ID 或客户端 ID 提取访问令牌。 在 Azure Spring Apps 环境中,可以设置系统分配的或用户分配的托管标识的客户端 ID。 或者,可以将它留空,让服务从其中一个托管标识中选择应用程序 ID。 在 Azure 容器应用中,在使用系统分配的托管标识时,无法显式指定应用程序 ID。 但是,使用用户分配的托管标识时,应用程序 ID 是必需的。

健康探测

Azure 容器应用和 Azure Spring Apps 都支持所有三种类型的运行状况探测,包括启动探测、运行情况探测和就绪情况探测。 对于 Azure 容器应用,探测可以使用 HTTP 或 TCP 协议。 尚不支持 exec

在 Azure Spring Apps 中,探测设置是在部署资源上配置的。 相比之下,对于 Azure 容器应用,探测设置是在容器应用资源上定义的。 提供了以下设置:

资产 DESCRIPTION Azure Spring 应用程序 Azure 容器应用 (Azure Container Apps)
probeAction 探测的操作。 支持 HTTPGetActionTCPSocketActionExecAction 操作类型没有属性。 用户必须直接使用 httpGettcpSocket
disableProbe 指示是否已禁用探测。 布尔型 布尔型
initialDelaySeconds 启动探测之前应用实例启动后的秒数。 值范围为 1 到 60。
periodSeconds 执行探测的频率(以秒为单位)。 最小值为 1。 值范围为 1 到 240,默认值为 10。
timeoutSeconds 探测超时的秒数。 最小值为 1。 值范围为 1 到 240,默认值为 1。
failureThreshold 探测在成功后被视为失败的最小连续失败次数。 最小值为 1。 值范围为 1 到 10,默认值为 3。
successThreshold 失败后,探测被视为成功的最小连续成功次数。 最小值为 1。 值范围为 1 到 10,默认值为 1。
terminationGracePeriodSeconds Pod 在探测失败时正常终止所需的可选持续时间(以秒为单位)。 默认值为 90 秒。 最大值为 3600 秒。

目前,无法在 Azure 门户上直接配置 Azure 容器应用的探测。 相反,需要通过 Azure CLI 使用 ARM 模板或容器应用 YAML 文件进行设置。 有关详细信息,请参阅 Azure 容器应用中的运行状况探测

规模

Azure 容器应用通过一组缩放规则支持水平缩放。 添加或更改规则时,将创建容器应用的新修订。

缩放具有三类触发器:HTTP、TCP 和自定义。 HTTP 和 TCP 基于请求或网络连接数。 有关详细信息,请参阅在 Azure 容器应用中设置缩放规则

基于 CPU 或内存触发缩放

自定义容器应用缩放规则以基于 ScaledObjectKEDA 缩放程序为基础。 可以通过 KEDA CPU 缩放程序内存缩放程序来实现容器应用的缩放。

以下示例演示了当平均内存使用超过 25% 时发生横向扩展的配置。 内存使用包括当前容器应用使用的内存以及相关 Pod,例如内部挎斗容器。 KEDA 包括内置配置,以防止容器应用不稳定。 有关内部设置的详细信息,请参阅在 Azure 容器应用中设置缩放规则。 应在运行时验证行为,以确保它满足需求。

az containerapp create \
    --resource-group MyResourceGroup \
    --name my-containerapp \
    --image my-queue-processor --environment MyContainerappEnv \
    --min-replicas 1 --max-replicas 10 \
    --scale-rule-name memory-scaler \
    --scale-rule-type memory \
    --scale-rule-metadata "type=Utilization" \
                          "value=25"

基于 Java 指标触发缩放

KEDA 提供 Azure Monitor 缩放程序,它基于 Azure Monitor 中提供的指标启用缩放。 可以使用此功能根据发布到 Azure Monitor 的特定于 Java 的指标动态缩放应用程序。

先决条件

步骤

  1. 添加机密。 使用以下命令将 Microsoft Entra 应用程序的客户端 ID 和机密作为机密存储在 Azure 容器应用中:

    az containerapp secret set \
        --resource-group MyResourceGroup \
        --name my-containerapp \
        --secrets activeDirectoryClientId=<Microsoft-Entra-Application-Client-ID> \
                  activeDirectoryClientPassword=<Microsoft-Entra-Application-Client-Password>
    
  2. 定义缩放规则。 使用以下命令创建使用 Azure Monitor 缩放程序的自定义缩放规则。 此规则基于通过 Azure Monitor 监视的特定 Java 指标(例如 JvmThreadCount)触发缩放操作。

    az containerapp create \
        --resource-group MyResourceGroup \
        --name my-containerapp \
        --image my-queue-processor --environment MyContainerappEnv \
        --min-replicas 1 --max-replicas 10 \
        --scale-rule-name thread-count \
        --scale-rule-type azure-monitor \
        --scale-rule-auth "activeDirectoryClientId=activeDirectoryClientId" \
                          "activeDirectoryClientPassword=activeDirectoryClientPassword" \
        --scale-rule-metadata "activationTargetValue=1" \
                              "metricAggregationInterval=0:1:0" \
                              "metricAggregationType=Maximum" \
                              "metricName=JvmThreadCount" \
                              "resourceGroupName=MyResourceGroup" \
                              "resourceURI=MyContainerAppShortURI" \
                              "subscriptionId=MyResourceID" \
                              "targetValue=30" \
                              "tenantId=MyTenantID"
    

密钥详细信息

  • 机密管理:应用程序的凭据(客户端 ID 和密码)安全地存储为机密。
  • 缩放条件:metricName 参数标识 Java 指标(在本例中为 JvmThreadCount),用于评估何时应进行缩放。
  • 目标值:targetValue 参数设置缩放阈值,例如,当线程计数超过 30 时进行缩放。

通过设置此规则,容器应用可以根据特定于 Java 的性能指标动态调整实例数,从而提高响应能力和资源利用率。