Azure Kubernetes Service クラスターに、Open Liberty または WebSphere Liberty を使用する Java アプリケーションをデプロイする

この記事では、次の方法を示します。

  • Open Liberty または IBM WebSphere Liberty ランタイムで、Java、Java EE、Jakarta EE、または MicroProfile アプリケーションを実行します。
  • Open Liberty または WebSphere Liberty コンテナー イメージを使用して、アプリケーションの Docker イメージを構築します。
  • Open Liberty Operator または WebSphere Liberty Operator を使用して、コンテナー化されたアプリケーションを Azure Kubernetes Service (AKS) クラスターにデプロイします。

Open Liberty オペレーターにより、Kubernetes クラスターで実行されるアプリケーションのデプロイと管理が簡単になります。 Open Liberty Operator または WebSphere Liberty Operator を使用して、トレースやダンプの収集など、より高度な操作を実行することもできます。

この記事では、Open Liberty または WebSphere Liberty 向けの Azure Marketplace オファーを使用して、AKS への移行を加速します。 このオファーでは、次の内容を含む複数の Azure リソースが自動的にプロビジョニングされます。

  • Azure Container Registry インスタンス。
  • AKS クラスター。
  • Application Gateway イングレス コントローラー (AGIC) インスタンス。
  • Open Liberty Operator と WebSphere Liberty Operator。
  • 必要に応じて、Liberty とアプリケーションを含むコンテナー イメージ。

AKS で Liberty を実行するための手動ステップ バイ ステップのガイダンスを使用する場合は、「Azure Kubernetes Service (AKS) クラスターに、Open Liberty または WebSphere Liberty を使用する Java アプリケーションを手動でデプロイします」を参照してください。

この記事は、デプロイをすばやく行うのに役立ちます。 運用環境に移行する前に、「Liberty のチューニングに関する IBM のドキュメント」を確認する必要があります。

Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。

前提条件

  • Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
  • az login コマンドを使用して、Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。
  • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。
  • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。 この記事では、Version 2.31.0 以上の Azure CLI が必要です。
  • Java SE 実装バージョン 17 以降をインストールします。 (たとえば、Eclipse Open J9など)。
  • Maven 3.5.0 以上をインストールします。
  • お使いの OS 用の Docker をインストールします。
  • Git がインストールされていることを確認します。
  • サブスクリプションで Owner ロールまたは Contributor および User Access Administrator ロールが割り当てられていることを確認してください。 これを確認するには、「ユーザーまたはグループのロールの割り当てを一覧表示する」の手順に従ってください。

Note

この記事のコマンドは、Azure Cloud Shell から実行することもできます。 この方法では、Docker を除き、前提条件となるすべてのツールがプレインストールされています。

  • このガイドのコマンドを (Azure Cloud Shell ではなく) ローカルで実行する場合:
    • Unix のようなオペレーティング システム (Ubuntu、Azure Linux、macOS、Linux 用 Windows サブシステムなど) がインストールされているローカル マシンを準備します。
    • Java SE 実装バージョン 17 以降をインストールします。 (たとえば、Eclipse Open J9など)。
    • Maven 3.5.0 以上をインストールします。
    • お使いの OS 用の Docker をインストールします。
  • サブスクリプションで Owner ロールまたは Contributor および User Access Administrator ロールが割り当てられていることを確認してください。 これを確認するには、「ユーザーまたはグループのロールの割り当てを一覧表示する」の手順に従ってください。

ポータルを使用して AKS 上の Liberty のデプロイを作成する

