共用方式為


在 Azure Kubernetes Service (AKS) 叢集上搭配 Open Liberty 或 WebSphere Liberty 使用 Java EE JCache

本文說明如何在部署至 AKS 的容器化應用程式中使用 Java EE JCache。

在本指南中,您將:

  • 建立基礎結構,以在 Open Liberty 或 WebSphere Liberty 運行時間上執行 Java、Java EE、Jakarta EE 或 MicroProfile 應用程式。
  • 使用 Azure Cache for Redis 支援的 Java EE JCache 作為會話快取。
  • 使用 Open Liberty 或 WebSphere Liberty 容器映像,組建應用程式 Docker 映像。
  • 使用 Open Liberty 運算子,將容器化應用程式部署至 AKS 叢集。

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

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

必要條件

  • Azure 訂用帳戶。 如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶
  • 使用已安裝類似 Unix 的作業系統 (例如 Ubuntu、macOS 或 Windows 子系統 Linux 版) 準備本機電腦。
  • 安裝 Azure CLI 以執行 Azure CLI 命令。
    • 使用 az login 命令以 Azure CLI 登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱 使用 Azure CLI 登入 Azure。
    • 出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需延伸模組的詳細資訊,請參閱 使用和管理 Azure CLI 的擴充功能。
    • 執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade
  • 安裝 Java SE 實作第 17 版或更新版本 - 例如,Microsoft OpenJDK 的組建
  • 安裝 Maven 3.5.0 或更新版本。
  • 安裝適用於作業系統的 Docker
  • 確定 已安裝 Git
  • 請確定您已獲 Owner 指派訂用帳戶的角色或 Contributor 角色 User Access Administrator 。 您可以依照列出使用者或群組的角色指派中的步驟來確認您的指派。

建立基礎結構

本節中的步驟會引導您在 Azure 上建立應用程式基礎結構。 完成這些步驟之後,您將會有 Azure Container Registry、Azure Kubernetes Service 叢集,以及執行範例應用程式的 Azure Cache for Redis 實例。

建立資源群組

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

使用 eastus 位置中的 az group create 命令,建立名為 java-liberty-project 的資源群組。 此資源群組稍後會用於建立 Azure Container Registry (ACR) 實例和 AKS 叢集。

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

建立 ACR 執行個體

使用 az acr create 命令建立 ACR 執行個體。 下列範例會建立名為 youruniqueacrname 的 ACR 實例。 請確定在 Azure 中 youruniqueacrname 是唯一的。

export REGISTRY_NAME=youruniqueacrname
az acr create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $REGISTRY_NAME \
    --sku Basic

在短時間內,您應該會看到包含下列專案的 JSON 輸出:

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

或者,您可以依照快速入門:使用 Azure 入口網站 建立 Azure 容器登錄中的步驟來建立 Azure 容器登錄實例。

聯機到 ACR 實例

您必須先登入 ACR 實例,才能將映像推送至該實例。 執行下列命令來驗證連線:

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

az acr login \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME

注意

不建議使用使用者名稱和密碼認證來授與容器登錄的存取權。 如果您的特定使用需求建議認證型存取是最佳方法,您可以使用 取得使用者名稱和密碼 az acr credential show ,並搭配 docker login使用這些值。

如果您已成功登入 ACR 實體,您應該會在命令輸出結尾看到 Login Succeeded

如果您看到登入 Azure 容器登錄時發生問題,請參閱 針對登錄登入進行疑難解答。

建立 AKS 叢集

使用 az aks create 命令來建立 AKS 叢集,並將它映像提取許可權授與 ACR 實例。 下列範例會建立名為 myAKSCluster 並包含一個節點的叢集。 此命令需要幾分鐘才能完成。

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

幾分鐘后,命令會完成並傳回叢集的 JSON 格式資訊,包括下列幾行:

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

連線到 AKS 叢集

若要管理 Kubernetes 叢集,請使用 kubectl (Kubernetes 命令列用戶端)。 若要在本機安裝 kubectl,請使用 az aks install-cli 命令:

az aks install-cli

若要設定 kubectl 以連線到 Kubernetes 叢集,請使用 az aks get-credentials 命令。 此命令會下載憑證並設定 Kubernetes CLI 以供使用。

az aks get-credentials \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --overwrite-existing

若要驗證針對您叢集的連線,請使用 kubectl get 命令來傳回叢集節點的清單。

kubectl get nodes

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

NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-xxxxxxxx-yyyyyyyyyy   Ready    agent   76s     v1.18.10

安裝 Open Liberty 操作員

建立並連線到叢集之後,請執行下列命令來安裝 Open Liberty 運算符

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

# Install Open Liberty Operator
export OPERATOR_VERSION=1.3.3
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

建立 Azure Cache for Redis 執行個體

