Spring Boot WEBサービスを AKS (Azure Kubernetes Service) で起動する (Docker Hub カスタムコンテナイメージ)
目的
Spring Boot WEBサービスを Azure Kubernetes Service 環境で起動して理解を深めます。
実現すること
Microsoft Azure Kubernetes Service (AKS) に Spring Boot WEBアプリのカスタムコンテナイメージをデプロイします。
この記事では、Docker Hub にプュシュしたパブリックアクセスのカスタムコンテナイメージを使用しています。 実際のシステムを構築される際にはご注意ください。
Microsoft Azure Container Registry (ACR) を使用した構成の例として、以下の記事もございます。
技術背景
Microsoft Azure Kubernetes Service (AKS) とは?
こちらを展開してご覧いただけます。
Microsoft Azure Kubernetes Service (AKS)
Microsoft Azure Kubernetes Service (AKS) は、Kubernetes クラスタを管理するための Azure のフルマネージドサービスです。
AKS の特徴とメリットはいかのとおりです。
スケーラビリティ
AKS は、需要の変化に合わせてアプリケーションをスケールアップ/ダウンできます。Kubernetes の標準機能を使い、Pod の数を調整することで、クラスタ全体のリソース使用率を最適化できます。
自動化
AKS は、クラスタのデプロイ、アップグレード、監視、スケーリング、および管理に関連するタスクを自動化します。これにより、ユーザーは Kubernetes に関連する複雑なタスクを簡素化できます。
セキュリティ
AKS は、ユーザーが Kubernetes クラスタをセキュアに設定するのに役立ちます。AKS は、構成可能なネットワークポリシー、構成済みのログイン、Role-Based Access Control (RBAC) などをサポートしています。
ポータビリティ
AKS は、クラウドネイティブアプリケーションをどこでも実行できるようにするため、オープンソースの Kubernetes を使用しています。AKS は、Azure の他のサービス、オンプレミス環境、および他のクラウドプロバイダーにデプロイできます。
プロダクションレディ
AKS は、高可用性、監視、スケーラビリティ、およびセキュリティに焦点を当て、プロダクションレディな Kubernetes クラスタを提供します。AKS は、SLA で 99.95% の可用性を提供します。
開発環境
- Windows 11 Home 22H2 を使用しています。
- WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。
WSL (Microsoft Store アプリ版)
> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
Ubuntu
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 22.04.1 LTS
Release: 22.04
Java JDK ※ Java JDK の導入と Hello World!
$ java -version
openjdk version "11.0.17" 2022-10-18
OpenJDK Runtime Environment (build 11.0.17+8-post-Ubuntu-1ubuntu222.04)
OpenJDK 64-Bit Server VM (build 11.0.17+8-post-Ubuntu-1ubuntu222.04, mixed mode, sharing)
Maven ※ Maven の導入と Hello World!
$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.17, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Docker Desktop
Version 4.16.3 (96739)
$ docker --version
Docker version 20.10.22, build 3a2c30b
$ docker-compose --version
Docker Compose version v2.15.1
$ kubectl version --short
Client Version: v1.25.4
Kustomize Version: v4.5.7
Server Version: v1.25.4
※ この記事では基本的に Ubuntu のターミナルで操作を行います。
"Hello World" を表示する手順
Spring Boot WEBサービスの作成
こちらを参照して頂けます。
プロジェクトフォルダに移動
※ ~/tmp/hello-spring-boot をプロジェクトフォルダとします。
$ cd ~/tmp/hello-spring-boot
Java アプリをビルド(※参考)
※ target/app.jar が作成されます。
※ 下の コンテナイメージを作成する操作でも同時に target/app.jar が作成されるので必須ではありません。
$ mvn clean install
コンテナイメージを作成
コンテナイメージをビルド
※ ローカルの Docker 環境 (Docker Desktop) に app-hello-spring-boot コンテナイメージが作成されます。
※ コンテナイメージの作成時間が Unix エポックになるのは spring-boot:build-image の仕様です。
$ mvn spring-boot:build-image \
-Dspring-boot.build-image.imageName=app-hello-spring-boot
コンテナイメージの確認
$ docker images | grep app-hello-spring-boot
app-hello-spring-boot latest e37cc77f2b36 43 years ago 262MB
Docker Hub にコンテナイメージを登録
※ $USER の部分はご自身のコンテナレジストリに読み替えて下さい。
タグ付け
$ docker tag app-hello-spring-boot $USER/app-hello-spring-boot:latest
プュシュ
$ docker push $USER/app-hello-spring-boot:latest
Docker Hub に $USER/app-hello-spring-boot:latest としてカスタムコンテナイメージが公開出来ました。
Azure のアカウントを取得
Azure CLI でサインイン
こちらを参照して頂けます。
ログイン
$ az login
Azure 環境
リソースグループ
リソースグループを作成
$ az group create \
--name rg-hello \
--location japaneast
リソースグループ一覧表示
$ az group list
※ リソースグループを削除する場合
$ az group delete -n <group>
AKS 環境
AKS クラスタの作成
※ Kubernetes 基盤の環境作成に少し時間がかかります。
$ az aks create \
--resource-group rg-hello \
--name aks-hello \
--node-count 1 \
--generate-ssh-keys
AKS クラスタの一覧表示
$ az aks list
※ AKS クラスタを削除する場合
$ az aks delete -n <aks-name> -g <group>
設定ファイルの権限修正 ※初回のみ
$ chmod 600 /home/$USER/.kube/config
AKS クラスタとの接続
※ 既存設定の上書き: yes
$ az aks get-credentials \
--resource-group rg-hello \
--name aks-hello
接続設定が成功した出力
Merged "aks-hello" as current context in /home/$USER/.kube/config
Kubernetes (AKS) 環境
現在の接続先確認
$ kubectl config current-context
aks-hello
接続先のリスト
$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* aks-hello aks-hello clusterUser_rg-hello_aks-hello
docker-desktop docker-desktop docker-desktop
※ 接続先を local (docker-desktop) に戻す場合
$ kubectl config use-context docker-desktop
※ 接続先を削除する場合
$ kubectl config delete-context <context>
接続を確認
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
aks-nodepool1-11584399-vmss000000 Ready agent 4m43s v1.24.9
Kubernetes のマニュフェストを修正
※ $USER の部分はご自身のコンテナレジストリに読み替えて下さい。
$ vim kube-all-in-one.yaml
apiVersion: v1
kind: Service
metadata:
name: app-service
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: app
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
spec:
replicas: 1
selector:
matchLabels:
app: app
template:
metadata:
labels:
app: app
spec:
containers:
- name: app
image: $USER/app-hello-spring-boot:latest
ports:
- containerPort: 8080
デプロイ
※ くれぐれも接続先をご確認下さい。
$ kubectl apply -f kube-all-in-one.yaml
service/app-service created
deployment.apps/app-deployment created
状態確認
$ kubectl get pods,services,deployments
NAME READY STATUS RESTARTS AGE
pod/app-deployment-b876686f6-tzbwk 1/1 Running 0 16s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/app-service LoadBalancer 10.0.125.15 20.210.31.184 80:32304/TCP 16s
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 6m56s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/app-deployment 1/1 1 1 16s
service/app-service の EXTERNAL-IP 20.210.31.184 で外部からアクセス可能
WEBブラウザで確認
※ URLは環境で読み替えて下さい。
http://20.210.31.184/api/data
WEBブラウザに {"message":"Hello World!"} と表示され、JSON データを取得することが出来ました。
※ 別ターミナルから curl コマンドで確認
$ curl -v http://20.210.31.184/api/data
* Trying 20.210.31.184:80...
* Connected to 20.210.31.184 (20.210.31.184) port 80 (#0)
> GET /api/data HTTP/1.1
> Host: 20.210.31.184
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200
< Content-Type: application/json
< Transfer-Encoding: chunked
< Date: Mon, 27 Feb 2023 09:21:21 GMT
<
* Connection #0 to host 20.210.31.184 left intact
{"message":"Hello World!"}
ターミナルに {"message":"Hello World!"} と表示され、JSON データを取得することが出来ました。
※ Azure 側で SSL/TLS対応や HTTP/2プロトコル適用などはされていないようです。
コンテナに接続
$ kubectl exec -it app-deployment-b876686f6-tzbwk -- /bin/bash
コンテナに接続後
$ pwd
/workspace
$ ls -la
total 20
drwxr-xr-x 1 cnb cnb 4096 Jan 1 1980 .
drwxr-xr-x 1 root root 4096 Feb 27 08:10 ..
drwxr-xr-x 1 cnb cnb 4096 Jan 1 1980 BOOT-INF
drwxr-xr-x 3 cnb cnb 4096 Jan 1 1980 META-INF
drwxr-xr-x 3 cnb cnb 4096 Jan 1 1980 org
コンテナの情報
$ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.6 LTS"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
NAME="Ubuntu"
ID=ubuntu
PRETTY_NAME="Paketo Buildpacks Base Bionic"
VERSION_ID="18.04"
HOME_URL="https://github.com/paketo-buildpacks/bionic-base-stack"
UBUNTU_CODENAME=bionic
VERSION="18.04.6 LTS (Bionic Beaver)"
ID_LIKE=debian
SUPPORT_URL="https://github.com/paketo-buildpacks/bionic-base-stack/blob/main/README.md"
BUG_REPORT_URL="https://github.com/paketo-buildpacks/bionic-base-stack/issues/new"
VERSION_CODENAME=bionic
まとめ
- Ubuntu のシンプルな構成の Java 開発環境で Spring Boot WEBサービスのカスタムコンテナイメージを AKS (Azure Kubernetes Service) 環境で起動させることが出来ました。
参考
[Microsoft Learn] Azure Kubernetes Service (AKS) コマンド リファレンス