共用方式為


在 Azure Kubernetes Service (AKS) 叢集上使用 Open Liberty 或 WebSphere Liberty 手動部署 Java 應用程式

本文提供在 Azure 上手動部署 Open/WebSphere Liberty 的逐步指引。

具體來說,本文說明如何完成下列工作:

  • 在 Open Liberty 或 WebSphere Liberty 運行時間上執行 Java、Java Enterprise Edition (EE)、Jakarta EE 或 MicroProfile 應用程式。
  • 使用 Liberty 容器映射建置應用程式 Docker 映射 az acr build
  • 使用 Liberty 作員將容器化應用程式部署至 Azure Kubernetes Service (AKS) 叢集。

自由作員可簡化在 Kubernetes 叢集上執行之應用程式的部署和管理。 透過 Open Liberty Operator 或 WebSphere Liberty Operator,您還可以執行更進階的操作,例如收集追蹤資料和轉儲。

如需使用 Azure 入口網站上的 Marketplace 解決方案更快速地自動化您的 AKS 旅程,請參閱 在 Azure Kubernetes Service (AKS) 叢集中使用 Open Liberty/WebSphere Liberty 部署 Java 應用程式

如需 Open Liberty 的詳細資訊,請參閱 Open Liberty 專案頁面 (英文)。 如需 IBM WebSphere Liberty 的詳細資訊,請參閱 WebSphere Liberty 產品頁面 (英文)

本文旨在協助您快速進行部署。 移至實際執行環境之前,您應該先探索微調 Liberty

若您有興趣與開發 Azure 上 WebSphere 解決方案的工程團隊緊密合作以進行移轉,請填寫這份簡短的 WebSphere 移轉問卷,並附上您的連絡資訊。 專案經理、結構設計師和工程師組成的小組會立即連絡您,以展開緊密合作。

必要條件

登入 Azure

如果您尚未這麼做,請使用下列步驟來登入您的 Azure 訂用帳戶:

  1. 開啟 Azure CLI 或 PowerShell,然後使用 az login 登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需查看其他登入選項,請參閱 使用 Azure CLI 登入 Azure

    注意

    如果您有多個與 Azure 認證相關聯的 Azure 租使用者,您必須指定您要登入的租使用者。 您可以使用 --tenant 選項來指定租戶,例如 az login --tenant contoso.onmicrosoft.com

  2. 查找用 az version 所安裝的版本和相依的程式庫。

  3. 使用 az upgrade升級至最新版本。

注意

使用 Azure CLI 時,如果系統提示您安裝 Azure CLI 擴充功能,請執行此動作。 如需延伸模組的詳細資訊,請參閱透過 Azure CLI 使用和管理延伸模組 (部分機器翻譯)。

您可以在 PowerShell 中執行大部分的 Azure CLI 命令,與 Bash 中的命令相同。 只有在使用變數時,差異才會存在。 在下列各節中,差異會在不同的標籤中處理,視需要而定。

建立資源群組

Azure 資源群組是部署及管理 Azure 資源所在的邏輯群組。

使用 java-liberty-projectaz group create 位置建立名為 eastus2 的資源群組。 此資源群組稍後會用於建立 Azure Container Registry 實例和 AKS 叢集。

export RESOURCE_GROUP_NAME=java-liberty-project
az group create --name $RESOURCE_GROUP_NAME --location eastus2

建立容器登錄實例

使用 az acr create 來建立容器登錄實例。 下列範例會建立名為 <your-unique-ACR-name>的容器登錄實例。 將此佔位符替換為 Azure 中唯一的值。

注意

本文使用 Azure Container Registry 的建議無密碼驗證機制。 使用 docker login 取得使用者名稱和密碼後,仍可以搭配 az acr credential show 使用此使用者名稱和密碼。 然而,使用使用者名稱和密碼比無密碼驗證安全性更低。

export REGISTRY_NAME=<your-unique-ACR-name>
az acr create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $REGISTRY_NAME \
    --sku Basic

在短時間內,您應該會看到包括下列幾行的 JSON 輸出:

"provisioningState": "Succeeded",
"publicNetworkAccess": "Enabled",
"resourceGroup": "java-liberty-project",