次の手順は、AKS 上の Liberty ランタイムを作成する方法を示しています。 これらの手順を完了すると、コンテナー化されたアプリケーションをデプロイするための Container Registry インスタンスと AKS クラスターが作成されます。

  1. Azure ポータルにアクセスします。 ページ上部の検索ボックスに「IBM Liberty on AKS」と入力します。 候補が表示されたら、[Marketplace] セクションでる唯一の一致項目を選択します。

    必要に応じて、オファーに直接移動できます。

  2. [作成] を選択します

  3. [基本] ペインで、次の操作を行います。

    1. 新しいリソース グループを作成します。 リソース グループはサブスクリプション内で一意である必要があるため、一意の名前を選択します。 一意の名前を付ける簡単な方法は、自分の名前のイニシャル、今日の日付、何らかの識別子 (ejb0913-java-liberty-project-rg など) を組み合わせて使用することです。

    2. [リージョン] で、 [米国東部] を選択します。

    3. クラスターとデータベースのリソース グループ名の環境変数をシェルに作成します。

      export RESOURCE_GROUP_NAME=<your-resource-group-name>
      

  4. [次へ] を選択します。 AKS ウィンドウでは、デプロイで新しいクラスターを作成する代わりに、必要に応じて既存の AKS クラスターと Container Registry インスタンスを選択できます。 この選択により、Azure アーキテクチャ センターに示すようにサイドカー パターンを利用できます。 また、AKS ノード プール内の仮想マシンのサイズと数の設定を調整することもできます。

    この記事では、このウィンドウの既定値はすべてそのまま使用します。

  5. [次へ] を選択します。 [負荷分散] ウィンドウで、[Azure Application Gateway に接続しますか?] の横にある [はい] を選択します。 このセクションでは、次のデプロイ オプションをカスタマイズできます。

    • [仮想ネットワーク][サブネット] では、必要に応じて、デプロイでリソースが配置される仮想ネットワークとサブネットをカスタマイズできます。 残りの値を既定値から変更する必要はありません。

    • TLS/SSL 証明書については、Azure Application Gateway から TLS/SSL 証明書を指定できます。 値を既定値のままにして、オファーで自己署名証明書が生成されるようにします。

      自己署名証明書を使用して運用環境に移行しないでください。 自己署名証明書の詳細については、「自己署名公開証明書を作成してアプリケーションを認証する」を参照してください。

    • [Cookie ベースのアフィニティを有効にする] を選択できます。このアフィニティは、スティッキー セッションとも呼ばれます。 この記事ではスティッキー セッションを使用するため、必ずこのオプションを選択してください。

  6. [次へ] を選択します。 [オペレーターとアプリケーション] ウィンドウで、この記事ではすべて既定値を使用します。 ただし、次のデプロイ オプションをカスタマイズできます。

    • [IBM サポート] オプションで [はい] を選択すると、WebSphere Liberty Operator をデプロイできます。 既定値の [いいえ] のままにすると、Open Liberty Operator がデプロイされます。
    • [アプリケーションのデプロイ] オプションで [はい] を選択すると、選択した Operator 用のアプリケーションをデプロイできます。 既定値の [いいえ] のままにすると、アプリケーションはデプロイされません。
  7. [確認および作成] を選択して、選んだオプションを検証します。 [確認と作成] ウィンドウで、検証に合格した後、[作成] が使用可能になったことが確認できたら、[作成] を選択します。

    デプロイには、最大 20 分かかる場合があります。 デプロイが完了するのを待つ間に、「Azure SQL Database インスタンスの作成」セクションの手順に従うことができます。 そのセクションを完了したら、ここに戻って続行します。

選択した情報をデプロイから取得する

