次の方法で共有


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

この記事では、Azure で Open/WebSphere Liberty を実行するためのステップバイステップの手動ガイダンスを提供します。

具体的には、この記事では次のタスクを実行する方法について説明します。

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

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

AKS への移行を加速する、さらに自動化されたソリューションについては、「Azure Kubernetes Service (AKS) クラスターに Open Liberty または WebSphere Liberty を使用する Java アプリケーションをデプロイする」を参照してください。

Open Liberty の詳細については、Open Liberty プロジェクトのページを参照してください。 IBM WebSphere Liberty の詳細については、WebSphere Liberty の製品ページを参照してください。

この記事は、デプロイをすばやく行うのに役立ちます。 運用環境に移行する前に、Tuning Liberty について調べる必要があります。

WebSphere on Azure ソリューションを開発しているエンジニアリング チームとフィードバックを提供したり、移行シナリオに密接に取り組んだりすることに関心がある場合は、WebSphere の移行に関するこの短いアンケートに記入し、連絡先情報を含めてください。 プログラム マネージャー、アーキテクト、エンジニアのチームは、すぐに連絡を取り、緊密なコラボレーションを開始します。

前提条件

  • Azure サブスクリプション。 Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
  • Windows、macOS または Linux がインストールされたローカル マシンを準備します。
  • Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
  • 初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、「Azure CLI で拡張機能を使用および管理する」を参照してください。
  • az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。 この記事では、バージョン 2.31.0 以上の Azure CLI が必要です。
  • Java Standard Edition (SE) Version 17 以降の実装 (Eclipse Open J9 など) をインストールします。
  • Maven の バージョン 3.5.0 以降をインストールします。
  • お使いの OS 用の Docker をインストールします。
  • Git がインストールされていることを確認します。
  • サブスクリプションで Owner ロールまたは Contributor および User Access Administrator ロールが割り当てられていることを確認してください。 「Azure portal を使用して Azure ロールの割り当てを一覧表示する」の手順に従って、割り当てを確認できます。

Note

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

Azure へのサインイン

まだ行っていない場合は、az login コマンドを使用して Azure サブスクリプションにサインインし、画面上の指示に従います。

az login

Note

PowerShell では、Bash と同様に、ほとんどの Azure CLI コマンドを実行できます。 違いがあるのは、変数を使用する場合だけです。 以降のセクションでは、必要に応じ、異なるタブで相違点に対処します。

複数の Azure テナントがお使いの Azure 資格情報に関連付けられている場合は、サイン インするテナントを指定する必要があります。 そのためには、--tenant オプションを使用します。 たとえば、az login --tenant contoso.onmicrosoft.com のようにします。

リソース グループを作成する

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",

ACR インスタンスに接続する

イメージをプッシュする前に、ACR インスタンスにサインインする必要があります。 次のコマンドを使用して、接続を確認します。

export LOGIN_SERVER=$(az acr show \
    --name $REGISTRY_NAME \
    --query 'loginServer' \
    --output tsv)
export USER_NAME=$(az acr credential show \
    --name $REGISTRY_NAME \
    --query 'username' \
    --output tsv)
export PASSWORD=$(az acr credential show \
    --name $REGISTRY_NAME \
    --query 'passwords[0].value' \
    --output tsv)

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

ACR インスタンスに正常にログインした場合は、コマンド出力の最後に Login Succeeded が表示されます。

AKS クラスターを作成する

AKS クラスターを作成するには、az aks create コマンドを使用します。 次の例では、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

数分後、コマンドが完了し、次の出力を含むクラスターに関する情報が 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 \
    --admin

Note

上記のコマンドは、Kubernetes 構成ファイルの既定の場所 (~/.kube/config) を使用します。 --file を使用して、Kubernetes 構成ファイルに対して別の場所を指定できます。

クラスターへの接続を確認するには、クラスター ノードの一覧を返す kubectl get コマンドを使用します。

kubectl get nodes

次の出力例は、前の手順で作成した単一ノードを示しています。 ノードの状態が "準備完了" であることを確認します。

NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-xxxxxxxx-yyyyyyyyyy   Ready    agent   76s     v1.23.8

Azure SQL Database の作成

このセクションでは、アプリで使用する Azure SQL Database の Single Database を作成します。