Azure Cache for Redis 會針對在 Open Liberty 或 WebSphere Liberty 伺服器內執行的 Java 應用程式,支持 HttpSession 持續性。 請遵循本節中的步驟來建立 Azure Cache for Redis 實例,並記下其聯機資訊。 我們稍後會使用這項資訊。

  1. 請遵循快速入門:在 Java 中使用 Azure Cache for Redis 中的步驟,但不包括瞭解 Java 範例

    注意

    在建立 Azure Cache for Redis 一節的步驟 6 中,針對 [驗證] 選項選取 [存取金鑰驗證]。 此選項是範例應用程式使用 Re比森 用戶端連結庫連線到 Azure Cache for Redis 實例的必要選項。 如需詳細資訊,請參閱 Re設定

  2. 複製 Azure Cache for Redis 實例的主機名主要存取密鑰 ,然後執行下列命令以新增環境變數:

    export REDISCACHEHOSTNAME=<YOUR_HOST_NAME>
    export REDISCACHEKEY=<YOUR_PRIMARY_ACCESS_KEY>
    

建置應用程式

請遵循本節中的步驟來建置和容器化範例應用程式。 這些步驟使用 Maven、 liberty-maven-pluginaz acr build。 若要深入了解 liberty-maven-plugin,請參閱使用 Maven 建置 Web 應用程式

查看應用程式

使用下列命令來複製本指南的範例程序代碼。 此範例位於 GitHub 上的 open-liberty-on-aks 存放庫中。 存放庫中有幾個範例。 本文使用 java-app-jcache

git clone https://github.com/Azure-Samples/open-liberty-on-aks.git
cd open-liberty-on-aks
git checkout 20240909
cd java-app-jcache

如果您看到有關處於「中斷連結的 HEAD」狀態的訊息,則可安全地略過此訊息。 那只是表示您已簽出標籤。

應用程式具有下列檔案結構:

java-app-jcache/
├── pom.xml
└── src
    └── main
        ├── aks
        │   └── openlibertyapplication.yaml
        ├── docker
        │   ├── Dockerfile
        │   └── Dockerfile-wlp
        ├── java
        ├── liberty
        │   └── config
        │       └── server.xml
        ├── redisson
        │   └── redisson-config.yaml
        ├── resources
        └── webapp

java資源和 webapp 目錄包含範例應用程式的原始程式碼。

aks 目錄中,會使用部署檔案 openlibertyapplication.yaml 來部署應用程式映像。

docker 目錄中,我們會放置兩個 Dockerfiles。 Dockerfile 是用來使用 Open Liberty 建置映射,而 Dockerfile-wlp 則用來使用 WebSphere Liberty 建置映射。

liberty/config 目錄中, server.xml 檔案可用來設定 Open Liberty 和 WebSphere Liberty 叢集的會話快取。

re等目錄中,reisi-config.yaml 檔案是用來設定 Azure Cache for Redis 實例的連線。

將應用程式容器化

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

  1. 確認目前的工作目錄是 本機複製中的java-app-jcache

  2. 執行 mvn clean package 以封裝應用程式。

  3. 執行 mvn -Predisson validate 以將Re組組態檔複製到指定的位置。 此步驟會將環境變數REDISCACHEHOSTNAME的值插入 REDISCACHEKEY rerestricted-config.yaml 檔案中,此檔案由 server.xml 檔案參考。

  4. 執行 mvn liberty:dev 以測試應用程式。 如果測試成功,您應該會在 The defaultServer server is ready to run a smarter planet. 命令輸出中看到 。 如果 Redis 連線成功,您應該會看到類似下面的輸出。

    [INFO] [err] [Default Executor-thread-5] INFO org.redisson.Version - Redisson 3.23.4
    [INFO] [err] [redisson-netty-2-7] INFO org.redisson.connection.pool.MasterPubSubConnectionPool - 1 connections initialized for redacted.redis.cache.windows.net/20.25.90.239:6380
    [INFO] [err] [redisson-netty-2-20] INFO org.redisson.connection.pool.MasterConnectionPool - 24 connections initialized for redacted.redis.cache.windows.net/20.25.90.239:6380
    
  5. 您可以流覽 http://localhost:9080/ 以查看執行中的應用程式,但 Redis 運作證明是上一個步驟中所列的輸出。

  6. 使用 Ctrl+C 來停止應用程式。

  7. 使用下列命令來擷取屬性artifactId的值,並在versionpom.xml檔案中定義。

    export artifactId=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.artifactId}' --non-recursive exec:exec)
    export version=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
    
  8. 執行 cd target 以將目錄變更為範例的組建。

  9. 執行下列其中一個命令來建置應用程式映像,並將它推送至 ACR 實例。

    • 如果您想要使用 Open Liberty 作為輕量型 開放原始碼 Java™ 運行時間,請使用下列命令來建置 Open Liberty 基底映射:

      # Build and tag application image. This causes the ACR instance to pull the necessary Open Liberty base images.
      az acr build -t ${artifactId}:${version} -r $REGISTRY_NAME --resource-group $RESOURCE_GROUP_NAME .
      
    • 如果您想要使用商業版本的 Open Liberty,請使用下列命令來建置 WebSphere Liberty 基底映射:

      # Build and tag application image. This causes the ACR instance to pull the necessary WebSphere Liberty base images.
      az acr build -t ${artifactId}:${version} -r $REGISTRY_NAME --resource-group $RESOURCE_GROUP_NAME --file=Dockerfile-wlp .
      