[デプロイが進行中です] ページから移動した場合は、次の手順でそのページに戻る方法について説明します。 [デプロイが完了しました] と表示されたページにまだいる場合は、新しく作成したリソース グループに移動して、3 番目のステップに進みます。

  1. ポータル ページの隅にあるメニュー ボタンを選んでから [リソース グループ] を選びます。

  2. [任意のフィールドのフィルター] というテキストが表示されているボックスに、前に作成したリソース グループの最初の数文字を入力します。 推奨される方法に従った場合は、名前のイニシャルを入力してから、適切なリソース グループを選択します。

  3. リソース グループ内のリソースの一覧で、その [種類] 値が [コンテナー レジストリ] のリソースを選択します。

  4. ナビゲーション ウィンドウで、[設定][アクセス キー] を選択します。

  5. [ログイン サーバー][レジストリ名][ユーザー名][パスワード] の値を保存します。 各フィールドの横にあるコピー アイコンを使用して、システム クリップボードに値をコピーできます。

  6. リソースをデプロイしたリソース グループに戻ります。

  7. [設定] セクションで、[デプロイ] を選択します。

  8. 一覧で最下部のデプロイを選択します。 [デプロイ名] 値は、オファーの発行元 ID と一致します。 それには、文字列 ibm が含まれています。

  9. ナビゲーション ウィンドウで、[出力] を選択します。

  10. 上記の値と同じコピー手法を使用して、次の出力の値を保存します。

    • cmdToConnectToCluster
    • デプロイにアプリケーションが含まれていない場合は appDeploymentTemplateYaml。 つまり、Marketplace オファーをデプロイするときに、[アプリケーションをデプロイしますか?][いいえ] を選択したことになります。
    • デプロイにアプリケーションが含まれている場合は appDeploymentYaml。 つまり、[アプリケーションをデプロイしますか?][はい] を選択したことになります。

    appDeploymentTemplateYaml または appDeploymentYaml の値を Bash シェルに貼り付け、| grep secretName を追加してコマンドを実行します。

    このコマンドの出力結果は、- secretName: secret785e2c などのイングレス TLS シークレット名が出力されます。 secretName 値を保存します。

これらの値は、この記事で後ほど使用します。 出力には、他のいくつかの便利なコマンドが一覧表示されることに注意してください。

Azure SQL Database インスタンスを作成する

アプリで使用する Azure SQL Database の単一データベースを作成するには、「クイックスタート: Azure SQL Database で単一データベースを作成する」の手順に従います。 以下の相違点に特に注意してください。

  • [基本] の手順の [リソース グループ][データベース名]<サーバー名>.database.windows.net[サーバー管理者ログイン][パスワード] の値をメモします。 この記事では、データベース リソース グループ値を <db-resource-group> とします。

  • [ネットワーク] の手順の [接続方法][パブリック エンドポイント] に、[Azure サービスおよびリソースにこのサーバーへのアクセスを許可する][はい] に、[現在のクライアント IP アドレスを追加する][はい] に設定します。

    [接続方法] と [ファイアウォール規則] の設定が強調表示された [SQL データベースの作成] ページの [ネットワーク] タブを示す Azure portal のスクリーンショット。

Note

このデータベースに対して選んだサーバーレス コンピューティング レベルでは、非アクティブな期間中にデータベースをスリープ状態にすることでコストを節約できます。 アプリの起動時にデータベースがスリープ状態になると、サンプル アプリは失敗します。

データベースを強制的にウェイクアップするには、クエリ エディターを使用してクエリを実行します。 データベースのクエリに関する記事の手順に従います。 クエリの例を次に示します: SELECT * FROM COFFEE;

データベースのリソース グループ名の環境変数をシェルに作成します。

export DB_RESOURCE_GROUP_NAME=<db-resource-group>

データベースと AKS クラスターが作成されたので、Open Liberty アプリケーションをホストするための AKS の準備に進むことができます。

サンプル アプリケーションを構成してデプロイする

このセクションの手順に従って、Liberty ランタイムにサンプル アプリケーションをデプロイします。 これらの手順では、Maven を使用します。

アプリケーションをチェックアウトする

この記事のサンプル コードをクローンします。 サンプルは GitHub にあります。

リポジトリにはいくつかのサンプルがあります。 この記事では、java-app/ を使用します。 次のコマンドを実行して、これらのサンプルを取得します。

git clone https://github.com/Azure-Samples/open-liberty-on-aks.git
cd open-liberty-on-aks
export BASE_DIR=$PWD
git checkout 20240220

HEAD がデタッチされた状態であることを示すメッセージが表示された場合、このメッセージは無視しても問題ありません。 このメッセージは、タグをチェックアウトしたことを意味します。

アプリケーションのファイル構造を次に示します。

