Spring Boot アプリケーションを Azure Kubernetes Service にデプロイする
Note
Spring Boot アプリケーションの場合は、Azure Spring 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 資格情報ヘルパー。
Note
このチュートリアルには仮想化要件があるため、仮想マシンでこの記事の手順を実行することはできません。仮想化機能を有効にした物理コンピューターを使用する必要があります。
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
テキストエディタ(Visual Studio Codeなど)でpom.xmlファイルを開きます。
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>
以下の例に示すように
<plugins>
pom.xml ファイルの コレクションを更新し、<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
Note
Azure Cli および Azure Container Registry のセキュリティ上の懸念のため、az acr login
によって作成された資格情報の有効期間は 1 時間です。 "401 未承認" エラーが発生した場合は、もう一度 az acr login --name <your registry name>
コマンドを実行すれば、再認証を行うことができます。 "読み取りがタイムアウトしました" エラーが表示された場合は、mvn -Djib.httpTimeout=7200000 jib:dockerBuild
でタイムアウトを増やすか、無限タイムアウト用の -Djib.httpTimeout=0
を試すことができます。
Azure CLI を使用して AKS で Kubernetes クラスターを作成する
Azure Kubernetes Service で Kubernetes クラスターを作成します。 次のコマンドでは、kubernetes クラスターを wingtiptoys-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 はsudo
にデプロイされるため、Linux ユーザーはこのコマンドの前に/usr/local/bin
を付けなければならない場合があります。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}'
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 エディターの下部にある [追加] を選択してアプリケーションをデプロイします。
上記と同様に、
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上で実行されているのが表示されます。
次のステップ
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 の使用」を参照してください。