Azure Kubernetes Service クラスターに Quarkus を使用する Java アプリケーションをデプロイする
この記事では、シンプルな CRUD アプリケーションを使用して Red Hat Quarkus を Azure Kubernetes Service (AKS) に迅速にデプロイする方法を示します。 このアプリケーションは、JavaScript フロントエンドと REST エンドポイントを備えた "To Do リスト" です。 Azure Database for PostgreSQL フレキシブル サーバーは、アプリの永続化レイヤーを提供します。 この記事では、アプリをローカルでテストし、AKS にデプロイする方法を示します。
前提条件
- Azure サブスクリプションをお持ちでない場合は、開始する前に Azure 無料アカウントを作成してください。
- Unix 系オペレーティング システム (Ubuntu、macOS、または Linux 用 Windows サブシステムなど) がインストールされているローカル マシンを準備します。
- Java SE 実装バージョン 17 以降 (たとえば、OpenJDK の Microsoft ビルド) をインストールします。
- Maven バージョン 3.9.8 以降をインストールします。
- お使いの OS 用の Docker をインストールします。
- jq をインストールします。
- cURL をインストールします。
- Quarkus CLI バージョン 3.12.1 以降をインストールします。
- Unix に似た環境用の Azure CLI。 この記事では、Azure CLI の Bash バリアントのみが必要です。
- この記事では、バージョン 2.61.0 以降の Azure CLI が必要です。
アプリ プロジェクトを作成する
次のコマンドを使って、この記事用のサンプル Java プロジェクトをクローンします。 サンプルは GitHub にあります。
git clone https://github.com/Azure-Samples/quarkus-azure
cd quarkus-azure
git checkout 2024-12-16
cd aks-quarkus
HEAD がデタッチされた状態であることを示すメッセージが表示された場合、このメッセージは無視しても問題ありません。 この記事ではコミットを必要としないため、HEAD がデタッチされた状態が適切です。
Quarkus アプリをローカルでテストする
このセクションの手順では、アプリをローカルで実行する方法を示します。
Quarkus は、開発モードおよびテスト モードでの未構成のサービスの自動プロビジョニングをサポートしています。 Quarkus は、この機能を開発サービスと呼びます。 データベース サービスへの接続などの Quarkus 機能が含まれているとします。 アプリをテストしたいと考えていますが、実際のデータベースへの接続がまだ完全に構成されていません。 Quarkus は、関連するサービスのコンテナー化されたスタブ バージョンを自動的に開始し、アプリケーションをそれに接続します。 詳細については、Quarkus ドキュメントの「Dev Services の概要」を参照してください。
コンテナー環境が実行されていることを確認し、次のコマンドを使用して Quarkus 開発モードに入ります:
quarkus dev
quarkus dev
の代わりに、 mvn quarkus:dev
を使用すると、Maven で同じことを実現できます。
Quarkus 開発モードの使用状況のテレメトリを送信するかどうかを尋ねられる場合があります。 その場合は、好きなように答えてください。
Quarkus 開発モードでは、バックグラウンド コンパイルによるライブ リロードが有効になります。 アプリのソース コードの一部を変更してブラウザーを更新すると、変更内容を確認できます。 コンパイルまたはデプロイに問題がある場合は、エラー ページが表示されます。 Quarkus 開発モードは、ポート 5005 でデバッガーをリッスンします。 デバッガーが接続されるのを待ってから実行する場合は、コマンド ラインで -Dsuspend
を渡します。 デバッガーがまったく不要な場合は、-Ddebug=false
を使用できます。
出力は次の例のようになります。
__ ____ __ _____ ___ __ ____ ______
--/ __ \/ / / / _ | / _ \/ //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
INFO [io.quarkus] (Quarkus Main Thread) quarkus-todo-demo-app-aks 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.2.0.Final) started in 3.377s. Listening on: http://localhost:8080
INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
INFO [io.quarkus] (Quarkus Main Thread) Installed features: [agroal, cdi, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-postgresql, narayana-jta, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, vertx]
--
Tests paused
Press [e] to edit command line args (currently ''), [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>
Quarkus 開発モードが実行されているターミナルで w キーを押します。 w キーを押すとデフォルトの Web ブラウザーが開き、Todo
アプリケーションが表示されます。 http://localhost:8080
にあるアプリケーション GUI に直接アクセスすることもできます。
Todo リストで Todo 項目をいくつか選択してみてください。 UI は取り消し線のテキスト スタイルで選択を示します。 次のスクリーンショットに示すように、「Todo アプリの確認」と入力して Enter キー を押して、新しい Todo 項目を Todo リストに追加することもできます:
RESTful API (/api
) にアクセスして、ローカル PostgreSQL データベースに保存されているすべての ToDo 項目を取得します。
curl --verbose http://localhost:8080/api | jq .
出力は次の例のようになります。
* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /api HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.88.1
> Accept: */*
>
< HTTP/1.1 200 OK
< content-length: 664
< Content-Type: application/json;charset=UTF-8
<
{ [664 bytes data]
100 664 100 664 0 0 13278 0 --:--:-- --:--:-- --:--:-- 15441
* Connection #0 to host localhost left intact
[
{
"id": 1,
"title": "Introduction to Quarkus Todo App",
"completed": false,
"order": 0,
"url": null
},
{
"id": 2,
"title": "Quarkus on Azure App Service",
"completed": false,
"order": 1,
"url": "https://learn.microsoft.com/en-us/azure/developer/java/eclipse-microprofile/deploy-microprofile-quarkus-java-app-with-maven-plugin"
},
{
"id": 3,
"title": "Quarkus on Azure Container Apps",
"completed": false,
"order": 2,
"url": "https://learn.microsoft.com/en-us/training/modules/deploy-java-quarkus-azure-container-app-postgres/"
},
{
"id": 4,
"title": "Quarkus on Azure Functions",
"completed": false,
"order": 3,
"url": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-quarkus"
},
{
"id": 5,
"title": "Verify Todo apps",
"completed": false,
"order": 5,
"url": null
}
]
q キーを押して Quarkus 開発モードを終了します。
Azure リソースを作成して Quarkus アプリを実行する
このセクションの手順では、次の Azure リソースを作成して Quarkus サンプル アプリを実行する方法を示します。
- Azure Database for PostgreSQL フレキシブル サーバー
- Azure Container Registry
- Azure Kubernetes Service (AKS)
Note
この記事では、セキュリティのベスト プラクティスを示すために、PostgreSQL 認証を無効にします。 Microsoft Entra ID は、サーバーへの接続を認証するために使用されます。 PostgreSQL 認証を有効にする必要がある場合は、「クイック スタート: Azure Database for PostgreSQL - フレキシブル サーバーで Java と JDBC を使用する」を確認して、 パスワード タブを選択します。
これらのリソースの一部は、Azure サブスクリプションのスコープ内で一意の名前を持つ必要があります。 この一意性を確保するために、 イニシャル、シーケンス、日付、サフィックス パターンを使用できます。 このパターンを適用するには、イニシャル、シーケンス番号、今日の日付、およびリソース固有のサフィックス (たとえば、"リソース グループ" の場合は rg
) を一覧表示してリソースに名前を付けます。 次の環境変数はこのパターンを使用します。 プレースホルダーの値 UNIQUE_VALUE
、LOCATION
を独自の値に置き換えて、ターミナルで次のコマンドを実行します:
export UNIQUE_VALUE=<your unique value, such as ejb010717>
export RESOURCE_GROUP_NAME=${UNIQUE_VALUE}rg
export LOCATION=<your desired Azure region for deploying your resources - for example, northeurope>
export REGISTRY_NAME=${UNIQUE_VALUE}reg
export DB_SERVER_NAME=${UNIQUE_VALUE}db
export DB_NAME=demodb
export CLUSTER_NAME=${UNIQUE_VALUE}aks
export AKS_NS=${UNIQUE_VALUE}ns
Azure Database for PostgreSQL フレキシブル サーバーを作成する
Azure Database for PostgreSQL フレキシブル サーバーは、データベース管理機能と構成設定のよりきめ細かな制御と柔軟性を提供するように設計されたフル マネージド データベース サービスです。 このセクションでは、Azure CLI を使用して Azure Database for PostgreSQL フレキシブル サーバー インスタンスを作成する方法について説明します。
まず、次のコマンドを使用して、データベース サーバーとその他のリソースを含むリソース グループを作成します。
az group create \
--name $RESOURCE_GROUP_NAME \
--location $LOCATION
次に、Azure Database for PostgreSQL フレキシブル サーバー インスタンスを次のコマンドを使用して作成します。
az postgres flexible-server create \
--name $DB_SERVER_NAME \
--database-name $DB_NAME \
--resource-group $RESOURCE_GROUP_NAME \
--location $LOCATION \
--public-access 0.0.0.0 \
--sku-name Standard_B1ms \
--tier Burstable \
--active-directory-auth Enabled \
--yes
サーバー、データベース、管理者ユーザー、ファイアウォール規則の作成には数分かかります。 コマンドが成功した場合、出力は次の例のようになります。
{
"connectionString": "postgresql://REDACTED@ejb011212qdb.postgres.database.azure.com/demodb?sslmode=require",
"databaseName": "demodb",
"firewallName": "AllowAllAzureServicesAndResourcesWithinAzureIps_2024-12-12_14-30-22",
"host": "ejb011212qdb.postgres.database.azure.com",
"id": "/subscriptions/c7844e91-b11d-4a7f-ac6f-996308fbcdb9/resourceGroups/ejb011211sfi/providers/Microsoft.DBforPostgreSQL/flexibleServers/ejb011212qdb",
"location": "East US 2",
"password": "REDACTED",
"resourceGroup": "ejb011211sfi",
"skuname": "Standard_B1ms",
"username": "sorrycamel2",
"version": "16"
}
Azure Database for PostgreSQL フレキシブル サーバーでアプリをローカルでテストします
前のセクションでは、Docker コンテナーとしてプロビジョニングされた PostgreSQL データベースを使用して、開発モードで Quarkus アプリをローカルでテストしました。 次に、Azure Database for PostgreSQL フレキシブル サーバー インスタンスへの接続をローカルでテストします。
まず、次のコマンドを使用して、現在サインインしているユーザーを Microsoft Entra Admin として Azure Database for PostgreSQL フレキシブル サーバー インスタンスに追加します:
ENTRA_ADMIN_NAME=$(az account show --query user.name --output tsv)
az postgres flexible-server ad-admin create \
--resource-group $RESOURCE_GROUP_NAME \
--server-name $DB_SERVER_NAME \
--display-name $ENTRA_ADMIN_NAME \
--object-id $(az ad signed-in-user show --query id --output tsv)
成功すると、プロパティ "type": "Microsoft.DBforPostgreSQL/flexibleServers/administrators"
を含む JSON オブジェクトが出力されます。
次に、以下の手順に従って、ローカル IP アドレスを Azure Database for PostgreSQL フレキシブル サーバー インスタンスのファイアウォール規則に追加します:
Quarkus アプリをローカルで実行するコンピューターのローカル IP アドレスを取得します。 たとえば、https://whatismyipaddress.com にアクセスしてパブリック IP v4 アドレスを取得します。
前の手順で取得したローカル IP アドレスを使用して環境変数を定義します。
export AZ_LOCAL_IP_ADDRESS=<your local IP address>
次のコマンドを実行して、ローカル IP アドレスを Azure Database for PostgreSQL フレキシブル サーバー インスタンスのファイアウォール規則に追加します:
az postgres flexible-server firewall-rule create \ --resource-group $RESOURCE_GROUP_NAME \ --name $DB_SERVER_NAME \ --rule-name $DB_SERVER_NAME-database-allow-local-ip \ --start-ip-address $AZ_LOCAL_IP_ADDRESS \ --end-ip-address $AZ_LOCAL_IP_ADDRESS
次に、前のターミナルで次の環境変数を設定します。 これらの環境変数は、ローカルで実行されている Quarkus アプリから Azure Database for PostgreSQL フレキシブル サーバー インスタンスに接続するために使用されます:
export AZURE_POSTGRESQL_HOST=${DB_SERVER_NAME}.postgres.database.azure.com
export AZURE_POSTGRESQL_PORT=5432
export AZURE_POSTGRESQL_DATABASE=${DB_NAME}
export AZURE_POSTGRESQL_USERNAME=${ENTRA_ADMIN_NAME}
Note
環境変数 AZURE_POSTGRESQL_HOST
、AZURE_POSTGRESQL_PORT
、AZURE_POSTGRESQL_DATABASE
、および AZURE_POSTGRESQL_USERNAME
の値は、前のセクションで説明した src/main/resources/application.properties ファイルで定義されているデータベース構成プロパティによって読み取られます。 これらの値は、この記事の後半で AKS クラスターに Quarkus アプリをデプロイするときに、サービス コネクタ パスワードレス拡張機能を使用して、アプリのランタイムに自動的に挿入されます。
次に、Quarkus アプリをローカルで実行して、Azure Database for PostgreSQL フレキシブル サーバー インスタンスへの接続をテストします。 次のコマンドを使用して、運用モードでアプリを起動します:
quarkus build
java -jar target/quarkus-app/quarkus-run.jar
Note
アプリが ERROR [org.hib.eng.jdb.spi.SqlExceptionHelper] (JPA Startup Thread) Acquisition timeout while waiting for new connection
のようなエラー メッセージで起動できない場合は、多くの場合、ローカル コンピューターのネットワーク設定が原因です。 Azure portal から [現在のクライアント IP アドレスを追加する] を再度選択してみてください。 詳細については、「Azure portal を使用した Azure Database for PostgreSQL - フレキシブル サーバーのファイアウォール規則の作成と管理」の「サーバーの作成後にファイアウォール規則を作成する」セクションを参照してください。 その後、アプリをもう一度実行します。
新しい Web ブラウザーを http://localhost:8080
に開いて、Todo アプリケーションにアクセスします。 開発モードでアプリをローカルで実行したときと同じように、Todo アプリが表示されます。
Azure Container Registry インスタンスの作成
Quarkus はクラウド ネイティブ テクノロジーであるため、Kubernetes で実行されるコンテナーを作成するためのサポートが組み込まれています。 Kubernetes は、実行するコンテナー イメージを見つけるコンテナー レジストリを持つことに完全に依存します。 AKS には、Azure Container Registry のサポートが組み込まれています。
az acr create コマンドを使用して、コンテナー レジストリ インスタンスを作成します。 次の例では、環境変数 ${REGISTRY_NAME}
の値を名前とするコンテナー レジストリ インスタンスを作成します:
az acr create \
--resource-group $RESOURCE_GROUP_NAME \
--location ${LOCATION} \
--name $REGISTRY_NAME \
--sku Basic
しばらくすると、次の行を含む JSON 出力が表示されます。
"provisioningState": "Succeeded",
"publicNetworkAccess": "Enabled",
"resourceGroup": "<YOUR_RESOURCE_GROUP>",
次のコマンドを使用して、Container Registry インスタンスのログイン サーバーを取得します:
export LOGIN_SERVER=$(az acr show \
--name $REGISTRY_NAME \
--query 'loginServer' \
--output tsv)
echo $LOGIN_SERVER
Docker をコンテナー レジストリ インスタンスに接続する
コンテナー レジストリ インスタンスにサインインします。 サインインすると、イメージをプッシュできます。 次のコマンドを使用して、レジストリにサインインします:
az acr login --name $REGISTRY_NAME
コンテナー レジストリ インスタンスに正常にサインインすると、コマンド出力の最後に Login Succeeded
が表示されます。
AKS クラスターの作成
AKS クラスターを作成するには、az aks create コマンドを使用します。 次の例では、環境変数 ${CLUSTER_NAME}
の値を使用した名前のクラスターを 1 つのノードで作成します。 クラスターは、前の手順で作成したコンテナー レジストリ インスタンスに接続されています。 このコマンドは、完了するまでに数分かかります。 クラスターは、マネージド ID が有効になっている状態で開始されます。 この手順は、パスワードレスのデータベース接続に必要です。
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--attach-acr $REGISTRY_NAME \
--node-count 1 \
--generate-ssh-keys \
--enable-managed-identity
数分後、コマンドが完了し、次の出力を含むクラスターに関する情報が JSON 形式で返されます。
"nodeResourceGroup": "MC_<your resource_group_name>_<your cluster name>_<your region>",
"privateFqdn": null,
"provisioningState": "Succeeded",
"resourceGroup": "<your resource group name>",
AKS クラスターに接続する
Kubernetes クラスターを管理するには kubectl
(Kubernetes コマンド ライン クライアント) を使用します。 kubectl
をローカルにインストールするには、次の例に示すように、az aks install-cli コマンドを使用します。
az aks install-cli
kubectl
の詳細については、Kubernetes ドキュメントの「コマンド ライン ツール (kubectl)」を参照してください。
Kubernetes クラスターに接続するように kubectl
を構成するには、次の例に示すように、az aks get-credentials コマンドを使用します。 このコマンドは、資格情報をダウンロードし、それを使用するように Kubernetes CLI を構成します。
az aks get-credentials \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--overwrite-existing \
--admin
成功した出力には、次の例のようなテキストが含まれます。
Merged "ejb010718aks-admin" as current context in /Users/edburns/.kube/config
k
を kubectl
にエイリアスすると便利な場合があります。 その場合は、次のコマンドを使用します:
alias k=kubectl
クラスターへの接続を確認するには、次の例に示すように、kubectl get
コマンドを使用してクラスター ノードの一覧を返します。
kubectl get nodes
次の出力例は、前の手順で作成した単一ノードを示しています。 ノードの状態が "準備完了" であることを確認します。
NAME STATUS ROLES AGE VERSION
aks-nodepool1-xxxxxxxx-yyyyyyyyyy Ready agent 76s v1.28.9
AKS で新しい名前空間を作成する
次のコマンドを使用して、Quarkus アプリの Kubernetes サービスに新しい名前空間を作成します。
kubectl create namespace ${AKS_NS}
出力は次の例のようになります。
namespace/<your namespace> created
Service Connector を使用して AKS でサービス接続を作成する
このセクションでは、Microsoft Entra ワークロード ID と Service Connector を使用して、AKS クラスターと Azure Database for PostgreSQL フレキシブル サーバーの間にサービス接続を作成します。 この接続により、AKS クラスターは SQL 認証を使用せずに Azure Database for PostgreSQL フレキシブル サーバーにアクセスできます。
次のコマンドを実行して、Microsoft Entra ワークロード ID と Service Connector を使用して、AKS クラスターと PostgreSQL データベースの間の接続を作成します:
# Register the Service Connector and Kubernetes Configuration resource providers
az provider register --namespace Microsoft.ServiceLinker --wait
az provider register --namespace Microsoft.KubernetesConfiguration --wait
# Install the Service Connector passwordless extension
az extension add --name serviceconnector-passwordless --upgrade --allow-preview true
# Retrieve the AKS cluster and Azure SQL Server resource IDs
export AKS_CLUSTER_RESOURCE_ID=$(az aks show \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--query id \
--output tsv)
export AZURE_POSTGRESQL_RESOURCE_ID=$(az postgres flexible-server show \
--resource-group $RESOURCE_GROUP_NAME \
--name $DB_SERVER_NAME \
--query id \
--output tsv)
# Create a user-assigned managed identity used for workload identity
export USER_ASSIGNED_IDENTITY_NAME=workload-identity-uami
az identity create \
--resource-group ${RESOURCE_GROUP_NAME} \
--name ${USER_ASSIGNED_IDENTITY_NAME}
# Retrieve the user-assigned managed identity resource ID
export UAMI_RESOURCE_ID=$(az identity show \
--resource-group ${RESOURCE_GROUP_NAME} \
--name ${USER_ASSIGNED_IDENTITY_NAME} \
--query id \
--output tsv)
# Create a service connection between your AKS cluster and your PostgreSQL database using Microsoft Entra Workload ID
az aks connection create postgres-flexible \
--connection akspostgresconn \
--kube-namespace $AKS_NS \
--source-id $AKS_CLUSTER_RESOURCE_ID \
--target-id $AZURE_POSTGRESQL_RESOURCE_ID/databases/$DB_NAME \
--workload-identity $UAMI_RESOURCE_ID
前の手順の最後のコマンドからの出力に次の JSON が存在することは、サービス コネクタが正常にインストールされたことを示しています:
"name": "akspostgresconn",
"provisioningState": "Succeeded",
Note
ユーザー名/パスワード認証を使用せずに Azure Database for PostgreSQL フレキシブル サーバーに安全にアクセスするには、Microsoft Entra ワークロード ID を使用することをお勧めします。 ユーザー名/パスワード認証を使用する必要がある場合は、このセクションのこれまでの手順を無視し、ユーザー名とパスワードを使用してデータベースに接続します。
Service Connector によって作成されたサービス アカウントとシークレットを取得する
Azure Database for PostgreSQL フレキシブル サーバーに対して認証を行うには、Service Connector によって作成されたサービス アカウントと Kubernetes シークレットを取得する必要があります。 「チュートリアル: AKS アプリを Azure SQL Database に接続する」の「コンテナーの更新」セクションの手順に従ってください。 提供されている YAML サンプル コード スニペットを使用してデプロイを直接作成する というオプションを採用して、以下の手順を使用します:
サンプルの Kubernetes デプロイ YAML の強調表示されたセクションから、次の例では
<service-account-name>
と<secret-name>
と表されているserviceAccountName
とsecretRef.name
の値をコピーします:serviceAccountName: <service-account-name> containers: - name: raw-linux envFrom: - secretRef: name: <secret-name>
これらの値は、次のセクションで、Quarkus アプリケーションを AKS クラスターにデプロイするために使用します。
クラウド ネイティブ構成をカスタマイズする
Quarkus は、クラウド ネイティブ テクノロジーとして、標準の Kubernetes、Red Hat OpenShift、Knative のリソースを自動的に構成する機能を提供します。 詳細については、「Quarkus Kubernetes ガイド」、「Quarkus OpenShift ガイド」、「Quarkus Knative ガイド」を参照してください。 開発者は、生成されたマニフェストを適用することで、アプリケーションをターゲットの Kubernetes クラスターにデプロイできます。
適切な Kubernetes リソースを生成するには、次のコマンドを使用して、ローカル ターミナルに quarkus-kubernetes
および container-image-jib
の拡張機能を追加します。
quarkus ext add kubernetes container-image-jib
Quarkus は、これらの拡張機能が <dependencies>
として一覧表示されるように POM を変更します。 JBang
と呼ばれるものをインストールするように求められたら、「はい」と答えてインストールを許可します。
出力は次の例のようになります。
[SUCCESS] ✅ Extension io.quarkus:quarkus-kubernetes has been installed
[SUCCESS] ✅ Extension io.quarkus:quarkus-container-image-jib has been installed
拡張機能が追加されたことを確認するには、git diff
を実行して出力を調べます。
Quarkus はクラウド ネイティブ テクノロジーとして、構成プロファイルの概念をサポートしています。 Quarkus には、次の 3 つの組み込みプロファイルがあります。
dev
- 開発モードのときにアクティブ化されますtest
- テストの実行時にアクティブ化されますprod
- 開発モードまたはテストモードで実行されていないときの既定のプロファイル
Quarkus は、必要に応じて、任意の数の名前付きプロファイルをサポートします。
このセクションの残りの手順では、src/main/resources/application.properties ファイルの値をカスタマイズする方法を説明します。
prod.
プレフィックスは、 prod
プロファイルでの実行時にこれらのプロパティがアクティブであることを示します。 構成プロファイルの詳細については、Quarkus のドキュメントを参照してください。
データベース構成
次のデータベース構成変数を確認します。 データベース接続関連のプロパティ %prod.quarkus.datasource.jdbc.url
、%prod.quarkus.datasource.username
は、それぞれ環境変数 AZURE_POSTGRESQL_HOST
、AZURE_POSTGRESQL_PORT
、AZURE_POSTGRESQL_DATABASE
、AZURE_POSTGRESQL_USERNAME
から値を読み取ります。 これらの環境変数は、データベース接続情報を格納するシークレット値にマップされます。 これらは、セキュリティ上の理由から、この記事の他の場所に示すように、Service Connector パスワードレス拡張機能を使用して自動生成されます。
# Database configurations
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://${AZURE_POSTGRESQL_HOST}:${AZURE_POSTGRESQL_PORT}/${AZURE_POSTGRESQL_DATABASE}?\
authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\
&sslmode=require
%prod.quarkus.datasource.username=${AZURE_POSTGRESQL_USERNAME}
%prod.quarkus.datasource.jdbc.acquisition-timeout=10
%prod.quarkus.hibernate-orm.database.generation=drop-and-create
%prod.quarkus.hibernate-orm.sql-load-script=import.sql
Kubernetes の構成
次の Kubernetes 構成変数を確認します。 アプリに外部からアクセスするために、service-type
は load-balancer
に設定されます。 <service-account-name>
と <secret-name>
の値を、前のセクションでコピーした実際の値に置き換えます。
# Kubernetes configurations
%prod.quarkus.kubernetes.deployment-target=kubernetes
%prod.quarkus.kubernetes.service-type=load-balancer
%prod.quarkus.kubernetes.labels."azure.workload.identity/use"=true
%prod.quarkus.kubernetes.service-account=<service-account-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_CLIENT_ID.from-secret=<secret-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_CLIENT_ID.with-key=AZURE_POSTGRESQL_CLIENTID
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_HOST.from-secret=<secret-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_HOST.with-key=AZURE_POSTGRESQL_HOST
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_PORT.from-secret=<secret-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_PORT.with-key=AZURE_POSTGRESQL_PORT
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_DATABASE.from-secret=<secret-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_DATABASE.with-key=AZURE_POSTGRESQL_DATABASE
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_USERNAME.from-secret=<secret-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_USERNAME.with-key=AZURE_POSTGRESQL_USERNAME
他の Kubernetes 構成では、Quarkus アプリケーションの環境変数へのシークレット値のマッピングを指定します。 <secret-name>
シークレットにはデータベース接続情報が含まれています。 シークレット内の AZURE_POSTGRESQL_CLIENTID
、AZURE_POSTGRESQL_HOST
、AZURE_POSTGRESQL_PORT
、AZURE_POSTGRESQL_DATABASE
、AZURE_POSTGRESQL_USERNAME
キーは、それぞれ AZURE_CLIENT_ID
、AZURE_POSTGRESQL_HOST
、AZURE_POSTGRESQL_PORT
、AZURE_POSTGRESQL_DATABASE
、AZURE_POSTGRESQL_USERNAME
環境変数にマップされます。
kubectl を使用してシークレットを直接調べるには、次の例のようなコマンドを使用します:
kubectl -n ${AKS_NS} get secret <secret-name> -o jsonpath="{.data.AZURE_POSTGRESQL_USERNAME}" | base64 --decode
コンテナー イメージの構成
Quarkus は、クラウド ネイティブ テクノロジとして、Docker と互換性のある OCI コンテナー イメージの生成をサポートしています。 <LOGIN_SERVER_VALUE>
の値を、${LOGIN_SERVER}
環境変数の実際の値に置き換えます。
# Container Image Build
%prod.quarkus.container-image.build=true
%prod.quarkus.container-image.image=<LOGIN_SERVER_VALUE>/todo-quarkus-aks:1.0
最後のチェックとして、application.properties で必要なすべての置換を完了したときに、<
文字が出現していないことを確認します。 存在する場合は、必要なすべての置換が完了していることを再確認します。
コンテナー イメージをビルドしてコンテナー レジストリにプッシュする
次に、次のコマンドを使用してアプリケーション自体をビルドします。 このコマンドは、Kubernetes および Jib 拡張機能を使用してコンテナー イメージを構築します。
quarkus build --no-tests
出力は BUILD SUCCESS
で終わる必要があります。 次の例に示すように、Kubernetes マニフェスト ファイルは target/kubernetes に生成されます。
tree target/kubernetes
target/kubernetes
├── kubernetes.json
└── kubernetes.yml
0 directories, 2 files
docker
コマンド ライン (CLI) を使用して、コンテナー イメージが生成されたかどうかも確認できます。 出力は次の例のようになります。
docker images | grep todo-quarkus-aks
<LOGIN_SERVER_VALUE>/todo-quarkus-aks 1.0 b13c389896b7 18 minutes ago 422MB
次のコマンドを使用して、コンテナ イメージをコンテナー レジストリにプッシュします:
export TODO_QUARKUS_TAG=$(docker images | grep todo-quarkus-aks | head -n1 | cut -d " " -f1)
echo ${TODO_QUARKUS_TAG}
docker push ${TODO_QUARKUS_TAG}:1.0
出力は次の例のようになるはずです。
The push refers to repository [<LOGIN_SERVER_VALUE>/todo-quarkus-aks]
dfd615499b3a: Pushed
56f5cf1aa271: Pushed
4218d39b228e: Pushed
b0538737ed64: Pushed
d13845d85ee5: Pushed
60609ec85f86: Pushed
1.0: digest: sha256:0ffd70d6d5bb3a4621c030df0d22cf1aa13990ca1880664d08967bd5bab1f2b6 size: 1995
アプリをコンテナー レジストリにプッシュしたので、AKS にアプリを実行するように指示できます。
Quarkus アプリを AKS にデプロイする
このセクションの手順では、作成した Azure リソース上で Quarkus サンプル アプリを実行する方法を示します。
kubectl apply を使用して Quarkus アプリを AKS にデプロイする
次の例に示すように、コマンド ラインで kubectl
を使用して Kubernetes リソースをデプロイします。
kubectl apply -f target/kubernetes/kubernetes.yml -n ${AKS_NS}
出力は次の例のようになります。
service/quarkus-todo-demo-app-aks created
deployment.apps/quarkus-todo-demo-app-aks created
次のコマンドを使用して、アプリが実行されていることを確認します。
kubectl -n $AKS_NS get pods
STATUS
フィールドの値が Running
以外を示している場合は、続行する前にトラブルシューティングを行い、問題を解決してください。 次のコマンドを使用してポッド ログを調べると役立つ場合があります:
kubectl -n $AKS_NS logs $(kubectl -n $AKS_NS get pods | grep quarkus-todo-demo-app-aks | cut -d " " -f1)
次のコマンドを使用して、Todo アプリケーションにアクセスするための EXTERNAL-IP
を取得します。
kubectl get svc -n ${AKS_NS}
出力は次の例のようになります。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
quarkus-todo-demo-app-aks LoadBalancer 10.0.236.101 20.12.126.200 80:30963/TCP 37s
次のコマンドを使用して、EXTERNAL-IP
の値を完全修飾 URL として環境変数に保存できます。
export QUARKUS_URL=http://$(kubectl get svc -n ${AKS_NS} | grep quarkus-todo-demo-app-aks | cut -d " " -f10)
echo $QUARKUS_URL
新しい Web ブラウザーを開いて値を ${QUARKUS_URL}
に設定します。 次に、テキスト Deployed the Todo app to AKS
を含む新しい Todo 項目を追加します。 また、Introduction to Quarkus Todo App
項目を完了として選択します。
次の例に示すように、RESTful API (/api
) にアクセスして、Azure PostgreSQL データベースに保存されているすべての ToDo 項目を取得します。
curl --verbose ${QUARKUS_URL}/api | jq .
出力は次の例のようになります。
* Connected to 20.237.68.225 (20.237.68.225) port 80 (#0)
> GET /api HTTP/1.1
> Host: 20.237.68.225
> User-Agent: curl/7.88.1
> Accept: */*
>
< HTTP/1.1 200 OK
< content-length: 828
< Content-Type: application/json;charset=UTF-8
<
[
{
"id": 2,
"title": "Quarkus on Azure App Service",
"completed": false,
"order": 1,
"url": "https://learn.microsoft.com/en-us/azure/developer/java/eclipse-microprofile/deploy-microprofile-quarkus-java-app-with-maven-plugin"
},
{
"id": 3,
"title": "Quarkus on Azure Container Apps",
"completed": false,
"order": 2,
"url": "https://learn.microsoft.com/en-us/training/modules/deploy-java-quarkus-azure-container-app-postgres/"
},
{
"id": 4,
"title": "Quarkus on Azure Functions",
"completed": false,
"order": 3,
"url": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-quarkus"
},
{
"id": 5,
"title": "Deployed the Todo app to AKS",
"completed": false,
"order": 5,
"url": null
},
{
"id": 1,
"title": "Introduction to Quarkus Todo App",
"completed": true,
"order": 0,
"url": null
}
]
データベースが更新されたことを確認する
次のコマンドを実行して、データベースが正しく更新されたことを確認します:
ACCESS_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)
az postgres flexible-server execute \
--admin-user $ENTRA_ADMIN_NAME \
--admin-password $ACCESS_TOKEN \
--name $DB_SERVER_NAME \
--database-name $DB_NAME \
--querytext "select * from todo;"
拡張機能をインストールするように求められたら、 Yと答えます。
出力は次の例のようになり、Todo アプリ GUI と前に実行した curl
コマンドの出力に同じ項目が含まれているはずです:
Successfully connected to <DB_SERVER_NAME>.
Ran Database Query: 'select * from todo;'
Retrieving first 30 rows of query output, if applicable.
Closed the connection to <DB_SERVER_NAME>
[
{
"completed": false,
"id": 2,
"ordering": 1,
"title": "Quarkus on Azure App Service",
"url": "https://learn.microsoft.com/en-us/azure/developer/java/eclipse-microprofile/deploy-microprofile-quarkus-java-app-with-maven-plugin"
},
{
"completed": false,
"id": 3,
"ordering": 2,
"title": "Quarkus on Azure Container Apps",
"url": "https://learn.microsoft.com/en-us/training/modules/deploy-java-quarkus-azure-container-app-postgres/"
},
{
"completed": false,
"id": 4,
"ordering": 3,
"title": "Quarkus on Azure Functions",
"url": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-quarkus"
},
{
"completed": false,
"id": 5,
"ordering": 5,
"title": "Deployed the Todo app to AKS",
"url": null
},
{
"completed": true,
"id": 1,
"ordering": 0,
"title": "Introduction to Quarkus Todo App",
"url": null
}
]
完了したら、次のコマンドを使用して、ローカル IP アドレスが Azure Database for PostgreSQL フレキシブル サーバー インスタンスにアクセスできるようにするファイアウォール規則を削除します:
az postgres flexible-server firewall-rule delete \
--resource-group $RESOURCE_GROUP_NAME \
--name $DB_SERVER_NAME \
--rule-name $DB_SERVER_NAME-database-allow-local-ip \
--yes
リソースをクリーンアップする
Azure の課金を回避するには、不要なリソースをクリーンアップする必要があります。 クラスターが必要なくなったら、 az group delete コマンドを使って、リソース グループ、コンテナー サービス、コンテナー レジストリ、およびすべての関連リソースを削除してください。
git reset --hard
docker rmi ${TODO_QUARKUS_TAG}:1.0
docker rmi postgres
az identity delete --ids ${UAMI_RESOURCE_ID}
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait
docker rmi
を使用して、Quarkus 開発モードによって生成されたコンテナー イメージ postgres
および testcontainers
を削除することもできます。
次のステップ
Azure Kubernetes Service