クイック スタート: Azure SQL Database の Single Database を作成する」の手順を Azure CLI または PowerShell で実行して、Azure SQL Database の Single Database を作成します。 その記事を読み進んでデータベース サーバーを作成して構成したら、このドキュメントに戻ってください。

  1. クイック スタートの「パラメーターの値を設定する」セクションまで完了したら、Variable block というラベルの付いたコード例のすべての変数 (locationresourceGroupdatabaseserverloginpassword) の値をコピーして保存しておきます。 この記事では、データベース resourceGroup<db-resource-group> を置き換えます。

  2. データベース サーバーを作成したら、Azure portal で新しく作成したサーバーに移動します。 [ネットワーク] ペインの [接続] タブで、[TLS の最小バージョン]TLS 1.0 に設定します。

    SQL データベース ネットワーク TLS 1.0 を構成する画面のスクリーンショット

  3. [ネットワーク] ウィンドウの [パブリック アクセス] タブで、[Azure のサービスとリソースにこのサーバーへのアクセスを許可する] を選択します。

    ファイアウォール規則のスクリーンショット - Azure リソースへのアクセスを許可します。

  4. アプリケーションをローカルでテストする場合は、クライアントの IPv4 アドレスがファイアウォール規則の許可リストに含まれていることを確認します。

    ファイアウォール規則のスクリーンショット - クライアント アクセスを許可します。

  5. ネットワークの変更を保存します。

  6. 次のコマンドを使用して、データベースのリソース グループの名前に環境変数を作成します。

    export DB_RESOURCE_GROUP_NAME=<db-resource-group>
    

データベースと AKS クラスターを作成したので、Liberty をホストするように AKS を準備できます。

Open Liberty オペレーターをインストールする

クラスターを作成して接続したら、Open Liberty オペレーターをインストールします。

次のコマンドを実行して、Open Liberty Operator をインストールします。

# 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

アプリケーション イメージの構成とビルド

AKS クラスターに Liberty アプリケーションをデプロイして実行するには、Open Liberty コンテナー イメージまたは WebSphere Liberty コンテナー イメージを使用して、アプリケーションを Docker イメージとしてコンテナ化します。

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

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

このガイドのサンプル コードをクローンします。 サンプルは GitHub にあります。 リポジトリにはいくつかのサンプルがあります。 この記事ではJava-app を使用します。 アプリケーションのファイル構造を次に示します。

git clone https://github.com/Azure-Samples/open-liberty-on-aks.git
cd open-liberty-on-aks
git checkout 20230830

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

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

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

aks ディレクトリには、2 つのデプロイ ファイルがあります。 db-secret.xml は、データベース接続資格情報を使用して Kubernetes シークレットを作成するために使用されます。 openlibertyapplication.yaml ファイルは、アプリケーション イメージをデプロイするために使用されます。 docker ディレクトリには、Open Liberty または WebSphere Liberty を使用してアプリケーション イメージを作成するための 2 つのファイルがあります。

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

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

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

cd <path-to-your-repo>/java-app

# The following variables are used for deployment file generation into target/
export LOGIN_SERVER=${LOGIN_SERVER}
export REGISTRY_NAME=${REGISTRY_NAME}
export USER_NAME=${USER_NAME}
export PASSWORD=${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>

mvn clean install

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

Azure にデプロイする前にプロジェクトをローカルで実行し、テストできるようになりました。 便宜上、liberty-maven-plugin を使用します。 liberty-maven-plugin の詳細については、「Building a web application with Maven」(Maven での Web アプリケーションのビルド) を参照してください。 アプリケーションでは、ローカル IDE などの他のメカニズムを使用して、同様の操作を行うことができます。 コンテナーでの開発を目的とした liberty:devc オプションの使用を検討することもできます。 liberty:devc の詳細については、Liberty のドキュメントを参照してください。

Note

"サーバーレス" データベースのデプロイを選んだ場合、SQL データベースが一時停止モードになっていないことを確認します。 これを行う方法の 1 つは、「クイックスタート: Azure portal クエリ エディター (プレビュー) を使用して Azure SQL Database のクエリを実行する」で説明されているように、データベース クエリ エディターにログインすることです。

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

    cd <path-to-your-repo>/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 buildx build コマンドを実行して、イメージをビルドできるようになりました。

cd <path-to-your-repo>/java-app/target

# If you are running with Open Liberty
docker buildx --platform linux/amd64 build -t javaee-cafe:v1 --pull --file=Dockerfile .

# If you are running with WebSphere Liberty
docker buildx --platform linux/amd64 build -t javaee-cafe:v1 --pull --file=Dockerfile-wlp .

(省略可能) 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 キーを押して停止します。

イメージを ACR にアップロードする

次に、ビルドしたイメージを前の手順で作成した ACR にアップロードします。

まだ行っていない場合は、次のコマンドを使用してコンテナー レジストリにサインインします。

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

次のコマンドを使用して、コンテナー イメージにタグを付け、プッシュします。

docker tag javaee-cafe:v1 ${LOGIN_SERVER}/javaee-cafe:v1
docker push ${LOGIN_SERVER}/javaee-cafe:v1

アプリケーションを AKS クラスターにデプロイする

次の手順を使用して、AKS クラスターに Liberty アプリケーションをデプロイします。

  1. 次の例に示すように、ACR インスタンスを AKS クラスターにアタッチして、AKS クラスターを認証して ACR インスタンスからイメージをプルするようにします。

    az aks update \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $CLUSTER_NAME \
        --attach-acr $REGISTRY_NAME
    
  2. 次のコマンドを実行して、データベース シークレットとデプロイ ファイルを適用します。

    cd <path-to-your-repo>/java-app/target
    
    # Apply database secret
    kubectl apply -f db-secret.yaml
    
    # Apply deployment file
    kubectl apply -f openlibertyapplication.yaml
    
  3. 次のコマンドを実行して、OpenLibertyApplication インスタンスが作成されたかどうかを確認します。

    kubectl get openlibertyapplication javaee-cafe-cluster
    

    次の例のような出力が表示されます。

    NAME                        IMAGE                                                   EXPOSED   RECONCILED   AGE
    javaee-cafe-cluster         youruniqueacrname.azurecr.io/javaee-cafe:1.0.25         True         59s
    
  4. 次のコマンドを実行して、オペレーターによって作成されたデプロイの準備ができているかどうかを確認します。

    kubectl get deployment javaee-cafe-cluster --watch
    

    次の例のような出力が表示されます。

    NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
    javaee-cafe-cluster         0/3     3            0           20s
    
  5. [READY] 列の下に 3/3 が、[AVAILABLE] 列の下に 3 が表示されるまで待ってから、Ctrl+C キーを使用して kubectl ウォッチ プロセスを停止します。

アプリケーションをテストする

アプリケーションが実行されると、Kubernetes ロード バランサー サービスによってアプリケーション フロント エンドがインターネットに公開されます。 このプロセスの完了にはしばらく時間がかかることがあります。

進行状況を監視するには、次の例に示すように、--watch 引数を指定して kubectl get service コマンドを使用します。

kubectl get service javaee-cafe-cluster --watch

次の例のような出力が表示されます。

NAME                        TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)          AGE
javaee-cafe-cluster         LoadBalancer   10.0.251.169   52.152.189.57   80:31732/TCP     68s

EXTERNAL-IP アドレスがpending から実際のパブリック IP アドレスに変わったら、Ctrl+C キーを使用して kubectl ウォッチ プロセスを停止します。

このセクションの手順と前のセクションの手順の実行の間に時間が経過している場合は、必要に応じてデータベースがアクティブであることを確認します。 データベースの一時停止については、前の注意事項を参照してください。

Web ブラウザーでサービスの外部 IP アドレス (上記の例では 52.152.189.57) を開き、アプリケーションのホーム ページを表示します。 ページが正しく読み込まれない場合は、アプリが起動中であるためです。 しばらく待ってから、ページを更新してください。 ページの左上にアプリケーション レプリカのポッド名が表示されることを確認します。 数分待ってページを最新の情報に更新すると、AKS クラスターによって提供される負荷分散のため、別のポッド名が表示されます。

AKS に正常にデプロイされた Java Liberty アプリケーション。

Note

現在、このアプリケーションは HTTPS を使用していません。 独自の証明書を使用して TLS を有効にすることをお勧めします。 詳細については、「Azure Kubernetes Service のイングレス コントローラーで TLS を使用する」を参照してください。

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

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

次のステップ

このガイドで使用された以下の参考資料から、より多くのことを学習できます。

Azure Cache for Redis を Java アプリに組み込むには、「Redisson Redis クライアントで Java で Azure Cache for Redis を使用する」を参照してください

Azure で WebSphere 製品を実行するオプションについては、「Azure で WebSphere 製品ファミリを実行するためのソリューションとは」を参照してください