Spring Boot アプリケーションを Azure Kubernetes Service にデプロイする
メモ
Spring Boot アプリケーションの場合は、Azure Container Apps を使用することをお勧めします。 ただし、Azure Kubernetes Service を宛先として使用することもできます。 詳細については、「Java アプリケーションをデプロイするために適切な Azure サービスを選択する」を参照してください 。
このチュートリアルでは、Kubernetes と Docker を組み合わせて Spring Boot アプリケーションを開発し、Microsoft Azure にデプロイする方法について説明します。 具体的には、Spring Boot をアプリケーション開発に使用し、コンテナーのデプロイに Kubernetes を し、アプリケーションをホストするために Azure Kubernetes Service (AKS) を します。
Kubernetes と Docker は、開発者が、コンテナーで実行されるアプリケーションのデプロイ、スケーリング、管理を自動化できるよう支援するオープン ソース ソリューションです。
前提条件
- Azure サブスクリプション。Azure サブスクリプションをまだお持ちでない場合は、MSDN サブスクライバーの特典を有効にするか、または無料の Azure アカウントにサインアップできます。
- Azure コマンド ライン インターフェイス (CLI)。
- サポートされている Java Development Kit (JDK)。 Azure での開発時に使用可能な JDK の詳細については、「Java の Azure および Azure Stack に関するサポート」 を参照してください。
- Apache の Maven 構築ツール (バージョン 3)。
- Git クライアント。
- Docker クライアント。
- ACR Docker 資格情報ヘルパー。
メモ
このチュートリアルには仮想化要件があるため、仮想マシンでこの記事の手順を実行することはできません。仮想化機能を有効にした物理コンピューターを使用する必要があります。
Spring Boot on Docker Getting Started Web アプリを作成する
次の手順で、Spring Boot Web アプリケーションをビルドしてローカルでテストします。
コマンド プロンプトを開き、アプリケーションを保持するためのローカル ディレクトリを作成して、そのディレクトリに変更します。次に例を示します。
mkdir C:\SpringBoot cd C:\SpringBoot
-- または --
mkdir /users/$USER/SpringBoot cd /users/$USER/SpringBoot
Docker での Spring Boot の使用開始 サンプル プロジェクトを、ディレクトリに複製します。
git clone https://github.com/spring-guides/gs-spring-boot-docker.git
完成したプロジェクトにディレクトリを変更します。
cd gs-spring-boot-docker cd complete
Maven を使用してサンプル アプリをビルドして実行します。
mvn package spring-boot:run
Web アプリをテストするには、
http://localhost:8080
を参照するか、次のcurl
コマンドを使用します。curl http://localhost:8080
次のメッセージが表示されます。Hello Docker World
Azure CLI を使用して Azure Container Registry を作成する
コマンド プロンプトを開きます。
Azure アカウントにログインします。
az login
Azure サブスクリプションを選択します。
az account set -s <YourSubscriptionID>
このチュートリアルで使用する Azure リソースのリソース グループを作成します。
az group create --name=wingtiptoys-kubernetes --location=eastus
リソース グループ内に、プライベートな Azure コンテナー レジストリを作成します。 このチュートリアルでは、後の手順で、このレジストリに Docker イメージとしてサンプル アプリをプッシュします。
wingtiptoysregistry
を、レジストリの一意の名前に置き換えます。az acr create --resource-group wingtiptoys-kubernetes --location eastus \ --name wingtiptoysregistry --sku Basic
Jib を使用してアプリをコンテナー レジストリにプッシュする
Azure CLI から Azure Container Registry にログインします。
# set the default name for Azure Container Registry, otherwise you need to specify the name in "az acr login" az config set defaults.acr=wingtiptoysregistry az acr login
テキストエディターを使用して pom.xml ファイルを開きます。たとえば、Visual Studio Code を使用します。
code pom.xml
<properties>
pom.xml ファイル内の コレクションを、Azure Container Registry のレジストリ名と jib-maven-plugin の最新バージョンで更新します。<properties> <!-- Note: If your ACR name contains upper case characters, be sure to convert them to lower case characters. --> <docker.image.prefix>wingtiptoysregistry.azurecr.io</docker.image.prefix> <jib-maven-plugin.version>2.5.2</jib-maven-plugin.version> <java.version>1.8</java.version> </properties>
以下の例に示すように pom.xml ファイルの
<plugins>
コレクションを更新し、<plugin>
要素にjib-maven-plugin
のエントリが含まれるようにします。 ここでは、Microsoft Container Registry (MCR) の基本イメージ (mcr.microsoft.com/openjdk/jdk:11-ubuntu
) が使用されていることに注目してください。このイメージには、公式にサポートされた Azure 用の JDK が含まれています。 公式にサポートされているJDKを使用したその他の MCRベースイメージについては、「Microsoft Build of OpenJDKのインストール」を参照してください。<plugin> <artifactId>jib-maven-plugin</artifactId> <groupId>com.google.cloud.tools</groupId> <version>${jib-maven-plugin.version}</version> <configuration> <from> <image>mcr.microsoft.com/openjdk/jdk:11-ubuntu</image> </from> <to> <image>${docker.image.prefix}/gs-spring-boot-docker</image> </to> </configuration> </plugin>
Spring Boot アプリケーション用の完了プロジェクト ディレクトリに移動し、次のコマンドを実行してイメージを作成し、そのイメージをレジストリにプッシュします。
az acr login && mvn compile jib:build
メモ
Azure Cli および Azure Container Registry のセキュリティ上の懸念のため、az acr login
によって作成された資格情報の有効期間は 1 時間です。 401 Unauthorized
エラーが発生した場合は、もう一度 az acr login --name <your registry name>
コマンドを実行して、再認証を行うことができます。 Read timed out
エラーが表示された場合は、mvn -Djib.httpTimeout=7200000 jib:dockerBuild
でタイムアウト値を増やすか、-Djib.httpTimeout=0
で無制限のタイムアウトに設定してみてください。
Azure CLI を使用して AKS で Kubernetes クラスターを作成する
Azure Kubernetes Service で Kubernetes クラスターを作成します。 次のコマンドは、
wingtiptoys-kubernetes
リソース グループに Kubernetes クラスターを作成します。クラスター名はwingtiptoys-akscluster
で、Azure Container Registry (ACR)wingtiptoysregistry
がアタッチされ、DNS プレフィックスはwingtiptoys-kubernetes
です。az aks create --resource-group=wingtiptoys-kubernetes --name=wingtiptoys-akscluster \ --attach-acr wingtiptoysregistry \ --dns-name-prefix=wingtiptoys-kubernetes --generate-ssh-keys
このコマンドは、完了するまで時間がかかる場合があります。
Azure CLI を使用して
kubectl
をインストールします。 Kubernetes CLI は/usr/local/bin
にデプロイされるため、Linux ユーザーはこのコマンドの前にsudo
を付けなければならない場合があります。az aks install-cli
クラスター構成情報をダウンロードして、Kubernetes Web インターフェイスと
kubectl
からクラスターを管理できるようにします。az aks get-credentials --resource-group=wingtiptoys-kubernetes --name=wingtiptoys-akscluster
イメージを Kubernetes クラスターにデプロイする
このチュートリアルでは、kubectl
を使用してアプリをデプロイします。これにより、Kubernetes Web インターフェイスを介してデプロイを調べることができます。
kubectl を使用してデプロイする
コマンド プロンプトを開きます。
kubectl run
コマンドを使用して、Kubernetes クラスターのコンテナーを実行します。 Kubernetes でのアプリのサービス名と完全なイメージ名を指定します。 次に例を示します。kubectl run gs-spring-boot-docker --image=wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest
このコマンドの説明:
コンテナー名
gs-spring-boot-docker
はrun
コマンドの直後に指定します。--image
パラメーターは、wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest
というログインサーバーとイメージ名を指定します。
kubectl expose
コマンドを使用して、Kubernetes クラスターを外部に公開します。 サービス名、アプリにアクセスするために使用される公開 TCP ポート、およびアプリがリッスンする内部ターゲット ポートを指定します。 次に例を示します。kubectl expose pod gs-spring-boot-docker --type=LoadBalancer --port=80 --target-port=8080
このコマンドの説明:
コンテナー名
gs-spring-boot-docker
はexpose pod
コマンドの直後に指定します。--type
パラメーターは、クラスターでロード バランサーを使用することを指定します。--port
パラメーターは、公開 TCP ポートとして 80 を指定します。 このポートでアプリにアクセスします。--target-port
パラメーターは、内部 TCP ポートとして 8080 を指定します。 ロード バランサーは、このポートでアプリに要求を転送します。
クラスターにアプリがデプロイされたら、外部 IP アドレスを照会し、そのアドレスを Web ブラウザーで開きます。
kubectl get services -o=jsonpath='{.items[*].status.loadBalancer.ingress[0].ip}'
Azure でサンプル アプリを参照する
Kubernetes リソース ビューを使用してデプロイする
いずれかのリソース ビュー ([名前空間]、[ワークロード]、[サービスとイングレス]、[ストレージ]、または [構成]) から [追加] を選択します。
Kubernetes リソースビュー
次の YAML を貼り付けます。
apiVersion: apps/v1 kind: Deployment metadata: name: gs-spring-boot-docker spec: replicas: 1 selector: matchLabels: app: gs-spring-boot-docker template: metadata: labels: app: gs-spring-boot-docker spec: containers: - name: gs-spring-boot-docker image: wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest
YAML エディターの下部にある [追加] を選択してアプリケーションをデプロイします。
Kubernetes リソース ビュー
上記と同様に、
Deployment
をデプロイした後、YAML エディターの下部にある [追加] を選択して、次の YAML を使用してService
をデプロイします。apiVersion: v1 kind: Service metadata: name: gs-spring-boot-docker spec: type: LoadBalancer ports: - port: 80 targetPort: 8080 selector: app: gs-spring-boot-docker
YAML ファイルが追加されると、リソース ビューアーに Spring Boot アプリケーションが表示されます。 外部サービスにはリンクされた外部 IP アドレスが含まれているため、ブラウザーでアプリケーションを簡単に表示できます。
外部 IPを選択します。 Spring BootアプリケーションがAzure上で実行されているのが表示されます。
Azure でサンプル アプリを参照する
次のステップ
Spring および Azure の詳細については、Azure ドキュメント センターで引き続き Spring に関するドキュメントをご確認ください。
関連項目
Azure での Spring Boot の使用の詳細については、次の記事を参照してください。
Java での Azure の使用の詳細については、「Java 開発者向けの Azure」および「Azure DevOps と Java の操作」を参照してください。
Visual Studio Code を使用して Java アプリケーションを Kubernetes にデプロイする方法の詳細については、Visual Studio Code Java チュートリアルを参照してください。
Docker サンプル プロジェクトでの Spring Boot の詳細については、Docker での Spring Boot の使用開始に関するページを参照してください。
次のリンクは、Spring Boot アプリケーションの作成に関する追加情報を提供します。
- 単純な Spring Boot アプリケーションの作成の詳細については、Spring Initializr (https://start.spring.io/) を参照してください。
次のリンクは、Azure での Kubernetes の使用に関する追加情報を提供します。
Kubernetes コマンド ライン インターフェイスの使用方法の詳細については、kubectl ユーザー ガイド (https://kubernetes.io/docs/reference/kubectl/) を参照してください。
Kubernetes web サイトには、プライベート レジストリでのイメージの使用に関するさまざまな記事があります。
Azure でカスタム Docker イメージを使用する方法に関するその他の例については、「Azure Web App on Linux 向けのカスタム Docker イメージを使用する」を参照してください。
Azure Kubernetes Service (AKS) で直接 Azure Dev Spaces を使用してコンテナーの実行とデバッグを繰り返す場合の詳細については、「Azure Dev Spaces での Java の使用」を参照してください。