在 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 角色或 ContributorUser Access Administrator 角色。 您可以依照列出使用者或群組的角色指派中的步驟進行驗證。

注意

您也可以從 Azure Cloud Shell 執行本文中的命令。 此方法已預安裝所有必要條件工具,但 Docker 除外。

  • 如果在本地執行本指南中的命令 (而非 Azure Cloud Shell):
    • 準備已安裝類似 Unix 的作業系統 (例如 Ubuntu、Azure Linux、macOS、Windows 子系統 Linux 版) 的本機電腦。
    • 安裝 Java SE 實作 17 版或更新版本。 (例如 Eclipse Open J9 (英文))。
    • 安裝 Maven 3.5.0 或更新版本。
    • 安裝適用於作業系統的 Docker
  • 確定您已獲指派訂用帳戶的 Owner 角色或 ContributorUser Access Administrator 角色。 您可以依照列出使用者或群組的角色指派中的步驟進行驗證。

使用入口網站在 AKS 部署上建立 Liberty

下述步驟可指導您於 AKS 上建立 Liberty 執行階段。 完成這些步驟之後,您將會有容器登錄實例和 AKS 叢集來部署容器化應用程式。

  1. 前往 Azure 入口網站。 在頁面頂端的搜尋方塊中,輸入 IBM Liberty on AKS。 出現建議時,請選取 [Marketplace] 區段中的唯一相符專案。

    如果您想要的話,您可以 直接前往供應專案

  2. 選取 建立

  3. 在 [ 基本] 窗格上:

    1. 建立新的資源群組。 因為資源群組在訂用帳戶內必須是唯一的,請選擇唯一的名稱。 擁有唯一名稱的簡單方法是使用縮寫、今天的日期和一些識別碼的組合(例如 , ejb0913-java-liberty-project-rg

    2. 在 [區域] 中,選取 [美國東部]

    3. 在殼層中為叢集和資料庫的資源組名建立環境變數:

      export RESOURCE_GROUP_NAME=<your-resource-group-name>
      

  4. 選取 [下一步]。 在 [ AKS ] 窗格中,您可以選擇性地選取現有的 AKS 叢集和 Container Registry 實例,而不是造成部署建立新的叢集。 此選項可讓您使用側車模式,如 Azure 架構中心所示。 您也可以調整 AKS 節點集區中虛擬機器大小和數量設定。

    基於本文的目的,只要保留此窗格上的所有預設值即可。

  5. 選取 [下一步]。 在 [負載平衡] 窗格上,選取 [連線 至 [Azure 應用程式閘道?] 旁的 []。 在本節中,您可以自定義下列部署選項:

    • 針對 虛擬網路子網,您可以選擇性地自定義部署放置資源的虛擬網路和子網。 您不需要從預設值變更其餘值。

    • 針對 TLS/SSL 憑證,您可以從 Azure 應用程式閘道 提供 TLS/SSL 憑證。 將值保留為預設值,讓供應專案產生自我簽署憑證。

      請勿使用自我簽署憑證進入生產環境。 如需自我簽署憑證的詳細資訊,請參閱 建立自我簽署的公開憑證來驗證您的應用程式

    • 您可以選取 [啟用 Cookie 型親和性],也稱為黏性工作階段。 本文使用黏性會話,因此請務必選取此選項。

  6. 選取 [下一步]。 在 [ 操作員和應用程式 ] 窗格上,本文會使用所有預設值。 不過,您可以自定義下列部署選項:

    • 您可以針對 IBM 支援的選項選取 [是],以部署 WebSphere Liberty 操作員。 保留預設值 ([否]) 即會部署 Open Liberty Operator。
    • 您可以為選取的操作員部署應用程式,方法是針對 [部署應用程式?] 選項選取 [是]。 保留預設值 ([否]) 不會部署任何應用程式。
  7. 選取 [檢閱 + 建立] 以驗證您所選的選項。 在 [ 檢閱 + 建立 ] 窗格上,當您看到 [建立 ] 在驗證通過之後變成可用時,請選取它。

    部署最多可能需要 20 分鐘的時間。 當您等候部署完成時,可以遵循建立 Azure SQL 資料庫 實例一節中的步驟。 完成該區段之後,請返回這裏並繼續。

從部署擷取選取的資訊

如果您從 [部署進行中 ] 窗格移開,下列步驟會示範如何回到該窗格。 如果您仍在顯示 部署已完成的窗格中,請移至新建立的資源群組,然後跳至第三個步驟。

  1. 在任何入口網站頁面的角落,選取功能表按鈕,然後選取 [資源群組]。

  2. 在包含 [篩選任何字段] 文字的方塊中,輸入您先前建立之資源群組的前幾個字元。 如果您遵循建議的慣例,請輸入您的縮寫,然後選取適當的資源群組。

  3. 在資源群組中的資源清單中,選取 [容器登錄類型] 值的資源。

  4. 在瀏覽窗格的 [設定] 底下,選取 [存取密鑰]。

  5. 將 [登入伺服器]、[登錄名稱]、[使用者名稱] 和 [密碼] 的值儲存在一邊。 您可以使用每個欄位旁的複製圖示,將值複製到系統剪貼簿。

  6. 返回您部署資源的資源群組。

  7. 在 [設定] 區段,選取 [部署]

  8. 選取清單中最底部的部署。 [ 部署名稱] 值符合供應專案的發行者標識碼。 包含字串 ibm

  9. 在瀏覽窗格中,選取 [ 輸出]。

  10. 藉由使用與上述值相同的複製技術,請將下列輸出的值儲存在一邊:

    • 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 位址] 設定[是]。

    Azure 入口網站 的螢幕快照,其中顯示 [建立 SQL 資料庫] 頁面的 [網络] 索引卷標,其中已醒目提示 [連線 ivity 方法和防火牆規則設定]。

注意

您為此資料庫選取的無伺服器計算層,可藉由讓資料庫在閑置期間進入睡眠狀態來節省成本。 如果資料庫在範例應用程式啟動時處於睡眠狀態,則該應用程式將會失敗。

若要強制資料庫喚醒,您可以使用查詢編輯器來執行查詢。 遵循查詢資料庫中的步驟。 以下是範例查詢: 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

javaresourceswebapp 目錄包含應用程式範例的原始程式碼。 程式碼會宣告並使用名為 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

  1. 使用 liberty:run啟動應用程式。 liberty:run 也會使用您稍早定義的環境變數。

    cd $BASE_DIR/java-app
    mvn liberty:run
    
  2. 如果測試成功,命令輸出中會出現類似 [INFO] [AUDIT] CWWKZ0003I: The application javaee-cafe updated in 1.930 seconds 的訊息。 在瀏覽器中移至 http://localhost:9080/ ,並確認應用程式可存取且所有函式都正常運作。

  3. 選取 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 映射:

  1. 使用下列命令執行映像。 此命令會使用您先前定義的環境變數。

    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
    
  2. 容器啟動之後,請移至 http://localhost:9080/ 瀏覽器中以存取應用程式。

  3. 選取 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

部署並測試應用程式

使用下列步驟來部署並測試應用程式:

  1. 連線到 AKS 叢集。

    將的值 cmdToConnectToCluster 貼到殼層中,然後執行 命令。

  2. 套用資料庫秘密:

    cd $BASE_DIR/java-app/target
    kubectl apply -f db-secret.yaml
    

    輸出為 secret/db-secret-sql created

  3. 套用部署檔案:

    kubectl apply -f openlibertyapplication-agic.yaml
    
  4. 使用下列命令,等待所有 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
    
  5. 驗證結果:

    1. 取得使用應用程式部署的輸入資源位址:

      kubectl get ingress
      

      從輸出複製 ADDRESS 的值。 此值是已部署 應用程式閘道 實例的前端公用IP位址。

    2. 移至 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

下一步

您可以從下列參考進行深入了解: