在 Azure Kubernetes Service (AKS) 叢集上,使用 Open Liberty 或 WebSphere Liberty 部署 Java 應用程式
本文會示範如何:
- 在 Open Liberty 或 IBM WebSphere Liberty 執行階段上執行 JAVA、JAVE EE、Jakarta EE 或 MicroProfile 應用程式。
- 使用 Open Liberty 或 WebSphere Liberty 容器映像
az acr build
,使用 建置應用程式的 Docker 映像。 - 使用 Open Liberty Operator 或 WebSphere Liberty Operator,將容器化應用程式部署至 Azure Kubernetes Service (AKS) 叢集。
Open Liberty Operator 可簡化在 Kubernetes 叢集上執行應用程式的部署和管理。 透過 Open Liberty 或 WebSphere Liberty Operator,也可以執行更進階的作業,例如收集追蹤與傾印。
本文將使用 Open Liberty 或 WebSphere Liberty 的 Azure Marketplace 供應項目,加速您的 AKS 旅程。 此供應項目會自動佈建部分 Azure 資源,包括:
- Azure Container Registry 執行個體。
- AKS 叢集。
- 應用程式閘道輸入控制器 (AGIC) 執行個體。
- Open Liberty Operator 和 WebSphere Liberty Operator。
- 包含 Liberty 與應用程式的容器映像 (選擇性)。
若想以手動方式,根據逐步指引在 AKS 上執行 Liberty,請參閱在 Azure Kubernetes Service (AKS) 叢集上使用 Open Liberty 或 WebSphere Liberty 手動部署 JAVA 應用程式。
本文旨在協助您快速進行部署。 移至實際生產環境之前,請先參閱有關微調 Liberty 的 IBM 文件。
若您有興趣與開發 Azure 上 WebSphere 解決方案的工程團隊緊密合作以進行移轉,請填寫這份簡短的 WebSphere 移轉問卷,並附上您的連絡資訊。 專案經理、結構設計師和工程師組成的小組會立即連絡您,以展開緊密合作。
必要條件
- Azure 訂用帳戶。 如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶。
- 準備已安裝類似 Unix 的作業系統的本機電腦 ,例如 Ubuntu、Azure Linux、macOS 或 Windows 子系統 Linux 版。
- 安裝 Azure CLI 以執行 Azure CLI 命令。
- 使用
az login
命令登入 Azure CLI。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱使用 Azure CLI 登入 Azure (英文)。 - 出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需延伸模組的詳細資訊,請參閱透過 Azure CLI 使用和管理延伸模組 (部分機器翻譯)。
- 執行
az version
以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行az upgrade
。 本文需要使用至少 Azure CLI 2.61.0 版。
- 使用
- 安裝 Java Standard Edition (SE) 實作,版本 17 (例如 Eclipse Open J9)。
- 安裝 Maven 3.9.8 或更高版本。
- 確定已安裝 Git。
- 確定您已獲指派訂用帳戶的
Owner
角色或Contributor
和User Access Administrator
角色。 您可以依照列出使用者或群組的角色指派中的步驟進行驗證。
使用入口網站在 AKS 部署上建立 Liberty
下述步驟可指導您於 AKS 上建立 Liberty 執行階段。 完成這些步驟之後,您將擁有 Azure Container Registry 執行個體和 AKS 叢集,可用來部署容器化應用程式。
前往 Azure 入口網站。 在頁面頂端的搜尋方塊中,輸入 Kubernetes 上的 WebSphere Liberty/Open Liberty。 出現建議後,請在 [Marketplace] 區段中選取唯一的相符結果。
也可以直接移至供應項目。
選取 建立。
在 [基本] 窗格上:
- 建立新的資源群組。 由於資源群組在訂用帳戶內必須是唯一的,所以請選擇唯一的名稱。 若要擁有唯一的名稱,簡單方式為使用姓名縮寫、今日日期與某個識別碼的組合 (例如
ejb0913-java-liberty-project-rg
)。 請保留資源組名,以供稍後在本文中使用。 - 針對 [ 區域],選取靠近您的區域。 例如,選取 [美國東部 2]。
- 建立新的資源群組。 由於資源群組在訂用帳戶內必須是唯一的,所以請選擇唯一的名稱。 若要擁有唯一的名稱,簡單方式為使用姓名縮寫、今日日期與某個識別碼的組合 (例如
選取 [下一步]。 在 [AKS] 窗格中,可視需求選取現有的 AKS 叢集和 Azure Container Registry 執行個體,而不會導致部署建立新的 AKS 叢集。 透過此選項,您可使用側車模式,如 Azure 架構中心所示。 您也可以調整 AKS 節點集區中虛擬機器大小和數量設定。
根據本文的目的,保留此窗格內的所有預設即可。
選取 [下一步]。 在 [連線至 Azure 應用程式閘道?] 旁的 [負載平衡] 窗格中,選取 [是]。 在此區段中,您可自訂下列部署選項:
針對 [虛擬網路] 與 [子網路],您可以選擇性自訂部署要放置資源的虛擬網路和子網路。 您不必變更其餘值的預設值。
針對 [TLS/SSL 憑證],您可以從 Azure 應用程式閘道提供 TLS/SSL 憑證。 將值保留為預設值,讓供應項目產生自我簽署憑證。
請勿使用自我簽署憑證移至實際生產環境。 如需自我簽署憑證的詳細資訊,請參閱 建立自我簽署的公開憑證來驗證您的應用程式。
您可以選取 [啟用 Cookie 型親和性],也稱為黏性工作階段。 本文將使用黏性工作階段,因此請務必選取此選項。
選取 [下一步]。 在 [運算子與應用程式] 窗格上,本文會使用所有預設。 不過,您可自訂下列部署選項:
- 您可以針對 [是否支援 IBM?] 選項選取 [是],以部署 WebSphere Liberty Operator。 保留預設值 ([否]) 即會部署 Open Liberty Operator。
- 您可以針對 [是否部署應用程式?] 選項選取 [是],以為選取的運算子部署應用程式。 保留預設值 ([否]) 不會部署任何應用程式。
選取 [檢閱 + 建立] 以驗證您所選的選項。 在 [檢閱 + 建立] 窗格中,若看到 [建立] 在驗證通過後變為可選狀態,請選取 [建立]。
部署最長需要 20 分鐘。 等候部署完成時,您可以根據建立 Azure SQL 資料庫執行個體一節中的步驟進行操作。 完成該章節的步驟後,請返回此處並繼續。
從部署擷取選取的資訊
如果您已離開 [正在進行部署] 窗格,下列步驟將說明如何返回該窗格。 若您仍位於顯示 [部署已完成] 的窗格,請移至新建立的資源群組,然後跳至第三個步驟。
在任何入口網站頁面的角落,選取功能表按鈕,然後選取 [資源群組]。
在包含 [篩選任何欄位] 文字的輸入框中,輸入先前建立之資源群組的前幾個字元。 若遵循建議的慣例,請輸入您的縮寫,然後選取適當的資源群組。
在資源群組中的資源清單內,選取 [類型] 值為 [Azure Container Registry] 的資源。
在瀏覽窗格中的 [設定] 下,選取 [存取金鑰]。
將登錄名稱和登入伺服器的值儲存在一邊。 您可以使用各欄位旁邊的複製圖示,將值複製到系統剪貼簿。
注意
本文使用
az acr build
命令來建置 Docker 映射,並將 Docker 映射推送至 Container Registry,而不使用username
和password
Container Registry。 您仍然可以搭配docker login
和docker push
使用使用者名稱和密碼。 使用使用者名稱和密碼比無密碼驗證不安全。回到您部署資源的資源群組。
在 [設定] 區段,選取 [部署]。
選取清單中最底部的部署。 [部署名稱] 值會符合供應項目的發行者識別碼。 其將包含字串
ibm
。在瀏覽窗格中,選取 [輸出]。
使用與上述複製值時相同的技術,另存下列輸出的值:
cmdToConnectToCluster
若部署未包含應用程式,即為
appDeploymentTemplateYaml
。 換言之,您在部署 Marketplace 供應項目時,已針對 [是否部署應用程式?] 選取 [否]。 本文選取 [ 否]。 不過,如果您選取 [ 是],請將 的值appDeploymentYaml
儲存為 ,其中包含應用程式部署。將 或
appDeploymentYaml
的值appDeploymentTemplateYaml
貼到Bash殼層中,然後執行 命令。此命令的輸出是應用程式部署 YAML。 尋找具有 關鍵字
secretName
的輸入 TLS 秘密,例如- secretName: secret785e2c
。 另存secretName
值。
執行下列命令來設定您在先前步驟中擷取的環境變數。 本文稍後會使用這些環境變數。
export RESOURCE_GROUP_NAME=<your-resource-group-name>
export REGISTRY_NAME=<your-registry-nam-of-container-registry>
export LOGIN_SERVER=<your-login-server-of-container-registry>
export INGRESS_TLS_SECRET=<your-ingress-tls-secret-name>
建立 Azure SQL 資料庫執行個體
在本節中,您會建立 Azure SQL 資料庫 單一資料庫,以搭配您的應用程式使用。
首先,設定資料庫相關的環境變數。 以 Azure SQL 資料庫 伺服器的唯一名稱取代 <your-unique-sql-server-name>
。
export SQL_SERVER_NAME=<your-unique-sql-server-name>
export DB_NAME=demodb
在終端機中執行下列命令,在 Azure SQL 資料庫 中建立單一資料庫,並將目前的登入使用者設定為 Microsoft Entra 管理員。如需詳細資訊,請參閱快速入門:建立單一資料庫 - Azure SQL 資料庫。
export ENTRA_ADMIN_NAME=$(az account show --query user.name --output tsv)
az sql server create \
--name $SQL_SERVER_NAME \
--resource-group $RESOURCE_GROUP_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 \
--server $SQL_SERVER_NAME \
--name $DB_NAME \
--edition GeneralPurpose \
--compute-model Serverless \
--family Gen5 \
--capacity 2
然後,將本機 IP 位址新增至 Azure SQL 資料庫 伺服器防火牆規則,以允許本機電腦稍後連線到資料庫以進行本機測試。
export AZ_LOCAL_IP_ADDRESS=$(curl -s https://whatismyip.akamai.com)
az sql server firewall-rule create \
--resource-group $RESOURCE_GROUP_NAME \
--server $SQL_SERVER_NAME \
--name AllowLocalIP \
--start-ip-address $AZ_LOCAL_IP_ADDRESS \
--end-ip-address $AZ_LOCAL_IP_ADDRESS
注意
本文會停用 SQL 驗證,以說明安全性最佳做法。 Microsoft Entra 識別碼可用來驗證伺服器的連線。 如果您需要啟用 SQL 驗證,請參閱 az sql server create
。
使用服務連接器在 AKS 中建立服務連線
在本節中,您會使用 service Connector Microsoft Entra 工作負載 ID,在 AKS 叢集與 Azure SQL 資料庫 之間建立服務連線。 此連線可讓 AKS 叢集在沒有使用 SQL 驗證的情況下存取 Azure SQL 資料庫。
首先,將應用程式 Azure Service Connector 資源提供者許可權授與之前所部署 應用程式閘道。 必須執行此步驟,才能成功建立 AKS 叢集與 Azure SQL 資料庫 之間的服務連線。
- 移至 Azure 入口網站,然後流覽至您稍早建立的資源群組。
- 在資源群組中的資源清單中,選取 [應用程式閘道類型] 值的資源。
- 選取 [存取控制 (IAM)]。 然後,展開 [ 新增 ],然後選取 [ 新增角色指派]。
- 在 [ 角色] 索引標籤中,選取 [ 特殊許可權系統管理員角色]。 然後,選取 [ 參與者]。 選取 [下一步]。
- 在 [ 成員] 索引標籤中,選取 [ 選取成員]。 然後,搜尋 Azure Service Connector 資源提供者 應用程式。 選取應用程式,然後選取 [ 選取]。 選取 [下一步]。
- 選取檢閱+指派。 等候幾秒鐘,讓角色指派完成。
然後,執行下列命令,以使用 Microsoft Entra 工作負載 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
注意
建議您使用 Microsoft Entra 工作負載 ID 來保護 Azure SQL 資料庫 的存取,而不需使用 SQL 驗證。 如果您需要使用 SQL 驗證,請忽略本節中的先前步驟,並使用使用者名稱和密碼連線到 Azure SQL 資料庫。
取得服務連接器所建立的服務帳戶和秘密
若要向 Azure SQL 資料庫 進行驗證,您必須取得服務連接器所建立的服務帳戶和秘密。 請遵循教學課程:將 AKS 應用程式連線至 Azure SQL 資料庫 中更新容器一節中的指示。 使用提供的 YAML 範例代碼段直接建立部署選項,並使用下列步驟:
從範例 Kubernetes 部署 YAML 中的醒目提示區段複製
serviceAccountName
和secretRef.name
值,如下列範例所示:serviceAccountName: <service-account-name> containers: - name: raw-linux envFrom: - secretRef: name: <secret-name>
使用下列命令來定義環境變數。 將和
<secret-name>
取代<service-account-name>
為您在上一個步驟中複製的值。export SERVICE_ACCOUNT_NAME=<service-account-name> export SECRET_NAME=<secret-name>
下一節會使用這些值,將 Liberty 應用程式部署至 AKS 叢集。
注意
Service Connector 所建立的秘密包含 AZURE_SQL_CONNECTIONSTRING
,這是 Azure SQL 資料庫 的無密碼 連接字串。 如需詳細資訊,請參閱整合 Azure SQL 資料庫 與服務連接器的使用者指派受控識別驗證一節中的範例值。
現在您已設定資料庫和 AKS 叢集,接下來您可以繼續準備 AKS 來裝載 Open Liberty 應用程式。
設定和部署應用程式範例
請依照本節的步驟,在 Liberty 執行階段上部署應用程式範例。 這些步驟會使用 Maven。
查看應用程式
複製本文的範例程式碼。 此範例位於 GitHub 上。
存放庫中有幾個範例。 本文使用 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 20241107
若看到有關處於「HEAD 中斷連結」狀態的訊息,可放心忽略此訊息。 此訊息僅表示您已簽出標籤。
以下是應用程式的檔案結構,其中包含重要的檔案和目錄:
java-app
├─ src/main/
│ ├─ aks/
│ │ ├─ openlibertyapplication-agic-passwordless-db.yaml
│ ├─ docker/
│ │ ├─ Dockerfile
│ │ ├─ Dockerfile-wlp
│ ├─ liberty/config/
│ │ ├─ server.xml
│ ├─ java/
│ ├─ resources/
│ ├─ webapp/
├─ pom.xml
├─ pom-azure-identity.xml
java、resources 及 webapp 目錄包含應用程式範例的原始程式碼。 程式碼會宣告並使用名為 jdbc/JavaEECafeDB
的資料來源。
在 aks 目錄中,openlibertyapplication-agic-passwordless-db.yaml 檔案是用來使用 AGIC 和無密碼連線來部署應用程式映像與 Azure SQL 資料庫。 本文將假設您使用此檔案。
在 docker 目錄中,有兩個檔案可透過 Open Liberty 或 WebSphere Liberty 建立應用程式映像。
在目錄 自由/設定中 ,server.xml 檔案可用來設定 Open Liberty 和 WebSphere Liberty 叢集的資料庫連線。 它會定義用來連線到 Azure SQL 資料庫 的變數azure.sql.connectionstring
。
pom.xml檔案是 Maven 項目物件模型 (POM) 檔案,其中包含專案的組態資訊。 pom-azure-identity.xml檔案宣告相依性。azure-identity
此檔案可用來使用 Microsoft Entra ID 向 Azure 服務進行驗證。
注意
此範例會使用連結azure-identity
庫,使用 Microsoft Entra 驗證向 Azure SQL 資料庫 進行驗證。 如果您需要在 Liberty 應用程式中使用 SQL 驗證,請參閱 與 JDBC 的關係資料庫連線。
建置專案
既然您已收集必要的屬性,請建置應用程式。 專案的 POM 檔案會從環境中讀取許多變數。 作為 Maven 組建的一部分,這些變數可用來在位於 src/main/aks 的 YAML 檔案中填入值。 您可以視需要在 Maven 外部,為應用程式執行類似動作。
cd $BASE_DIR/java-app
# The following variables are used for deployment file generation into the target.
export LOGIN_SERVER=${LOGIN_SERVER}
export SC_SERVICE_ACCOUNT_NAME=${SERVICE_ACCOUNT_NAME}
export SC_SECRET_NAME=${SECRET_NAME}
export INGRESS_TLS_SECRET=${INGRESS_TLS_SECRET}
mvn clean install
mvn dependency:copy-dependencies -f pom-azure-identity.xml -DoutputDirectory=target/liberty/wlp/usr/shared/resources
在本地測試您的專案
在部署至 Azure 之前,請先在本機執行並測試專案。 為方便起見,本文會使用 liberty-maven-plugin
。 若要深入瞭解 liberty-maven-plugin
,請參閱 Open Liberty 文章使用 Maven 建置 Web 應用程式。
注意
如果您選取了「無伺服器」資料庫部署,請確認您的 SQL 資料庫尚未進入暫停模式。 若要這樣做,其中一個方法是登入資料庫查詢編輯器,如快速入門:使用 Azure 入口網站 查詢編輯器 (預覽) 來查詢 Azure SQL 資料庫。
使用
liberty:run
啟動應用程式。cd $BASE_DIR/java-app # The value of environment variable AZURE_SQL_CONNECTIONSTRING is read by configuration variable `azure.sql.connectionstring` in server.xml export AZURE_SQL_CONNECTIONSTRING="jdbc:sqlserver://$SQL_SERVER_NAME.database.windows.net:1433;databaseName=$DB_NAME;authentication=ActiveDirectoryDefault" mvn liberty:run
確認應用程式如預期運作。 您應該會在命令輸出中看到類似
[INFO] [AUDIT ] CWWKZ0001I: Application javaee-cafe started in 18.235 seconds.
的訊息。 移至瀏覽器中的http://localhost:9080/
,並確認應用程式可供存取,且所有函式皆正常運作。按 Ctrl+C 來停止。 如果系統要求您終止批次作業,請按 Y 鍵。
當您完成時,請使用下列命令,刪除允許本機 IP 位址存取 Azure SQL 資料庫 的防火牆規則:
az sql server firewall-rule delete \
--resource-group $RESOURCE_GROUP_NAME \
--server $SQL_SERVER_NAME \
--name AllowLocalIP
建置 AKS 部署的映像
您現在可以執行 az acr build
命令來建置映像,如下列範例所示:
cd $BASE_DIR/java-app/target
az acr build \
--registry ${REGISTRY_NAME} \
--image javaee-cafe:v1 \
.
命令 az acr build
會將 Dockerfile 中指定的成品上傳至 Container Registry 實例、建置映像,並將其儲存在 Container Registry 實例中。
將應用程式部署至 AKS 叢集
使用下列步驟在 AKS 叢集上部署 Liberty 應用程式:
連線到 AKS 叢集。
將值
cmdToConnectToCluster
貼入殼層中,然後執行命令。執行下列命令以套用部署檔案:
cd $BASE_DIR/java-app/target # Apply deployment file kubectl apply -f openlibertyapplication-agic-passwordless-db.yaml
使用下列命令,等待所有 Pod 皆成功重新啟動為止:
kubectl get pods --watch
類似下列範例的輸出將顯示所有 Pod 皆在執行中:
NAME READY STATUS RESTARTS AGE javaee-cafe-cluster-agic-67cdc95bc-2j2gr 1/1 Running 0 29s javaee-cafe-cluster-agic-67cdc95bc-fgtt8 1/1 Running 0 29s javaee-cafe-cluster-agic-67cdc95bc-h47qm 1/1 Running 0 29s
測試應用程式
執行 Pod 時,您可以使用 應用程式閘道 實體的公用 IP 位址來測試應用程式。
執行下列命令,以取得並顯示由 AGIC 所建立的輸入資源所公開 應用程式閘道 實例的公用 IP 位址:
export APP_URL=https://$(kubectl get ingress | grep javaee-cafe-cluster-agic-ingress | cut -d " " -f14)/
echo $APP_URL
複製URL並在瀏覽器開啟,以查看應用程式首頁。 若網頁無法正確轉譯或傳回 502 Bad Gateway
錯誤,應用程式會繼續於背景中保持啟動狀態。 請等候幾分鐘,然後再次嘗試。
清除資源
若要避免 Azure 費用,您應該清除不必要的資源。 當您不再需要叢集時,請使用 az group delete
命令來移除資源群組、容器服務、容器登錄、資料庫和所有相關資源:
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait
下一步
您可以從下列參考進行深入了解:
- Azure Kubernetes Service
- 教學課程:將 AKS 應用程式連線至 Azure SQL 資料庫 (預覽)
- 整合 Azure SQL 資料庫 與服務連接器
- 使用 Microsoft Entra 驗證進行連線
- Open Liberty
- Open Liberty Operator
- 開啟 [Liberty 伺服器設定]
- Liberty Maven 外掛程式
- 開啟 Liberty 容器映像
- WebSphere Liberty 容器映像
如需在 Azure 上部署 IBM WebSphere 系列的詳細資訊,請參閱 在 Azure 上執行 WebSphere 系列產品有哪些解決方案?。