この記事のゴール
Azure Kubernetes Service (AKS) に Spring Boot Application のdocker コンテナーをデプロイする。
目次
- az CLI をインストールする
- kubectl CLI をインストールする
- リソースグループを作る
- Azure Container registry のリソースを作る
- Azure Kubernetes Service のリソースを作る
- Spring boot REST API のアプリケーションを作る
- アプリケーションのdocker イメージを作る
- docker イメージを ACS にプッシュする
- AKS クラスターに接続する
- AKS クラスターにデプロイする
- アプリケーションに接続する
- おわり
az CLI をインストールする
Macの場合
macユーザーはhomebrewを使ってaz CLIをインストールのがおすすめ。上のリンクから homebrew
をインストールする。
brew install azure-cli
homebrew
がインストールできたら、上のコマンドを実行する。
Windowsの場合
マニュアルでインストール
上のダウンロードリンクからインストーラーをダウンロードし、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にaz
CLIからログインできる。
az account list
ログインが成功したら、上記のコマンドで自分のアカウント情報を確認できる。
kubectl CLI をインストールする
Macの場合
brew install kubectl
kubectl
も homebrew
を使えば、簡単にインストールできる。
Windowsの場合
Chocolatelyでインストール
上のリンクから Chocolately
をインストールする。
choco install kubernetes-cli
Chocolately
のインストールができたら、上記のコマンドで kubectl
をインストールする。
kubectl の確認
kubectl version --client --output=yaml
上記のコマンドを実行後、yaml形式でクライアントの情報が取得できていたら、インストールは成功。
リソースグループを作る
Azure Container registry のリソースを作る
クイック スタート:Azure portal を使用して Azure コンテナー レジストリを作成する
Login Server
の値は後で使うため、どこかにメモっておく。 Repositories
のセクションで実際にプッシュしたdockerイメージを確認することができる。
Azure Kubernetes Service のリソースを作る
クイック スタート:Azure portal を使用して Azure コンテナー レジストリを作成する
Node size(VM) は一番安いのを選んだ。Scale methodとしてAutoscaleを選んでしまうと、フリープランの場合、 exceeding approved Total Cores quota...
などと怒られ、リソースを作る事が出来ないので、Manualを選びNode countを1にする。
Integration セクションで、先程作ったACRを選択しておくと、AKSからACRのイメージをプルする時に、認証エラーに悩まされなくなる。
後で何度か使用するから、AKSの名前をメモっておく。Service and ingress セクションで、AKSに作られたサービス達を確認する事が出来る。アプリケーションの前に立たせるロードバランサーのパブリックIPアドレスも確認できる。
Spring boot REST API のアプリケーションを作る
Spring initializrでSpring Bootプロジェクトを生成する
フォルダー階層図
.
├── 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の Home
→ resource groups
→ <Resource Group Namw>
→ <ACR Name>
→ Overview
→ Login 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
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 のアプリケーションにアクセスできる。
ちなみに、azure portal の方からも、EXTERNAL-IP を確認することができる。
おわり
今回の記事では、Azure Kubernetes Service (AKS) に Spring Boot Application のdocker コンテナーをデプロイした。Azure Portal からクリックだけで、k8s cluster を簡単に立ち上げることができるのはとても便利。
Azure Pipelineをつなげて、AKSへのデプロイを自動化していくのも、面白いをと思う。