注意
基本、標準和企業方案於 2025 年 3 月 17 日進入淘汰期。 如需詳細資訊,請參閱 Azure Spring Apps 淘汰公告。
本文適用於:✅ 基本/標準 ✅ 企業
本文提供從 Azure Spring Apps 移轉至 Azure Container Apps 的應用程式移轉方法概觀。
必要條件
- 現有的 Azure Spring Apps 實例。
- 現有的 Azure 容器應用程式。 如需詳細資訊,請參閱快速入門:使用 Azure 入口網站部署您的第一個容器應用程式。
部署應用程式
Azure Container Apps 可讓您從容器登錄部署,例如 Azure Container Registry (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 centralus \
--environment 'my-container-apps' \
--image mcr.microsoft.com/k8se/quickstart:latest \
--target-port 80 \
--ingress external
Azure Container Apps 現在提供 Java 應用程式的預覽功能。 此功能可讓使用者直接從 JAR 檔案或本機或程式代碼存放庫部署應用程式。 強烈建議您使用容器映像部署容器應用程式。
環境變數
Azure Container Apps 可讓您設定環境變數。 您可以藉由建立新的修訂,在建立新的應用程式或更新版本時設定它們。
若要透過 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 Container Apps 也提供內建環境變數。 這些變數會在運行時間期間提供實用的平台元數據。 如需詳細資訊,請參閱在 Azure Container Apps 上管理環境變數的內建環境變數一節。
密碼
Azure Container Apps 可協助安全地儲存機密組態值,稱為秘密。 這些秘密會在應用層級定義為名稱/值組,而且可供所有容器應用程式修訂存取。
建議您將秘密儲存在 Azure 金鑰保存庫 中,而不是直接輸入秘密。 您可以使用下列其中一種格式,從 Azure 金鑰保存庫 參考每個秘密的值:
-
https://myvault.vault.azure.net/secrets/mysecret是指最新版本的秘密。 -
https://myvault.vault.azure.net/secrets/mysecret/<version-ID>是指特定版本的秘密。
針對此方法,您必須為容器應用程式啟用受控識別,並將存取權授與 金鑰保存庫。 金鑰保存庫中的存取原則應該允許應用程式用來GET取得秘密。 或者,如果 金鑰保存庫 使用 Azure 角色型存取控制,您需要指派Key Vault Secrets User角色。 設定受控識別之後,您可以藉由指定秘密的 URI,將 金鑰保存庫 參考新增為應用程式中的秘密。 然後,應用程式可以使用受控識別在運行時間擷取秘密。
請記住下列規則:
- 拿掉或變更秘密並不會自動影響現有的修訂。 當您更新或刪除秘密時,您必須部署新的修訂或重新啟動現有的修訂,以反映變更。
- 您也可以在調整規則內使用秘密。
您可以在容器應用程式中使用秘密,方法是在環境變數中參考秘密,或在磁碟區中掛接秘密。 在環境變數中,會自動填入秘密的值。 或者,您可以在磁碟區中掛接秘密。 在此情況下,每個秘密會儲存為具有秘密名稱作為檔名的檔案,並將秘密值儲存為檔案的內容。 此彈性可讓您安全地處理秘密,並在應用程式環境中存取它們。 如需詳細資訊,請參閱 管理 Azure Container Apps 中的秘密。
如果您的工作負載會保護敏感性組態,並使用連結庫從 Key Vault spring-cloud-azure-starter-keyvault-secrets 擷取屬性,您可以在 Azure Container Apps 中使用 Azure SDK 或 Spring KeyVault PropertySource 。 您不需要在移轉期間變更程序代碼。
JVM 選項
若要在 Azure Container Apps 中列印 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 Container Apps 中查詢 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 Container Apps 中的 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 Container Apps 都支援容器範圍的記憶體,這表示只有在容器執行時,才能使用儲存在容器上的數據。 針對 Azure Spring Apps,應用程式的總記憶體為 5 GiB。 Azure Container Apps 根據配置的 vCPU 總數,提供從 1 GiB 到 8 GiB 的記憶體。 此記憶體包含指派給每個復本的所有暫時記憶體。 如需詳細資訊,請參閱在 Azure Container Apps 中使用記憶體掛接的暫時記憶體一節。
Azure Spring Apps 和 Azure Container Apps 都支援透過 Azure 檔案儲存體 永久記憶體。 Azure Container Apps 支援使用 SMB 和 NFS 通訊協定掛接檔案共用。 您必須在受控環境中建立記憶體定義,然後在修訂中定義 AzureFile (SMB) 或 NfsAzureFile (NFS) 的磁碟區。 您可以在 Azure 入口網站 中完成 AzureFile (SMB) 的完整設定。 如需詳細資訊,請參閱在 Azure Container Apps 中建立 Azure 檔案儲存體 磁碟區掛接。 支援掛接NFS共用目前為預覽狀態。 您可以使用 Azure CLI 或 ARM 樣本進行設定。 如需詳細資訊,請參閱 NFS Azure 檔案共用和建立 Azure 傳統檔案共用的建立 NFS Azure 檔案共用區段。
受控識別
每個容器應用程式都有系統指派的受控識別或使用者指派的受控識別,以存取受保護的 Azure 資源。 若要瞭解如何管理身分識別和授與許可權,請參閱 Azure Container Apps 中的受控識別。
每個容器應用程式都有一個內部 REST 端點,可透過 IDENTITY_ENDPOINT 環境變數存取,這與 Azure Spring Apps 中使用的端點不同。 如果您的應用程式使用直接 HTTP GET 要求,您必須調整程式碼以取得正確的端點。 如果您的應用程式透過 Azure 身分識別用戶端連結庫使用受控識別,則不需要任何程式碼變更,因為 Azure 身分識別會自動管理此詳細數據。
當工作負載存取受保護的 Azure 資源時,它必須使用受控識別的應用程式識別碼或用戶端標識碼來擷取存取令牌。 在 Azure Spring Apps 環境中,您可以設定系統指派或使用者指派受控識別的用戶端識別碼。 或者,您可以將它保留空白,並讓服務從其中一個受控識別中選取應用程式識別碼。 在 Azure Container Apps 中,您無法在使用系統指派的受控識別時明確指定應用程式識別碼。 不過,使用使用者指派的受控識別時,需要應用程式識別符。
健康情況探查
Azure Container Apps 和 Azure Spring Apps 都支援所有三種類型的健康情況探查,包括啟動探查、活躍度探查和整備探查。 針對 Azure Container Apps,探查可以使用 HTTP 或 TCP 通訊協定。 不支援 exec - 請使用。
在 Azure Spring Apps 中,探查設定是在部署資源上設定。 相反地,針對 Azure Container Apps,探查設定是在容器應用程式資源上定義。 以下是可用的設定:
| 屬性 | 說明 | Azure Spring 應用程式 | Azure 容器應用程式 |
|---|---|---|---|
probeAction |
探查的動作。 | 支援 HTTPGetAction、 TCPSocketAction與 ExecAction。 |
動作類型沒有屬性。 使用者必須直接使用 httpGet 或 tcpSocket 。 |
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 Container Apps 的探查。 相反地,您必須透過 Azure CLI 使用 ARM 範本或容器應用程式 YAML 檔案進行設定。 如需詳細資訊,請參閱 Azure Container Apps 中的健康情況探查。
調整
Azure Container Apps 支援透過一組調整規則進行水平調整。 新增或變更規則時,會建立新的容器應用程式修訂。
調整有三種觸發程式類別:HTTP、TCP 和自定義。 HTTP 和 TCP 是以要求或網路連線數目為基礎。 如需詳細資訊,請參閱在 Azure 容器應用程式中設定調整規則 (機器翻譯)。
根據 CPU 或記憶體觸發規模
自定義容器應用程式調整規則是以 ScaledObject 為基礎的 KEDA 調整器為基礎。 您可以透過 KEDA CPU scaler 和 Memory scaler,透過 CPU 或記憶體使用量,透過容器應用程式來達成調整。
下列範例示範當平均記憶體使用量超過 25% 時,就會發生相應放大的設定。 記憶體使用量包括目前容器應用程式所使用的記憶體,以及相關的Pod,例如內部側車容器。 KEDA 包含內建組態,以防止容器應用程式進行擷取。 如需內部設定的詳細資訊,請參閱 在 Azure Container Apps 中設定調整規則。 您應該確認運行時間期間的行為,以確定其符合您的需求。
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 監視器縮放程式,可根據 Azure 監視器中可用的計量來調整規模。 您可以使用這項功能,根據發佈至 Azure 監視器的 Java 特定計量動態調整應用程式。
必要條件
- 在 Microsoft Entra ID 中註冊應用程式。 如需詳細資訊,請參閱快速入門:使用 Microsoft 身分識別平台註冊應用程式。
- 授與權限。 將已註冊的應用程式
Monitoring Reader指派給 Azure Container Apps 資源的角色。
步驟
新增秘密。 使用下列命令,將 Microsoft Entra 應用程式的用戶端識別碼和秘密儲存在 Azure Container Apps 中做為秘密:
az containerapp secret set \ --resource-group MyResourceGroup \ --name my-containerapp \ --secrets activeDirectoryClientId=<Microsoft-Entra-Application-Client-ID> \ activeDirectoryClientPassword=<Microsoft-Entra-Application-Client-Password>定義調整規則。 使用下列命令來建立使用 Azure 監視器縮放程式的自定義調整規則。 此規則會根據特定的 Java 計量觸發調整動作,例如
JvmThreadCount透過 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 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"
金鑰詳細資料
- 秘密管理:應用程式的認證 - 用戶端識別符和密碼 - 安全地儲存為秘密。
- 調整準則:參數
metricName會識別 Java 計量 ,JvmThreadCount在此案例中,用來評估何時應該進行縮放。 - 目標值:參數
targetValue會設定調整的臨界值-例如,當線程計數超過 30 時調整。
藉由設定此規則,您的容器應用程式可以根據 Java 特定的效能計量動態調整實例數目,以改善回應性和資源使用率。