Azure Kubernetes Service (AKS) クラスターで、Java EE JCache と Open Liberty または WebSphere Liberty を使用する
この記事では、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 について調べる必要があります。
WebSphere on Azure ソリューションを開発しているエンジニアリング チームと密接に連携しながら移行シナリオに取り組むことに関心がある場合は、こちらの簡単な WebSphere 移行に関するアンケートに内容を記入し、連絡先情報を含めてください。 プログラム マネージャー、アーキテクト、エンジニアのチームからすぐに連絡があり、緊密なコラボレーションが開始されます。
前提条件
- Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
- Ubuntu、macOS、Windows Subsystem for Linux などの Unix 系オペレーティング システムがインストールされたローカル マシンを準備します。
- Azure CLI をインストールして Azure CLI コマンドを実行します。
- az login コマンドを使用して、Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、「Azure CLI を使用して Azure にサインインする」を参照してください。
- 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、「Azure CLI で拡張機能を使用および管理する」を参照してください。
- az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
- Java SE 実装バージョン 17 以降 (たとえば、OpenJDK の Microsoft ビルド) をインストールします。
- Maven 3.5.0 以上をインストールします。
- お使いの OS 用の Docker をインストールします。
- Git がインストールされていることを確認します。
- サブスクリプションの
Owner
ロール、またはContributor
およびUser Access Administrator
ロールが割り当てられていることを確認してください。 割り当てを確認するには、「ユーザーまたはグループのロールの割り当てを一覧表示する」の手順に従ってください。
インフラストラクチャの作成
このセクションの手順では、Azure でアプリケーション インフラストラクチャを作成する方法について説明します。 これらの手順を完了すると、サンプル アプリケーションを実行するための Azure Container Registry、Azure Kubernetes Service クラスター、Azure Cache for Redis インスタンスが作成されます。
リソース グループを作成する
Azure リソース グループは、Azure リソースが展開され管理される論理グループです。
az group create コマンドを使用して、eastus の場所に 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 インスタンスを作成します。 youruniqueacrname が Azure 内で一意であることを確認します。
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 portal を使用して 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
Note
コンテナー レジストリへのアクセスを許可するためにユーザー名とパスワードの資格情報を使用することはお勧めしません。 特定の使用要件で資格情報ベースのアクセスが最善の方法であると示されている場合は、az acr credential show
を使用してユーザー名とパスワードを取得し、これらの値を docker login
で使用できます。
ACR インスタンスに正常にサインインした場合は、コマンド出力の最後に Login Succeeded
が表示されます。
Azure コンテナー レジストリへのサインインに問題がある場合は、「レジストリ ログインのトラブルシューティング」を参照してください。
AKS クラスターを作成する
az aks create コマンドを使用して AKS クラスターを作成し、ACR インスタンスからイメージをプルするアクセス許可を付与します。 次の例では、myAKSCluster という名前のクラスターを 1 つのノードで作成します。 このコマンドは、完了するまでに数分かかります。
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 クラスターを管理するには、Kubernetes のコマンドライン クライアントである kubectl を使用します。 kubectl
をローカルにインストールするには、az aks install-cli コマンドを使用します。
az aks install-cli
Kubernetes クラスターに接続するように kubectl
を構成するには、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 インスタンスを作成し、その接続情報をメモしてください。 この情報は後で使用します。
「クイック スタート: Java で Azure Cache for Redis を使用する」の手順を「Java サンプルについて」の前まで実行してください。
Note
「Azure Cache for Redis を作成する」セクションの手順 6 では、[認定] オプションとして [アクセス キー認証] を選択してください。 このオプションは、サンプル アプリケーションが Redisson クライアント ライブラリを使用して Azure Cache for Redis インスタンスに接続するために必要です。 詳細については、Redisson の構成に関する記述を参照してください。
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
の詳細については、「Building a web application with Maven」(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、resources、および webapp ディレクトリには、サンプル アプリケーションのソース コードが含まれています。
aks ディレクトリにあるデプロイ ファイル openlibertyapplication.yaml を使用してアプリケーション イメージをデプロイします。
docker ディレクトリに、2 つの Dockerfile があります。 Dockerfile は Open Liberty を使用してイメージをビルドするために使用され、Dockerfile-wlp は WebSphere Liberty を使用してイメージをビルドするために使用されます。
liberty/config ディレクトリにある server.xml を使用して、Open Liberty および WebSphere Liberty クラスターのセッション キャッシュを構成します。
redisson ディレクトリにある redisson-config.yaml ファイルを使用して、Azure Cache for Redis インスタンスの接続を構成します。
アプリケーションのコンテナー格納
AKS クラスターに Liberty アプリケーションをデプロイして実行するには、次の手順を使用して、アプリケーションを Docker イメージとしてコンテナー化します。 Open Liberty コンテナー・イメージまたは WebSphere Liberty コンテナー・イメージを使用できます。
現在の作業ディレクトリがローカルクローン内の java-app-jcache であることを確認します。
mvn clean package
を実行してアプリケーションをパッケージ化します。mvn -Predisson validate
を実行して、Redisson 構成ファイルを指定の場所にコピーします。 この手順では、環境変数REDISCACHEHOSTNAME
とREDISCACHEKEY
の値を、redisson-config.yaml ファイルに挿入します。これは、server.xml ファイルによって参照されます。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
アプリケーションの実行を確認するために
http://localhost:9080/
にアクセスできますが、Redis が動作していることの証明は、前の手順で示した出力です。Ctrl + C キーを使って、アプリを停止します。
次のコマンドを使用して、pom.xml ファイルに定義されているプロパティ
artifactId
とversion
の値を取得します。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 インスタンスにプッシュします。
軽量のオープン ソース Java™ ランタイムとして Open Liberty を使用する場合は、次のコマンドを使用して 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 クラスターにコンテナー化されたサンプル アプリケーションをデプロイします。
現在の作業ディレクトリがローカルクローン内の java-app-jcache/target であることを確認します。
次のコマンドを使用して、Redisson 構成情報を使用してシークレットを作成します。 このシークレットにより、アプリケーションは作成された 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
[
READY
] 列の下に3/3
が、[AVAILABLE
] 列の下に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
監視プロセスを停止します。
Web ブラウザーでサービスの外部 IP アドレス (上記の例では 20.84.16.169
) を開き、アプリケーションのホーム ページを表示します。 ページが正しく読み込まれない場合は、アプリが起動中であるためです。 しばらく待ってから、ページを更新してください。 ページの左上にアプリケーション レプリカのポッド名が表示されることを確認します (このケースでは javaee-cafe-jcache-cluster-77d54bccd4-5xnzx
)。
[New coffee in session] フォームで、[Name] フィールドと [Price] フィールドの値を設定し、[Submit] を選択します。 数秒後、ページの左下に [Submit count: 1] と表示されます。
セッション キャッシュがアプリケーションのすべてのレプリカにわたって永続化されていることを示すには、次のコマンドを実行して、ポッド名 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
次に、アプリケーションのホーム ページを更新します。 [New coffee in session] セクションに同じデータが表示されますが、ページの左上に別のポッド名が表示されます。
最後に、次の手順を使用して、セッション データが Azure Cache for Redis インスタンスに保持されていることを示します。 Redis コンソールを使用して、Azure Cache for Redis インスタンスにコマンドを発行できます。
Azure portal で Azure Cache for Redis インスタンスを見つけます。
[コンソール] を選択して Redis コンソールを開きます。
次のコマンドを実行してセッション データを表示します。
scan 0 count 1000 match '*' hgetall "com.ibm.ws.session.attr.default_host%2F"
Web ページから cafe.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 ファミリの製品を実行するためのソリューションとは?」を参照してください。