擷取容器登錄實例的登入伺服器名稱。 當您稍後將應用程式映射部署至 AKS 叢集時,需要此值。

export LOGIN_SERVER=$(az acr show \
    --name $REGISTRY_NAME \
    --query 'loginServer' \
    --output tsv)

建立 AKS 叢集

使用 az aks create 來建立 AKS 叢集,如下列範例所示。 此範例會建立名為 且具有一個節點的 myAKSCluster AKS 叢集,並將容器登錄實例附加至該叢集。 命令需要幾分鐘的時間才能完成。

export CLUSTER_NAME=myAKSCluster
az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --node-count 1 \
    --node-vm-size Standard_DS2_V2 \
    --generate-ssh-keys \
    --enable-managed-identity \
    --attach-acr $REGISTRY_NAME

命令完成之後,它會傳回叢集的 JSON 格式資訊,包括下列輸出:

"nodeResourceGroup": "MC_java-liberty-project_myAKSCluster_eastus2",
"privateFqdn": null,
"provisioningState": "Succeeded",
"resourceGroup": "java-liberty-project",

連線到 AKS 叢集

使用下列步驟來管理 Kubernetes 叢集:

  1. 使用 kubectl 安裝 az aks install-cli,這是 Kubernetes 命令列用戶端。如以下範例所示:

    az aks install-cli
    
  2. 使用 az aks get-credentials 配置 kubectl 以連接到 Kubernetes 叢集。 此命令會下載認證並設定 Kubernetes CLI 以使用它們,如下列範例所示:

    注意

    此命令會使用 Kubernetes 組態檔的預設位置,也就是 ~/.kube/config。您可以使用 來指定 Kubernetes 組態檔 --file的不同位置。

    az aks get-credentials \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CLUSTER_NAME \
        --overwrite-existing \
        --admin
    
  3. 使用 kubectl get 來傳回叢集節點清單來確認叢集的連線,如下列範例所示:

    kubectl get nodes
    

    下列輸出範例會顯示上一個步驟中建立的單一節點。 請確定節點的狀態為 Ready

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-xxxxxxxx-yyyyyyyyyy   Ready    <none>  76s     v1.29.9
    

建立 Azure SQL Database

使用下列步驟為您的應用程式建立 Azure SQL Database 單一資料庫:

  1. 使用下列命令來設定資料庫相關的環境變數。 以 Azure SQL 資料庫 伺服器的唯一名稱取代 <your-unique-sql-server-name>

    export SQL_SERVER_NAME=<your-unique-sql-server-name>
    export DB_NAME=demodb
    
  2. 使用下列命令建立單一資料庫,並將目前的登入用戶設定為 Microsoft Entra 系統管理員。如需詳細資訊,請參閱 快速入門:建立單一資料庫 - Azure SQL Database

    export ENTRA_ADMIN_NAME=$(az account show \
        --query user.name \
        --output tsv)
    
    az sql server create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $SQL_SERVER_NAME \
        --enable-ad-only-auth \
        --external-admin-principal-type User \
        --external-admin-name $ENTRA_ADMIN_NAME \
        --external-admin-sid $(az ad signed-in-user show --query id --output tsv)
    
    az sql db create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $DB_NAME \
        --server $SQL_SERVER_NAME \
        --edition GeneralPurpose \
        --compute-model Serverless \
        --family Gen5 \
        --capacity 2
    

注意

您可以針對安全性考慮,建立已停用 SQL 驗證的 Azure SQL Server。 只有Microsoft Entra標識碼可用來向伺服器進行驗證。 如需啟用 SQL 驗證的詳細資訊,請參閱 az sql server create

使用服務連接器在 AKS 中建立服務連線

使用下列命令,使用 Microsoft Entra Workload ID 搭配 Service Connector,在 AKS 叢集與 SQL 資料庫之間建立連線。 如需詳細資訊,請參閱 使用服務連接器在AKS中建立服務連線

# Register the Service Connector and Kubernetes Configuration resource providers
az provider register --namespace Microsoft.ServiceLinker --wait
az provider register --namespace Microsoft.KubernetesConfiguration --wait

# Install the Service Connector passwordless extension
az extension add \
    --name serviceconnector-passwordless \
    --upgrade \
    --allow-preview true

