在 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 叢集。

本文旨在協助您快速進行部署。 在進入生產環境之前,您應該先探索 Tuning Liberty

如果您沒有 Azure 訂用帳戶,請在開始之前建立 免費帳戶

必要條件

  • 本文需要最新版的 Azure CLI。 如果您使用 Azure Cloud Shell,則已安裝最新版本。
  • 如果您是在本機執行本指南中的命令(而不是 Azure Cloud Shell):
    • 準備已安裝類似 Unix 作業系統的本機電腦(例如 Ubuntu、macOS、Windows 子系統 Linux 版)。
    • 安裝 Java SE 實作,版本 17 或更新版本(例如 Eclipse Open J9)。
    • 安裝 Maven 3.5.0 或更高版本。
    • 安裝 適用於您 OS 的 Docker
  • 請確定您已獲 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 實例。 請確定 您的uniqueacrname 在 Azure 中是唯一的。

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

在短時間內,您應該會看到包含下列專案的 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)
export USER_NAME=$(az acr credential show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'username' \
    --output tsv)
export PASSWORD=$(az acr credential show \
    --name $REGISTRY_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --query 'passwords[0].value' \
    --output tsv)

docker login $LOGIN_SERVER -u $USER_NAME -p $PASSWORD

如果您已成功登入 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 命令列用戶端)。 如果您使用 Azure Cloud Shell,則 kubectl 已安裝。 若要在本機安裝 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.2.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

建立 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 範例

  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 20230906

如果您看到有關處於「中斷連結 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它插入 server.xml 檔案所參考的 rerestricted-config.yaml 檔案中。

  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.16.7
    [INFO] [err] [redisson-netty-2-2] 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的值,並在 version pom.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 will cause 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 will cause 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 在此案例中為 )。

Screenshot of Java liberty application successfully deployed on A K S.

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

Screenshot of sample application showing new coffee created and persisted in the session of the application.

若要示範會話快取會保存在應用程式的所有複本上,請執行下列命令,以刪除具有 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

下一步

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