LoginSignup
6
2

More than 1 year has passed since last update.

Azure Kubernetes Service にコンテイナー化したSpring Bootのアプリをデプロイしてみる

Last updated at Posted at 2022-10-07

この記事のゴール

Azure Kubernetes Service (AKS) に Spring Boot Application のdocker コンテナーをデプロイする。

目次

  1. az CLI をインストールする
  2. kubectl CLI をインストールする
  3. リソースグループを作る
  4. Azure Container registry のリソースを作る
  5. Azure Kubernetes Service のリソースを作る
  6. Spring boot REST API のアプリケーションを作る
  7. アプリケーションのdocker イメージを作る
  8. docker イメージを ACS にプッシュする
  9. AKS クラスターに接続する
  10. AKS クラスターにデプロイする
  11. アプリケーションに接続する
  12. おわり

az CLI をインストールする

Azure CLI をインストールする方法

Macの場合

Homebrew

macユーザーはhomebrewを使ってaz CLIをインストールのがおすすめ。上のリンクから homebrew をインストールする。

brew install azure-cli

homebrew がインストールできたら、上のコマンドを実行する。

Windowsの場合

Windows での Azure CLI のインストール

マニュアルでインストール

インストーラーダウンロードリンク

上のダウンロードリンクからインストーラーをダウンロードし、az CLIのインストールを行う。

wingetでインストール

winget install -e --id Microsoft.AzureCLI

Windows 11 または最新の Windows 10場合、 winget コマンドが PowerShell から使えるので、コマンドでも簡単にaz CLIをインストールできる。

az CLI の確認

az --version

上記のコマンドを実行後、 az CLIのヴァージョン情報が取得できていたら、インストールは成功。

az CLI で azure にログインする

az login

上記のコマンドで、azureにazCLIからログインできる。

az account list

ログインが成功したら、上記のコマンドで自分のアカウント情報を確認できる。

kubectl CLI をインストールする

Install Tools

Macの場合

brew install kubectl

kubectlhomebrew を使えば、簡単にインストールできる。

Windowsの場合

Chocolatelyでインストール

Installing Chocolatey

上のリンクから Chocolately をインストールする。

choco install kubernetes-cli

Chocolately のインストールができたら、上記のコマンドで kubectl をインストールする。

kubectl の確認

kubectl version --client --output=yaml

上記のコマンドを実行後、yaml形式でクライアントの情報が取得できていたら、インストールは成功。

リソースグループを作る

Screen_Shot_2022-10-07_at_9.50.36.jpg

Screen_Shot_2022-10-07_at_9.52.30.jpg

Screen_Shot_2022-10-07_at_10.12.51.jpg

Screen_Shot_2022-10-07_at_10.15.12.jpg

Screen_Shot_2022-10-07_at_10.17.44.jpg

Azure Container registry のリソースを作る

クイック スタート:Azure portal を使用して Azure コンテナー レジストリを作成する

Screen_Shot_2022-10-07_at_10.20.51.png

Screen_Shot_2022-10-07_at_10.22.27.jpg

Screen_Shot_2022-10-07_at_10.26.37.jpg

Screen_Shot_2022-10-07_at_10.29.11.jpg

Screen_Shot_2022-10-07_at_10.41.46.jpg

Screen_Shot_2022-10-07_at_10.44.24.jpg

Login Server の値は後で使うため、どこかにメモっておく。 Repositories のセクションで実際にプッシュしたdockerイメージを確認することができる。

Azure Kubernetes Service のリソースを作る

クイック スタート:Azure portal を使用して Azure コンテナー レジストリを作成する

Screen_Shot_2022-10-07_at_10.46.50.jpg

Screen_Shot_2022-10-07_at_10.51.46.jpg

Screen_Shot_2022-10-07_at_11.01.23.jpg

Screen_Shot_2022-10-07_at_11.01.24.jpg

Node size(VM) は一番安いのを選んだ。Scale methodとしてAutoscaleを選んでしまうと、フリープランの場合、 exceeding approved Total Cores quota... などと怒られ、リソースを作る事が出来ないので、Manualを選びNode countを1にする。

Screen_Shot_2022-10-07_at_11.12.10.jpg

Screen_Shot_2022-10-07_at_11.14.58.jpg