# Retrieve the AKS cluster and Azure SQL Server resource IDs
export AKS_CLUSTER_RESOURCE_ID=$(az aks show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --query id \
    --output tsv)

export AZURE_SQL_SERVER_RESOURCE_ID=$(az sql server show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $SQL_SERVER_NAME \
    --query id \
    --output tsv)

# Create a user-assigned managed identity used for workload identity
export USER_ASSIGNED_IDENTITY_NAME=workload-identity-uami
az identity create \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name ${USER_ASSIGNED_IDENTITY_NAME}

# Retrieve the user-assigned managed identity resource ID
export UAMI_RESOURCE_ID=$(az identity show \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name ${USER_ASSIGNED_IDENTITY_NAME} \
    --query id \
    --output tsv)

# Create a service connection between your AKS cluster and your SQL database using Microsoft Entra Workload ID
az aks connection create sql \
    --connection akssqlconn \
    --client-type java \
    --source-id $AKS_CLUSTER_RESOURCE_ID \
    --target-id $AZURE_SQL_SERVER_RESOURCE_ID/databases/$DB_NAME \
    --workload-identity $UAMI_RESOURCE_ID

對錯誤訊息進行疑難排解

az aks connection create sql如果命令產生錯誤訊息,請在下列清單中尋找錯誤訊息,然後使用指示來針對問題進行疑難解答:

  • Dependency pyodbc can't be installed, please install it manually

    此錯誤訊息表示 pyodbc 無法安裝套件,很可能是因為許可權問題。 使用下列步驟修正問題:

    1. 執行下列命令來尋找與 Azure CLI 搭配運作的 Python 位置:

      az --version
      

      輸出應該包含 Python location ─ 例如 Python location '/opt/az/bin/python3'

    2. 複製 Python location 值。

    3. 使用以下命令在 pyodbc 模式中安裝 sudo 套件。 用您在上一個步驟中複製的 Python 位置取代 <python-location>

      sudo <python-location> -m pip install pyodbc
      
  • libodbc.so:無法開啟共享物件檔案:沒有這類檔案或目錄

  • 請手動安裝 ODBC 17/18 for SQL Server

    這些錯誤表示 odbc 驅動程式未安裝。 使用下列步驟修正問題:

    注意

    您應該使用 Microsoft Entra Workload ID,在不使用 SQL 驗證的情況下安全地存取 Azure SQL Database。 如果您需要使用 SQL 驗證,請忽略本節中的步驟,並使用使用者名稱和密碼連線到 Azure SQL Database。

    1. 如果您使用 Linux,請開啟 [安裝 Microsoft ODBC Driver for SQL Server (Linux)]。 如果您使用 MacOS,請開啟 [安裝 Microsoft ODBC Driver for SQL Server (macOS)

    2. 請依照指示安裝適用於 SQL Server 的 Microsoft ODBC Driver (18 或 17)。

    3. 再次使用 az aks connection create sql 來建立服務連線,如下列範例所示:

      az aks connection create sql \
          --connection akssqlconn \
          --client-type java \
          --source-id $AKS_CLUSTER_RESOURCE_ID \
          --target-id $AZURE_SQL_SERVER_RESOURCE_ID/databases/$DB_NAME \
          --workload-identity $UAMI_RESOURCE_ID
      

取得服務連接器所建立的服務帳戶和密鑰

若要向 Azure SQL Database 進行驗證,請使用下列步驟:

  1. 請依照教學課程:將 AKS 應用程式連線至 Azure SQL Database更新您的容器部分的指示,來獲取由 Service Connector 創建的服務帳戶和密碼。 直接使用提供的 YAML 範例代碼段選項來建立部署。

    注意

    Service Connector 所建立的秘密包含值 AZURE_SQL_CONNECTIONSTRING ,這是 Azure SQL Database 的無密碼連接字串。 如需詳細資訊,請參閱 整合 Azure SQL Database 與 Service Connector使用者指派的受控識別 一節中的範例值。

  2. 從 Kubernetes 部署 YAML 範例中標出部分複製 serviceAccountNamesecretRef.name 值,如下列範例所示:

    serviceAccountName: <service-account-name>
    containers:
    - name: raw-linux
       envFrom:
          - secretRef:
             name: <secret-name>
    
  3. 使用下列命令定義環境變數。 請務必將 <service-account-name><secret-name> 替換為您在上一個步驟中複製的值。

    export SERVICE_ACCOUNT_NAME=<service-account-name>
    export SECRET_NAME=<secret-name>
    

    下一節會使用這些值,將 Liberty 應用程式部署至 AKS 叢集。

安裝 Open Liberty 操作員

在本節中,您會在 AKS 叢集上安裝 Open Liberty 運算符,以裝載 Liberty 應用程式。

使用下列命令安裝 Open Liberty 運算子

注意

本指南會引導您安裝 Open Liberty 運算子。 若要使用 WebSphere Liberty作員,請參閱 使用 Kubernetes CLI 安裝 WebSphere Liberty 運算符

# Install cert-manager Operator
export CERT_MANAGER_VERSION=v1.11.2
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/${CERT_MANAGER_VERSION}/cert-manager.yaml

# Install the Open Liberty Operator
export OPERATOR_VERSION=1.4.2
mkdir -p overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/olo-all-namespaces.yaml -q -P ./overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/cluster-roles.yaml -q -P ./overlays/watch-all-namespaces
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/overlays/watch-all-namespaces/kustomization.yaml -q -P ./overlays/watch-all-namespaces
mkdir base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/kustomization.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-crd.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-operator.yaml -q -P ./base
wget https://raw.githubusercontent.com/OpenLiberty/open-liberty-operator/main/deploy/releases/${OPERATOR_VERSION}/kustomize/base/open-liberty-roles.yaml -q -P ./base
kubectl create namespace open-liberty
kubectl apply --server-side -k overlays/watch-all-namespaces

# Remove the downloaded files
rm -rf overlays base

設定和建置應用程式映像

若要在 AKS 叢集上部署和執行您的 Liberty 應用程式,請使用 Open Liberty 映射WebSphere Liberty 容器映射,將您的應用程式容器化為 Docker 映像。

請依照本節的步驟,在 Liberty 執行階段上部署應用程式範例。 這些步驟會使用 Maven。

查看應用程式

使用下列命令複製本指南的範例程式碼。 此範例位於 Azure Kubernetes Service 範例 GitHub 存放庫中的 Open Liberty/WebSphere Liberty 中,其中包含一些範例。 本文使用 java-app 範例。

git clone https://github.com/Azure-Samples/open-liberty-on-aks.git
cd open-liberty-on-aks
export BASE_DIR=$PWD
git checkout 20250424

如果您看到有關處於 detached HEAD 狀態的訊息,則可以忽略此訊息。 這只是表示您查看了一個標籤。 複製存放庫會建立下列檔案結構:

java-app
├─ src/main/
│  ├─ aks/
│  │  ├─ openlibertyapplication-passwordless-db.yaml
│  ├─ docker/
│  │  ├─ Dockerfile
│  │  ├─ Dockerfile-wlp
│  ├─ liberty/config/
│  │  ├─ server.xml
│  ├─ java/
│  ├─ resources/
│  ├─ webapp/
├─ pom.xml
├─ pom-azure-identity.xml

javaresourceswebapp 目錄包含應用程式範例的原始程式碼。 程式碼會宣告並使用名為 jdbc/JavaEECafeDB 的資料來源。

aks 目錄中,openlibertyapplication-passwordless-db.yaml 檔案會用來部署應用程式映像。 在 docker 目錄中,有兩個檔案可透過 Open Liberty 或 WebSphere Liberty 建立應用程式映像。

liberty/config 目錄中,server.xml 檔案可用來設定 Open Liberty 和 WebSphere Liberty 叢集的資料庫連線。 它會定義 azure.sql.connectionstring 用來連線到 Azure SQL Database 的變數。

pom.xml檔案是 Maven 項目物件模型 (POM) 檔案,其中包含專案的組態資訊。 pom-azure-identity.xml 檔案會宣告 azure-identity 相依性,用來使用 Microsoft entra ID 向 Azure 服務進行驗證。

注意

此範例會使用 azure-identity 連結庫,使用 Microsoft Entra 驗證向 Azure SQL Database 進行驗證,這是基於安全性考慮的建議。 如需在 Liberty 應用程式中使用 SQL 驗證的詳細資訊,請參閱 使用 Java Database Connectivity (JDBC) 的關係資料庫連線

建置專案

既然您已收集必要的屬性,請使用下列命令來建置應用程式。 專案的 POM 檔案會從環境中讀取許多變數。 作為 Maven 組建的一部分,這些變數可用來在位於 src/main/aks 的 YAML 檔案中填入值。 您可以視需要在 Maven 外部,為應用程式執行類似動作。

cd $BASE_DIR/java-app

# The following variables are used for deployment file generation into target/
export LOGIN_SERVER=${LOGIN_SERVER}
export SC_SERVICE_ACCOUNT_NAME=${SERVICE_ACCOUNT_NAME}
export SC_SECRET_NAME=${SECRET_NAME}

mvn clean install
mvn dependency:copy-dependencies -f pom-azure-identity.xml -DoutputDirectory=target/liberty/wlp/usr/shared/resources

建立 AKS 部署的映像檔

使用 az acr build 來建置映射,如下列範例所示:

cd $BASE_DIR/java-app/target

az acr build \
    --registry ${REGISTRY_NAME} \
    --image javaee-cafe:v1 \
    .

命令 az acr build 會將 Dockerfile 中指定的成品上傳至容器登錄實例、建置映像,並將其儲存在容器登錄實例中。

將應用程式部署至 AKS 叢集

使用下列步驟在 AKS 叢集上部署 Liberty 應用程式:

  1. 使用下列命令來套用部署檔案:

    cd $BASE_DIR/java-app/target
    
    # Apply deployment file
    kubectl apply -f openlibertyapplication-passwordless-db.yaml
    
  2. 使用下列命令判斷 OpenLibertyApplication 實例是否已建立:

    kubectl get openlibertyapplication javaee-cafe-cluster --watch
    

    下列輸出是典型的。 使用 Ctrl+C 結束。

    NAME                  IMAGE                                        EXPOSED   RECONCILED   RESOURCESREADY   READY   WARNING   AGE
    javaee-cafe-cluster   <registry-name>.azurecr.io/javaee-cafe:v1              True         True             True              57s
    
  3. 使用下列命令來判斷作員所建立的部署是否已就緒:

    kubectl get deployment javaee-cafe-cluster --watch
    

    下列輸出是典型的:

    NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
    javaee-cafe-cluster         0/3     3            0           20s
    
  4. 等到您看到3/3READY欄位下,以及3AVAILABLE欄位下,然後使用Ctrl+C來停止kubectl監看程式。

測試應用程式

當應用程式執行時,Kubernetes 負載平衡器服務會將應用程式前端公開至因特網。 此過程可能需要一些時間才能完成。

使用 kubectl get service 來取得服務的外部IP位址,如下列範例所示:

export APP_URL=http://$(kubectl get service javaee-cafe-cluster -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo $APP_URL

注意

如果您沒有從輸出看到有效的 URL,請稍候一段時間,然後再次執行命令。

在網頁瀏覽器中開啟 URL,並檢查應用程式首頁。 如果頁面未正確載入,請等應用程式啟動後再重新整理頁面。 您應該會看到應用程式複本的 Pod 名稱顯示在頁面左上角。 等候幾分鐘並重新整理頁面,以查看因 AKS 叢集的負載平衡功能而顯示的不同 Pod 名稱。

Java 自由應用程式首頁的螢幕快照。

注意

目前,應用程式不會使用 HTTPS。 建議您使用您自己的憑證來啟用傳輸層安全性 (TLS)。 如需詳細資訊,請參閱 在 Azure Kubernetes Service (AKS) 上搭配輸入控制器使用 TLS。

清除資源

若要避免 Azure 費用,您應該清除不必要的資源。 不再需要叢集時,請使用 az group delete 移除資源群組、容器服務、容器登錄、資料庫和所有相關資源。

az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

下一步

您可以從本指南中使用的下列參考深入瞭解:

若要將 Azure Cache for Redis 納入 Java 應用程式,請參閱 快速入門:在 Java 中使用 Azure Cache for Redis 搭配 Redisson Redis 客戶端

若要探索在 Azure 上執行 WebSphere 產品的選項,請參閱 在 Azure 上執行 WebSphere 產品系列的解決方案為何?