java-app
├─ src/main/
│  ├─ aks/
│  │  ├─ db-secret.yaml
│  │  ├─ openlibertyapplication-agic.yaml
│  │  ├─ openlibertyapplication.yaml
│  │  ├─ webspherelibertyapplication-agic.yaml
│  │  ├─ webspherelibertyapplication.yaml
│  ├─ docker/
│  │  ├─ Dockerfile
│  │  ├─ Dockerfile-wlp
│  ├─ liberty/config/
│  │  ├─ server.xml
│  ├─ java/
│  ├─ resources/
│  ├─ webapp/
├─ pom.xml

javaresources、および webapp ディレクトリには、サンプル アプリケーションのソース コードが含まれています。 このコードでは、jdbc/JavaEECafeDB という名前のデータ ソースを宣言して使用します。

aks ディレクトリには、5 つのデプロイ ファイルがあります。

  • db-secret.xml: このファイルを使用して、データベース接続資格情報を使用して Kubernetes シークレットを作成します。
  • openlibertyapplication-agic.yaml: このファイルは、AGIC を使用して Open Liberty アプリケーションをデプロイする場合に使用します。 この記事では、このファイルを使用することを前提としています。
  • openlibertyapplication-agic.yaml: このファイルは、AGIC を使用せずに Open Liberty アプリケーションをデプロイする場合に使用します。
  • webspherelibertyapplication-agic.yaml: この記事の前半で WebSphere Liberty Operator をデプロイした場合は、AGIC を使用して WebSphere Liberty アプリケーションをデプロイするには、このファイルを使用します。
  • webspherelibertyapplication.yaml: この記事の前半で WebSphere Liberty Operator をデプロイした場合は、AGIC を使用せずに WebSphere Liberty アプリケーションをデプロイするには、このファイルを使用します。

docker ディレクトリには、アプリケーション イメージを作成するための 2 つのファイルがあります。

  • Dockerfile: この記事の Open Liberty を使用してアプリケーション イメージをビルドする場合は、このファイルを使用します。
  • Dockerfile-wlp: この記事の前半で WebSphere Liberty Operator をデプロイした場合は、WebSphere Liberty を使用してアプリケーション イメージをビルドするには、このファイルを使用します。

liberty/config ディレクトリでは、server.xml ファイルを使用して、Open Liberty および WebSphere Liberty クラスターのデータベース接続を構成します。

プロジェクトをビルドする

これで必要なプロパティが揃ったので、アプリケーションをビルドできます。 プロジェクトの POM ファイルにより、環境から多くの変数が読み取られます。 Maven ビルドの一部として、これらの変数は src/main/aks にある YAML ファイルの値を設定するために使用されます。 必要に応じて、Maven の外部でアプリケーションに対して同様の操作を行うことができます。

cd $BASE_DIR/java-app
# The following variables are used for deployment file generation into the target.
export LOGIN_SERVER=<Azure-Container-Registry-Login-Server-URL>
export REGISTRY_NAME=<Azure-Container-Registry-name>
export USER_NAME=<Azure-Container-Registry-username>
export PASSWORD='<Azure-Container-Registry-password>'
export DB_SERVER_NAME=<server-name>.database.windows.net
export DB_NAME=<database-name>
export DB_USER=<server-admin-login>@<server-name>
export DB_PASSWORD='<server-admin-password>'
export INGRESS_TLS_SECRET=<ingress-TLS-secret-name>

mvn clean install

(省略可能) プロジェクトをローカルでテストする

Azure にデプロイする前にプロジェクトをローカルで実行してテストします。 便宜上、この記事では liberty-maven-plugin を使用します。 liberty-maven-plugin の詳細については、Open Liberty の記事「Maven を使用した Web アプリケーションの構築」を参照してください。

アプリケーションでは、ローカル開発環境などの他のメカニズムを使用して、同様の操作を行うことができます。 コンテナーでの開発を目的とした liberty:devc オプションの使用を検討することもできます。 liberty:devc の詳細については、「Open Liberty のドキュメント」を参照してください。

  1. liberty:run を使用してアプリケーションを起動します。 liberty:run では、前に定義した環境変数も使用されます。

    cd $BASE_DIR/java-app
    mvn liberty:run
    
  2. テストが成功すると、コマンド出力に [INFO] [AUDIT] CWWKZ0003I: The application javaee-cafe updated in 1.930 seconds と同様のメッセージが表示されます。 ブラウザーで http://localhost:9080/ にアクセスし、アプリケーションがアクセス可能で、すべての機能が動作していることを確認します。

  3. Ctrl+C キーを選択して停止します。