Integration セクションで、先程作ったACRを選択しておくと、AKSからACRのイメージをプルする時に、認証エラーに悩まされなくなる。

Screen_Shot_2022-10-07_at_12.11.18.jpg

Screen_Shot_2022-10-07_at_12.21.36.jpg

Screen_Shot_2022-10-07_at_12.25.43.jpg

後で何度か使用するから、AKSの名前をメモっておく。Service and ingress セクションで、AKSに作られたサービス達を確認する事が出来る。アプリケーションの前に立たせるロードバランサーのパブリックIPアドレスも確認できる。

Spring boot REST API のアプリケーションを作る

Spring initializrでSpring Bootプロジェクトを生成する

Spring Initializr

フォルダー階層図

.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── deployaks
    │   │               ├── DeployAksApplication.java
    │   │               └── controller
    │   │                   └── HelloWorldController.java # <- 追加
    │   └── resources
    │       ├── application.yml
    │       ├── static
    │       └── templates
    └── test
        └── java
            └── com
                └── example
                    └── deployaks
                        └── DeployAksApplicationTests.java

今回の記事のメインの目的はAKSにデプロイするすることなので、Spring Bootのアプリケーションの内容はかなり適当。

HelloWorldController.java

package com.example.deployaks.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorld {

    @GetMapping("/hello-world")
    public String helloWorld() {
        return "Hello World";
    }
}

コントローラーは一つだけ。HelloWorldController.java ただ、”Hello World”のテキストを返すだけの、API サーバー。

アプリケーションのdocker イメージを作る

フォルダー階層図

.
├── Dockerfile  # <- 追加
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── deployaks
    │   │               ├── DeployAksApplication.java
    │   │               └── controller
    │   │                   └── HelloWorldController.java
    │   └── resources
    │       ├── application.yml
    │       ├── static
    │       └── templates
    └── test
        └── java
            └── com
                └── example
                    └── deployaks
                        └── DeployAksApplicationTests.java

ルートフォルダーに、Dockerfileを追加。内容は以下を参照。

FROM gradle:jdk17 AS build

ARG BUILD_DIR=/build

COPY . ${BUILD_DIR}
WORKDIR ${BUILD_DIR}

RUN gradle build --no-daemon

FROM openjdk:17.0

RUN mkdir /app

EXPOSE 8080

COPY --from=build "/build/build/libs/deploy-aks-0.0.1-SNAPSHOT.jar" /app/app.jar

ENTRYPOINT ["java", "-jar", "/app/app.jar"]
docker build -t <ACR Login Server>/deployaks:1.0 .

docker イメージを作成する。先程メモっといた、 Login server の値を <ACR Login Server> に代入してコマンドを実効する。一応、ACR の Login server の値は、azure portalの Homeresource groups<Resource Group Namw><ACR Name>OverviewLogin server で確認できる。

注意: M1 mac または arm64 アーキテクチャで、docker イメージをビルドした場合、アーキテクチャーの違いで、AKSにデプロイができない。別途 amd64 アーキテクチャの intel mac、windowsを用意するか、github actions などのパイプラインを使用して、イメージをビルド、レジストリにプッシュするのが良い。やり方は、今回の記事では紹介しない。ごめんね。

docker イメージを ACS にプッシュする

az acr login --name <Container Registry Name>

ACRにaz CLIからログインする。

az acr login --name niceTestACR
Uppercase characters are detected in the registry name. When using its server url in docker commands, to avoid authentication errors, use all lowercase.
Login Succeeded
docker push <ACR Login Server>/deployaks:1.0

あとは先程ビルドしたイメージ名を指定して、ACRにプッシュする。あとタグの付け忘れには注意。

❯ docker push nicetestacr.azurecr.io/deployaks:1.0
The push refers to repository [nicetestacr.azurecr.io/deployaks]
0f006961ecf0: Pushed 
1a52b2c97567: Pushed 
e017d39c755a: Pushed 
03ee828ef0e4: Pushed 
b0d4c4485e7e: Pushed 
1.0: digest: sha256:12e0da0e29344f38bfc7c6ac472530d4dc2be3b92116c2d240b64e4bc2038f8f size: 1373

Screen_Shot_2022-10-07_at_13.57.05.jpg

ACRのRepositories のセクションに行くと、プッシュしたdocker イメージを確認できる。

AKS クラスターに接続する

az account subscription list

