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 は、開発者が、コンテナーで実行されるアプリケーションのデプロイ、スケーリング、管理を自動化できるよう支援するオープン ソース ソリューションです。

前提条件

メモ

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

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. pom.xmlファイルの<properties> コレクションを、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> ファイルの コレクションを更新し、<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
    

メモ

セキュリティ上の理由から、 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 クラスターを作成する

  1. Azure Kubernetes Service で Kubernetes クラスターを作成します。 次のコマンドでは、クラスター名としてwingtiptoys-akscluster、Azure Container Registry (ACR) wingtiptoysregistryがアタッチされ、DNS プレフィックスとしてwingtiptoys-kubernetesされた Kubernetes クラスターが、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 をインストールします。 Linux ユーザーは、Kubernetes CLI を /usr/local/bin にデプロイするため、このコマンドの前に sudo を付ける必要がある場合があります。

    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
    

    このコマンドの説明:

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

    • --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
    

    このコマンドの説明:

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

    • --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 リソース ビュー 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を選択します。 Azureで実行されている 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 コマンド ライン インターフェイスの使用の詳細については、https://kubernetes.io/docs/reference/kubectl/の kubectl ユーザー ガイドを参照してください。

Kubernetes web サイトには、プライベート レジストリでのイメージの使用に関するさまざまな記事があります。

Azureでカスタム Docker イメージを使用する方法のその他の例については、「Azure Web App on Linux でのカスタム Docker イメージの使用」を参照してください。

Azure Dev Spaces を使用してAzure Kubernetes Service (AKS)でコンテナーを直接実行およびデバッグする方法の詳細については、「Javaを使用した Azure Dev Spaces の概要」を参照してください。