在 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 Cloud Shell 中使用 Bash 環境。 如需詳細資訊,請參閱 Azure Cloud Shell 中的 Bash 快速入門。
若要在本地執行 CLI 參考命令,請安裝 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。 如果您使用 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 實例,並記下其聯機資訊。 我們稍後會使用這項資訊。
請遵循快速入門:在 Java 中使用 Azure Cache for Redis 中的步驟,但不包括瞭解 Java 範例。
複製 Azure Cache for Redis 實例的主機名 和 主要存取密鑰 ,然後執行下列命令以新增環境變數:
export REDISCACHEHOSTNAME=<YOUR_HOST_NAME> export REDISCACHEKEY=<YOUR_PRIMARY_ACCESS_KEY>
建置應用程式
請遵循本節中的步驟來建置和容器化範例應用程式。 這些步驟使用 Maven、 liberty-maven-plugin
和 az 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 容器映射。
將目錄變更為 本機複製的 java-app-jcache 。
執行
mvn clean package
以封裝應用程式。執行
mvn -Predisson validate
以將Re組組態檔複製到指定的位置。 此步驟會插入環境變數REDISCACHEHOSTNAME
的值,並將REDISCACHEKEY
它插入 server.xml 檔案所參考的 rerestricted-config.yaml 檔案中。執行
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
您可以流覽
http://localhost:9080/
以查看執行中的應用程式,但 Redis 運作證明是上一個步驟中所列的輸出。使用 Ctrl+C 來停止應用程式。
使用下列命令來擷取屬性
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)
執行
cd target
以將目錄變更為範例的組建。執行下列其中一個命令來建置應用程式映像,並將它推送至 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 叢集上部署容器化範例應用程式。
確認目前的工作目錄是 本機複製中的java-app-jcache/target 。
使用下列命令來建立具有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
使用下列命令,將具有三個複本的 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
等到您在數據
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
在此案例中為 )。
在 [會話中的新增咖啡] 表單 中,設定 [名稱 ] 和 [價格 ] 欄位 的值,然後選取 [ 提交 ]。 幾秒鐘後,您會看到 [提交計數: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 實例 發出命令。
從Azure 入口網站尋找 Azure Cache for Redis 實例。
選取 [主控台 ] 以開啟 Redis 主控台。
執行下列命令來檢視會話資料:
scan 0 count 1000 match '*' hgetall "com.ibm.ws.session.attr.default_host%2F"
從網頁搜尋 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
下一步
您可以從本指南中使用的參考深入瞭解:
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應