上記のコマンドで Subscription ID を確認する。初めてこのコマンドを実行した場合は、extension のインストールを促されるので、 y と答え、速やかにインストールする。

az account set --subscription <Subscriptiomn ID>

取得したSubscription ID を代入してコマンドを実行する。

az aks get-credentials --resource-group <Resource Group Name> --name <AKS Cluster Name>

リソースグループ名と、メモっておいたAKSの名前を代入し、上記のコマンドを実行する事によって、kubectl から、AKS clusterに接続する事が出来るようになる。

kubectl get nodes

AKSで動いているnodeを確認する。

❯ kubectl get nodes
NAME                                STATUS   ROLES   AGE    VERSION
aks-agentpool-38233418-vmss000000   Ready    agent   120m   v1.23.12

AKS クラスターにデプロイする

k8sのマニフェストファイルを作る

.
├── Dockerfile 
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── k8s
│   └── deployaks-app-depl.yml # <- 追加
├── settings.gradle
└── src
    ├── main
    │   ├── java
    │   │   └── com
    │   │       └── example
    │   │           └── deployaks
    │   │               ├── DeployAksApplication.java
    │   │               └── controller
    │   │                   └── HelloWorldController.java
    │   └── resources
    │       ├── application.yml
    │       ├── static
    │       └── templates
    └── test
        └── java
            └── com
                └── example
                    └── deployaks
                        └── DeployAksApplicationTests.java
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployaks-app-depl
spec:
  replicas: 1
  selector:
    matchLabels:
      app: deployaks-app
  template:
    metadata:
      labels:
        app: deployaks-app
    spec:
      containers:
        - name: deployaks-app
          image: __DOCKER_IMAGE__ # sed コマンドで入れ替えるためのトークン

---
apiVersion: v1
kind: Service
metadata:
  name: deployaks-app-loadbalancer
spec:
  type: LoadBalancer
  selector:
    app: deployaks-app
  ports:
    - name: deployaks-port
      protocol: TCP
      port: 80
      targetPort: 8080

k8sのmanifestファイルの内容の説明は割愛する。spec.template.spec.containers.imageの __DOCKER_IMAGE__sed コマンドですり替えを行うためのトークン。

sed "s,__DOCKER_IMAGE__,<ACR Login Server>/deployaks:1.0," k8s/deployaks-app-depl.yml | kubectl apply -f -

Login server の値を <ACR Login Server> に代入して実行する。

sed "s,__DOCKER_IMAGE__,nicetestacr.azurecr.io/deployaks:1.0," k8s/deployaks-app-depl.yml | kubectl apply -f -
deployment.apps/deployaks-app-depl created
service/deployaks-app-loadbalancer created

created と表示されていれば、ひとまずは成功。

kubectl get deployments.apps
❯ kubectl get deployments.apps
NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
deployaks-app-depl   1/1     1            1           77s

実際にデプロイが成功していることを確認。

kubectl get pods
❯ kubectl get pods
NAME                                  READY   STATUS    RESTARTS   AGE
deployaks-app-depl-869c58dd44-cvw5v   1/1     Running   0          91s

podsが無事に作成され、動いていることを確認。

アプリケーションに接続する

kubectl get services
❯ kubectl get services
NAME                         TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
deployaks-app-loadbalancer   LoadBalancer   10.0.145.80   20.27.190.204   80:32702/TCP   3m30s
kubernetes                   ClusterIP      10.0.0.1      <none>          443/TCP        3h27m

サービスを確認して、ロードバランサーの EXTERNAL-IP を確認する。今回の パブリックIPは 20.27.190.204 なので、http://20.27.190.204/hello-world で Spring Boot のアプリケーションにアクセスできる。

Screen Shot 2022-10-07 at 15.45.15.jpg
無事、アプリケーションにアクセスすることができた。

Screen Shot 2022-10-07 at 15.47.56.jpg
ちなみに、azure portal の方からも、EXTERNAL-IP を確認することができる。

おわり

今回の記事では、Azure Kubernetes Service (AKS) に Spring Boot Application のdocker コンテナーをデプロイした。Azure Portal からクリックだけで、k8s cluster を簡単に立ち上げることができるのはとても便利。

Azure Pipelineをつなげて、AKSへのデプロイを自動化していくのも、面白いをと思う。

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2