部署應用程式

請遵循本節中的步驟,在 AKS 叢集上部署容器化範例應用程式。

  1. 確認目前的工作目錄是 本機複製中的java-app-jcache/target

  2. 使用下列命令來建立具有Re設定資訊的秘密。 使用此秘密,應用程式可以連線到已建立的 Azure Cache for Redis 實例。

    export REDISSON_CONFIG_SECRET_NAME=redisson-config-secret
    kubectl create secret generic ${REDISSON_CONFIG_SECRET_NAME} --from-file=$(pwd)/liberty/wlp/usr/servers/defaultServer/redisson-config.yaml
    
  3. 使用下列命令,將具有三個複本的 Liberty 應用程式部署到 AKS 叢集。 命令輸出也會內嵌顯示。

    # Set number of application replicas
    export REPLICAS=3
    
    # Create OpenLibertyApplication "javaee-cafe-jcache-cluster"
    envsubst < openlibertyapplication.yaml | kubectl create -f -
    
    openlibertyapplication.openliberty.io/javaee-cafe-jcache-cluster created
    
    # Check if OpenLibertyApplication instance is created
    kubectl get openlibertyapplication ${artifactId}-cluster
    
    NAME                               IMAGE                                                         EXPOSED      RECONCILED   AGE
    javaee-cafe-jcache-cluster         youruniqueacrname.azurecr.io/javaee-cafe-jcache:1.0.0                      True         59s
    
    # Check if deployment created by Operator is ready
    kubectl get deployment ${artifactId}-cluster --watch
    
    NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
    javaee-cafe-jcache-cluster         0/3     3            0           20s
    
  4. 等到您在數據READY行底下和3數據行底下AVAILABLE看到3/3,然後使用 Ctrl+C 停止kubectl監看程式。

測試應用程式

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

若要監視進度,請使用 kubectl get service 命令搭配 --watch 引數。

kubectl get service ${artifactId}-cluster --watch

NAME                               TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)          AGE
javaee-cafe-jcache-cluster         LoadBalancer   10.0.50.29     20.84.16.169    80:31732/TCP     68s

當 EXTERNAL-IP 位址從擱置變更為實際的公用 IP 地址之後,請使用 Ctrl+C 停止kubectl監看程式。

開啟網頁瀏覽器至您服務的外部 IP 位址(20.84.16.169 如上述範例所示),以查看應用程式首頁。 如果頁面未正確載入,這是因為應用程式正在啟動。 您可以等候一段時間,稍後重新整理頁面。 您應該會看到應用程式複本的 Pod 名稱顯示在頁面左上方(javaee-cafe-jcache-cluster-77d54bccd4-5xnzx 在此案例中為 )。

Java 自由應用程式已成功部署在 A K S 上的螢幕快照。

在 [工作階段中的新增咖啡] 表單中,設定 [名稱] 和 [價格] 字段的值,然後選取 [提交]。 幾秒鐘后,您會看到 [提交計數:1 ] 顯示在頁面左下方。

範例應用程式的螢幕快照,其中顯示應用程式會話中已建立並保存的新咖啡。

若要示範工作階段快取會儲存在應用程式的所有複本上,請執行下列命令,以刪除具有 Pod 名稱 javaee-cafe-jcache-cluster-<pod id from your running app>的目前複本:

kubectl delete pod javaee-cafe-jcache-cluster-77d54bccd4-5xnzx

pod "javaee-cafe-jcache-cluster-77d54bccd4-5xnzx" deleted

然後,重新整理應用程式首頁。 您會在 [工作階段中的新增咖啡] 區段中看到相同的數據,但頁面左上角顯示的不同 Pod 名稱。

最後,使用下列步驟來示範會話數據會保存在 Azure Cache for Redis 實例中。 您可以使用 Redis 控制台,向 Azure Cache for Redis 實例發出命令。

  1. 從 Azure 入口網站 尋找您的 Azure Cache for Redis 實例。

  2. 選取 [主控台 ] 以開啟 Redis 控制台。

  3. 執行下列命令來檢視工作階段資料:

    scan 0 count 1000 match '*'
    
    hgetall "com.ibm.ws.session.attr.default_host%2F"
    
  4. 從網頁搜尋 café.model.entity.Coffee[id=1, name=Coffee 3, price=30.0] 網頁,這是您在 Azure Cache for Redis 實例中建立並保存的咖啡。

清除資源

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

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

若要刪除 Azure Cache for Redis 實例,請尋找其資源組名,然後執行下列命令:

az group delete --name <AZURE_CACHE_FOR_REDIS_RESOURCE_GROUP_NAME> --yes --no-wait

下一步

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

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