AKS デプロイのイメージをビルドする

docker build コマンドを実行してイメージをビルドできるようになりました。

cd $BASE_DIR/java-app/target

docker buildx build --platform linux/amd64 -t javaee-cafe:v1 --pull --file=Dockerfile .

(省略可能) Docker イメージをローカルでテストする

次の手順を使用して、Azure にデプロイする前に Docker イメージをローカルでテストします。

  1. 次のコマンドを使ってイメージを実行します。 このコマンドでは、前に定義した環境変数が使用されます。

    docker run -it --rm -p 9080:9080 \
       -e DB_SERVER_NAME=${DB_SERVER_NAME} \
       -e DB_NAME=${DB_NAME} \
       -e DB_USER=${DB_USER} \
       -e DB_PASSWORD=${DB_PASSWORD} \
       javaee-cafe:v1
    
  2. コンテナーが起動した後、ブラウザーで http://localhost:9080/ に移動してアプリケーションにアクセスします。

  3. Ctrl+C キーを選択して停止します。

Azure Container Registry にイメージをアップロードする

オファーで作成した Container Registry インスタンスにビルドされたイメージをアップロードします。

docker tag javaee-cafe:v1 ${LOGIN_SERVER}/javaee-cafe:v1
docker login -u ${USER_NAME} -p ${PASSWORD} ${LOGIN_SERVER}
docker push ${LOGIN_SERVER}/javaee-cafe:v1

アプリの配置およびテスト

次の手順を使用して、アプリケーションをデプロイしてテストします。

  1. AKS クラスターに接続します。

    シェルに cmdToConnectToCluster の値を貼り付けて、コマンドを実行します。

  2. データベース シークレットを適用します。

    cd $BASE_DIR/java-app/target
    kubectl apply -f db-secret.yaml
    

    出力は secret/db-secret-sql created になります。

  3. デプロイ ファイルを適用します。

    kubectl apply -f openlibertyapplication-agic.yaml
    
  4. 次のコマンドを使用して、すべてのポッドが正常に再起動されるまで待ちます。

    kubectl get pods --watch
    

    次の例のような出力は、すべてのポッドが実行されていることを示しています。

    NAME                                       READY   STATUS    RESTARTS   AGE
    javaee-cafe-cluster-agic-67cdc95bc-2j2gr   1/1     Running   0          29s
    javaee-cafe-cluster-agic-67cdc95bc-fgtt8   1/1     Running   0          29s
    javaee-cafe-cluster-agic-67cdc95bc-h47qm   1/1     Running   0          29s
    
  5. 結果を確認します。

    1. アプリケーションと共にデプロイされたイングレス リソースのアドレスを取得します。

      kubectl get ingress
      

      出力からの ADDRESS の値をコピーする。 この値は、デプロイされた Application Gateway インスタンスのフロントエンド パブリック IP アドレスです。

    2. https://<ADDRESS> にアクセスして、アプリケーションをテストします。 便宜のため、このシェル コマンドでは、ブラウザーに直接貼り付けることができる値を含む環境変数が作成されます。

      export APP_URL=https://$(kubectl get ingress | grep javaee-cafe-cluster-agic-ingress | cut -d " " -f14)/
      echo $APP_URL
      

      Web ページが正しくレンダリングされない場合、または 502 Bad Gateway エラーが返された場合は、アプリがまだバックグラウンドで開始されています。 数分待ってから操作をやり直してください。

リソースをクリーンアップする

Azure の課金を回避するには、不要なリソースをクリーンアップする必要があります。 クラスターが不要になったら、az group delete コマンドを使用して、リソース グループ、コンテナー サービス、コンテナー レジストリ、データベースおよびすべての関連リソースを削除します。

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

次のステップ

次のリファレンスで詳細を確認できます。