在 Azure Kubernetes Service 叢集上使用 Open Liberty 或 WebSphere Liberty 部署 Java 應用程式
本文會示範如何:
- 在 Open Liberty 或 IBM WebSphere Liberty 執行時間上執行 Java、Java EE、Jakarta EE 或 MicroProfile 應用程式。
- 使用 Open Liberty 或 WebSphere Liberty 容器映像建置應用程式的 Docker 映像。
- 使用 Open Liberty 操作員或 WebSphere Liberty 操作員,將容器化應用程式部署至 Azure Kubernetes Service (AKS) 叢集。
Open Liberty Operator 可簡化在 Kubernetes 叢集上執行應用程式的部署和管理。 使用 Open Liberty 運算子或 WebSphere Liberty 運算符,您也可以執行更進階的作業,例如收集追蹤和傾印。
本文使用 Open Liberty 或 WebSphere Liberty 的 Azure Marketplace 供應專案,加速您前往 AKS 的旅程。 供應項目會自動布建一些 Azure 資源,包括:
- Azure Container Registry 實例。
- AKS 叢集。
- 應用程式閘道 輸入控制器 (AGIC) 實例。
- Open Liberty 運算子和 WebSphere Liberty 運算符。
- 選擇性地包含 Liberty 和應用程式的容器映像。
如果您想要在 AKS 上執行 Liberty 的手動逐步指引,請參閱 在 Azure Kubernetes Service (AKS) 叢集上使用 Open Liberty 或 WebSphere Liberty 手動部署 Java 應用程式。
本文旨在協助您快速進行部署。 在進入生產環境之前,您應該先探索 IBM 關於 Tuning Liberty 的檔。
如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶。
必要條件
- 安裝 Azure CLI。 若您在 Windows 或 macOS 上執行,請考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱〈如何在 Docker 容器中執行 Azure CLI〉。
- 使用 az login 命令來登入 Azure CLI。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱使用 Azure CLI 登入。
- 出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需擴充功能詳細資訊,請參閱使用 Azure CLI 擴充功能。
- 執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。 本文需要使用至少 Azure CLI 2.31.0 版。
- 安裝 Java SE 實作 17 版或更新版本。 (例如 Eclipse Open J9 (英文))。
- 安裝 Maven 3.5.0 或更新版本。
- 安裝適用於作業系統的 Docker
- 確定 已安裝 Git 。
- 確定您已獲指派訂用帳戶的
Owner
角色或Contributor
和User Access Administrator
角色。 您可以依照列出使用者或群組的角色指派中的步驟進行驗證。
- 如果在本地執行本指南中的命令 (而非 Azure Cloud Shell):
- 準備已安裝類似 Unix 的作業系統 (例如 Ubuntu、Azure Linux、macOS、Windows 子系統 Linux 版) 的本機電腦。
- 安裝 Java SE 實作 17 版或更新版本。 (例如 Eclipse Open J9 (英文))。
- 安裝 Maven 3.5.0 或更新版本。
- 安裝適用於作業系統的 Docker
- 確定您已獲指派訂用帳戶的
Owner
角色或Contributor
和User Access Administrator
角色。 您可以依照列出使用者或群組的角色指派中的步驟進行驗證。
使用入口網站在 AKS 部署上建立 Liberty
下述步驟可指導您於 AKS 上建立 Liberty 執行階段。 完成這些步驟之後,您將會有容器登錄實例和 AKS 叢集來部署容器化應用程式。
前往 Azure 入口網站。 在頁面頂端的搜尋方塊中,輸入 IBM Liberty on AKS。 出現建議時,請選取 [Marketplace] 區段中的唯一相符專案。
如果您想要的話,您可以 直接前往供應專案。
選取 建立。
在 [ 基本] 窗格上:
建立新的資源群組。 因為資源群組在訂用帳戶內必須是唯一的,請選擇唯一的名稱。 擁有唯一名稱的簡單方法是使用縮寫、今天的日期和一些識別碼的組合(例如 ,
ejb0913-java-liberty-project-rg
。在 [區域] 中,選取 [美國東部]。
在殼層中為叢集和資料庫的資源組名建立環境變數:
export RESOURCE_GROUP_NAME=<your-resource-group-name>
選取 [下一步]。 在 [ AKS ] 窗格中,您可以選擇性地選取現有的 AKS 叢集和 Container Registry 實例,而不是造成部署建立新的叢集。 此選項可讓您使用側車模式,如 Azure 架構中心所示。 您也可以調整 AKS 節點集區中虛擬機器大小和數量設定。
基於本文的目的,只要保留此窗格上的所有預設值即可。
選取 [下一步]。 在 [負載平衡] 窗格上,選取 [連線 至 [Azure 應用程式閘道?] 旁的 [是]。 在本節中,您可以自定義下列部署選項:
針對 虛擬網路 和 子網,您可以選擇性地自定義部署放置資源的虛擬網路和子網。 您不需要從預設值變更其餘值。
針對 TLS/SSL 憑證,您可以從 Azure 應用程式閘道 提供 TLS/SSL 憑證。 將值保留為預設值,讓供應專案產生自我簽署憑證。
請勿使用自我簽署憑證進入生產環境。 如需自我簽署憑證的詳細資訊,請參閱 建立自我簽署的公開憑證來驗證您的應用程式。
您可以選取 [啟用 Cookie 型親和性],也稱為黏性工作階段。 本文使用黏性會話,因此請務必選取此選項。
選取 [下一步]。 在 [ 操作員和應用程式 ] 窗格上,本文會使用所有預設值。 不過,您可以自定義下列部署選項:
- 您可以針對 IBM 支援的選項選取 [是],以部署 WebSphere Liberty 操作員。 保留預設值 ([否]) 即會部署 Open Liberty Operator。
- 您可以為選取的操作員部署應用程式,方法是針對 [部署應用程式?] 選項選取 [是]。 保留預設值 ([否]) 不會部署任何應用程式。
選取 [檢閱 + 建立] 以驗證您所選的選項。 在 [ 檢閱 + 建立 ] 窗格上,當您看到 [建立 ] 在驗證通過之後變成可用時,請選取它。
部署最多可能需要 20 分鐘的時間。 當您等候部署完成時,可以遵循建立 Azure SQL 資料庫 實例一節中的步驟。 完成該區段之後,請返回這裏並繼續。
從部署擷取選取的資訊
如果您從 [部署進行中 ] 窗格移開,下列步驟會示範如何回到該窗格。 如果您仍在顯示 部署已完成的窗格中,請移至新建立的資源群組,然後跳至第三個步驟。
在任何入口網站頁面的角落,選取功能表按鈕,然後選取 [資源群組]。
在包含 [篩選任何字段] 文字的方塊中,輸入您先前建立之資源群組的前幾個字元。 如果您遵循建議的慣例,請輸入您的縮寫,然後選取適當的資源群組。
在資源群組中的資源清單中,選取 [容器登錄類型] 值的資源。
在瀏覽窗格的 [設定] 底下,選取 [存取密鑰]。
將 [登入伺服器]、[登錄名稱]、[使用者名稱] 和 [密碼] 的值儲存在一邊。 您可以使用每個欄位旁的複製圖示,將值複製到系統剪貼簿。
返回您部署資源的資源群組。
在 [設定] 區段,選取 [部署]。
選取清單中最底部的部署。 [ 部署名稱] 值符合供應專案的發行者標識碼。 包含字串
ibm
。在瀏覽窗格中,選取 [ 輸出]。
藉由使用與上述值相同的複製技術,請將下列輸出的值儲存在一邊:
cmdToConnectToCluster
appDeploymentTemplateYaml
如果部署不包含應用程式,則為 。 也就是說,當您部署 Marketplace 供應專案時,已針對 [部署應用程式] 選取 [否]。appDeploymentYaml
如果部署包含應用程式,則為 。 也就是說,您已選取 [是 ] 作為 [ 部署應用程式?]。
將 或
appDeploymentYaml
的值appDeploymentTemplateYaml
貼到Bash殼層中,附加| grep secretName
,然後執行命令。這個指令輸出是輸入 TLS 秘密名稱, 例如
- secretName: secret785e2c
。 將值儲存在一邊secretName
。
您將在本文稍後使用這些值。 請注意,輸出會列出數個其他有用的命令。
建立 Azure SQL 資料庫執行個體
若要建立 Azure SQL 資料庫 單一資料庫以搭配您的應用程式使用,請遵循快速入門:在 Azure SQL 資料庫 中建立單一資料庫中的步驟。 請仔細注意下列差異:
在 [基本] 步驟中,記下資源群組、資料庫名稱、伺服器>名稱.database.windows.net、<伺服器管理員登入和密碼的值。 本文將資料庫 資源群組 值
<db-resource-group>
稱為 。在 [網络] 步驟中,將 [連線 ivity 方法設定為 [公用端點]、將 [允許 Azure 服務和資源存取此伺服器] 設定為 [是],並將 [新增目前的用戶端 IP 位址] 設定為 [是]。
注意
您為此資料庫選取的無伺服器計算層,可藉由讓資料庫在閑置期間進入睡眠狀態來節省成本。 如果資料庫在範例應用程式啟動時處於睡眠狀態,則該應用程式將會失敗。
若要強制資料庫喚醒,您可以使用查詢編輯器來執行查詢。 遵循查詢資料庫中的步驟。 以下是範例查詢: SELECT * FROM COFFEE;
。
在殼層中為資料庫的資源組名建立環境變數:
export DB_RESOURCE_GROUP_NAME=<db-resource-group>
現在您已建立資料庫和 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 20240220
如果您看到有關處於「中斷連結 HEAD」狀態的訊息,您可以放心地忽略它。 訊息只是表示您已取出標籤。
以下是應用程式的檔案結構:
java-app
├─ src/main/
│ ├─ aks/
│ │ ├─ db-secret.yaml
│ │ ├─ openlibertyapplication-agic.yaml
│ │ ├─ openlibertyapplication.yaml
│ │ ├─ webspherelibertyapplication-agic.yaml
│ │ ├─ webspherelibertyapplication.yaml
│ ├─ docker/
│ │ ├─ Dockerfile
│ │ ├─ Dockerfile-wlp
│ ├─ liberty/config/
│ │ ├─ server.xml
│ ├─ java/
│ ├─ resources/
│ ├─ webapp/
├─ pom.xml
java、resources 及 webapp 目錄包含應用程式範例的原始程式碼。 程式碼會宣告並使用名為 jdbc/JavaEECafeDB
的資料來源。
在 aks 目錄中,有五個部署檔案:
- db-secret.xml:使用此檔案建立具有資料庫連線認證的 Kubernetes 秘密。
- openlibertyapplication-agic.yaml:使用此檔案以 AGIC 部署 Open Liberty 應用程式。 本文假設您使用這個檔案。
- openlibertyapplication.yaml:如果您想要部署不含 AGIC 的 Open Liberty 應用程式,請使用此檔案。
- webspherelibertyapplication-agic.yaml:如果您稍早在本文中部署WebSphere Liberty 操作員,請使用此檔案來部署 WebSphere Liberty 應用程式與 AGIC。
- webspherelibertyapplication.yaml:如果您稍早部署 WebSphere Liberty 操作員,請使用此檔案來部署不含 AGIC 的 WebSphere Liberty 應用程式。
在 docker 目錄中,有兩個檔案可建立應用程式映像:
- Dockerfile:在本文中,使用此檔案以 Open Liberty 建置應用程式映射。
- Dockerfile-wlp:如果您稍早在本文中部署了 WebSphere Liberty 操作員,請使用此檔案來建置應用程式映像。
在 liberty/config 目錄中,您可以使用 server.xml 檔案來設定 Open Liberty 和 WebSphere Liberty 叢集的資料庫連線。
建置專案
現在您已擁有必要的屬性,您可以建置應用程式。 專案的 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=<Azure-Container-Registry-Login-Server-URL>
export REGISTRY_NAME=<Azure-Container-Registry-name>
export USER_NAME=<Azure-Container-Registry-username>
export PASSWORD='<Azure-Container-Registry-password>'
export DB_SERVER_NAME=<server-name>.database.windows.net
export DB_NAME=<database-name>
export DB_USER=<server-admin-login>@<server-name>
export DB_PASSWORD='<server-admin-password>'
export INGRESS_TLS_SECRET=<ingress-TLS-secret-name>
mvn clean install
(選擇性) 在本機測試您的專案
在部署至 Azure 之前,先在本機執行並測試專案。 為了方便起見,本文使用 liberty-maven-plugin
。 若要深入瞭解 liberty-maven-plugin
,請參閱使用 Maven 建置 Web 應用程式一文。
針對您的應用程式,您可以使用任何其他機制來執行類似的事情,例如您的本機開發環境。 您也可以考慮使用適用於容器開發的 liberty:devc
選項。 您可以在 Open Liberty 檔中深入瞭解liberty:devc
。
使用
liberty:run
啟動應用程式。liberty:run
也會使用您稍早定義的環境變數。cd $BASE_DIR/java-app mvn liberty:run
如果測試成功,命令輸出中會出現類似
[INFO] [AUDIT] CWWKZ0003I: The application javaee-cafe updated in 1.930 seconds
的訊息。 在瀏覽器中移至http://localhost:9080/
,並確認應用程式可存取且所有函式都正常運作。選取 Ctrl+C 以停止。
建置 AKS 部署的映像
您現在可以執行 docker build
命令來建置映射:
cd $BASE_DIR/java-app/target
docker buildx build --platform linux/amd64 -t javaee-cafe:v1 --pull --file=Dockerfile .
(選擇性) 在本機測試 Docker 映像
在部署至 Azure 之前,請使用下列步驟在本機測試 Docker 映射:
使用下列命令執行映像。 此命令會使用您先前定義的環境變數。
docker run -it --rm -p 9080:9080 \ -e DB_SERVER_NAME=${DB_SERVER_NAME} \ -e DB_NAME=${DB_NAME} \ -e DB_USER=${DB_USER} \ -e DB_PASSWORD=${DB_PASSWORD} \ javaee-cafe:v1
容器啟動之後,請移至
http://localhost:9080/
瀏覽器中以存取應用程式。選取 Ctrl+C 以停止。
將映像上傳至 Azure Container Registry
將建置映射上傳至您在供應專案中建立的 Container Registry 實例:
docker tag javaee-cafe:v1 ${LOGIN_SERVER}/javaee-cafe:v1
docker login -u ${USER_NAME} -p ${PASSWORD} ${LOGIN_SERVER}
docker push ${LOGIN_SERVER}/javaee-cafe:v1
部署並測試應用程式
使用下列步驟來部署並測試應用程式:
連線到 AKS 叢集。
將的值
cmdToConnectToCluster
貼到殼層中,然後執行 命令。套用資料庫秘密:
cd $BASE_DIR/java-app/target kubectl apply -f db-secret.yaml
輸出為
secret/db-secret-sql created
。套用部署檔案:
kubectl apply -f openlibertyapplication-agic.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
驗證結果:
取得使用應用程式部署的輸入資源位址:
kubectl get ingress
從輸出複製
ADDRESS
的值。 此值是已部署 應用程式閘道 實例的前端公用IP位址。移至
https://<ADDRESS>
以測試應用程式。 為了方便起見,此殼層命令會建立環境變數,其值可以直接貼到瀏覽器中:export APP_URL=https://$(kubectl get ingress | grep javaee-cafe-cluster-agic-ingress | cut -d " " -f14)/ echo $APP_URL
如果網頁無法正確轉譯或傳回
502 Bad Gateway
錯誤,應用程式仍在背景中啟動。 請等候幾分鐘,然後再次嘗試。
清除資源
若要避免 Azure 費用,您應該清除不必要的資源。 當您不再需要叢集時,請使用 az group delete 命令來移除資源群組、容器服務、容器登錄、資料庫和所有相關資源:
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait
az group delete --name $DB_RESOURCE_GROUP_NAME --yes --no-wait
下一步
您可以從下列參考進行深入了解: