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) をそれぞれ使用します。

KubernetesDocker は、開発者が、コンテナーで実行されるアプリケーションのデプロイ、スケーリング、管理を自動化することを支援するオープン ソース ソリューションです。

前提条件

Note

このチュートリアルには仮想化要件があるため、仮想マシンでこの記事の手順を実行することはできません。仮想化機能を有効にした物理コンピューターを使用する必要があります。

Spring Boot on Docker Getting Started Web アプリを作成する

次の手順で、Spring Boot Web アプリケーションをビルドしてローカルでテストします。

  1. コマンド プロンプトを開き、アプリケーションを保持するためのローカル ディレクトリを作成して、そのディレクトリに変更します。次に例を示します。

    mkdir C:\SpringBoot
    cd C:\SpringBoot
    

    -- または --

    mkdir /users/$USER/SpringBoot
    cd /users/$USER/SpringBoot
    
  2. Docker での Spring Boot の使用開始 サンプル プロジェクトを、ディレクトリに複製します。

    git clone https://github.com/spring-guides/gs-spring-boot-docker.git
    
  3. 完成したプロジェクトにディレクトリを変更します。

    cd gs-spring-boot-docker
    cd complete
    
  4. Maven を使用してサンプル アプリをビルドして実行します。

    mvn package spring-boot:run
    
  5. Web アプリをテストするには、 http://localhost:8080 を参照するか、次の curl コマンドを使用します。

    curl http://localhost:8080
    
  6. 次のメッセージが表示されます。Hello Docker World

    サンプル アプリをローカルに参照する

Azure CLI を使用して Azure Container Registry を作成する

  1. コマンド プロンプトを開きます。

  2. Azure アカウントにログインします。

    az login
    
  3. Azure サブスクリプションを選択します。

    az account set -s <YourSubscriptionID>
    
  4. このチュートリアルで使用する Azure リソースのリソース グループを作成します。

    az group create --name=wingtiptoys-kubernetes --location=eastus
    
  5. リソース グループ内に、プライベートな Azure コンテナー レジストリを作成します。 このチュートリアルでは、後の手順で、このレジストリに Docker イメージとしてサンプル アプリをプッシュします。 wingtiptoysregistry を、レジストリの一意の名前に置き換えます。

    az acr create --resource-group wingtiptoys-kubernetes --location eastus \
     --name wingtiptoysregistry --sku Basic
    

Jib を使用してアプリをコンテナー レジストリにプッシュする

  1. 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
    
  2. テキストエディタ(Visual Studio Codeなど)でpom.xmlファイルを開きます。

    code pom.xml
    
  3. <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>
    
  4. 以下の例に示すように <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>
    
  5. 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 クラスターを作成する

  1. 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
    

    このコマンドは、完了するまで時間がかかる場合があります。

  2. Azure CLI を使用して kubectl をインストールします。 Kubernetes CLI は sudo にデプロイされるため、Linux ユーザーはこのコマンドの前に /usr/local/bin を付けなければならない場合があります。

    az aks install-cli
    
  3. クラスター構成情報をダウンロードして、Kubernetes Web インターフェイスと kubectl からクラスターを管理できるようにします。

    az aks get-credentials --resource-group=wingtiptoys-kubernetes --name=wingtiptoys-akscluster
    

イメージを Kubernetes クラスターにデプロイする

このチュートリアルでは、kubectl を使用してアプリをデプロイします。これにより、Kubernetes Web インターフェイスを介してデプロイを調べることができます。

kubectl を使用してデプロイする

  1. コマンド プロンプトを開きます。

  2. kubectl run コマンドを使用して、Kubernetes クラスターのコンテナーを実行します。 Kubernetes でのアプリのサービス名と完全なイメージ名を指定します。 次に例を示します。

    kubectl run gs-spring-boot-docker --image=wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest
    

    このコマンドの説明:

    • コンテナー名 gs-spring-boot-dockerrun コマンドの直後に指定します。

    • --image パラメーターは、結合されたログイン サーバーとイメージの名前を wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest として指定します。

  3. kubectl expose コマンドを使用して、Kubernetes クラスターを外部に公開します。 サービス名、アプリにアクセスするために使用される公開 TCP ポート、およびアプリがリッスンする内部ターゲット ポートを指定します。 次に例を示します。

    kubectl expose pod gs-spring-boot-docker --type=LoadBalancer --port=80 --target-port=8080
    

    このコマンドの説明:

    • コンテナー名 gs-spring-boot-dockerexpose pod コマンドの直後に指定します。

    • --type パラメーターは、クラスターでロード バランサーを使用することを指定します。

    • --port パラメーターは、公開 TCP ポートとして 80 を指定します。 このポートでアプリにアクセスします。

    • --target-port パラメーターは、内部 TCP ポートとして 8080 を指定します。 ロード バランサーは、このポートでアプリに要求を転送します。

  4. クラスターにアプリがデプロイされたら、外部 IP アドレスを照会し、そのアドレスを Web ブラウザーで開きます。

    kubectl get services -o=jsonpath='{.items[*].status.loadBalancer.ingress[0].ip}'
    

    Azure でサンプル アプリを参照する

Kubernetes リソース ビューを使用してデプロイする

  1. いずれかのリソース ビュー ([名前空間]、[ワークロード]、[サービスとイングレス]、[ストレージ]、または [構成]) から [追加] を選択します。

    Kubernetes リソース ビュー。

  2. 次の 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
    
  3. 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
    
  4. YAML ファイルが追加されると、リソース ビューアーに Spring Boot アプリケーションが表示されます。 外部サービスにはリンクされた外部 IP アドレスが含まれているため、ブラウザーでアプリケーションを簡単に表示できます。

    Kubernetes リソース ビュー、サービスの一覧。

    Kubernetes リソース ビュー、サービスの一覧、外部エンドポイントが強調表示されている。

  5. [外部 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 の使用」を参照してください。