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 \
    --admin-enabled

しばらくすると、次のものを含む 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)
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 という名前のクラスターを 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.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 の詳細については、「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 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

javaresources、および 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 コンテナー・イメージを使用できます。

  1. ディレクトリをローカル クローンの java-app-jcache に変更します。

  2. mvn clean package を実行してアプリケーションをパッケージ化します。

  3. mvn -Predisson validate を実行して、Redisson 構成ファイルを指定の場所にコピーします。 この手順では、環境変数 REDISCACHEHOSTNAMEREDISCACHEKEY の値を、redisson-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.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. 次のコマンドを使用して、pom.xml ファイルに定義されているプロパティ artifactIdversion の値を取得します。

    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 インスタンスにプッシュします。

    • 軽量のオープン ソース 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 クラスターにコンテナー化されたサンプル アプリケーションをデプロイします。

  1. 現在の作業ディレクトリがローカルクローン内の java-app-jcache/target であることを確認します。

  2. 次のコマンドを使用して、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. 次のコマンドを使用して、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/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)。

A K S に正常にデプロイされた Java Liberty アプリケーションのスクリーンショット。

[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 インスタンスにコマンドを発行できます。

  1. Azure portal で Azure Cache for Redis インスタンスを見つけます。

  2. [コンソール] を選択して Redis コンソールを開きます。

  3. 次のコマンドを実行してセッション データを表示します。

    scan 0 count 1000 match '*'
    
    hgetall "com.ibm.ws.session.attr.default_host%2F"
    
  4. 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 ファミリの製品を実行するためのソリューションとは?」を参照してください。