Spring Boot WEBサービスを Kubernetes 環境で起動する
目的
Spring Boot WEBサービスを Kubernetes 環境で起動して理解を深めます。
実現すること
ローカル (Ubuntu) の Kubernetes 環境 (Docker Desktop) に Spring Boot WEBアプリの Docker イメージをデプロイ・起動します。
開発環境
- 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サービスの作成
最小構成 Spring Boot WEBサービスの Hello World! を参照してください。
プロジェクトフォルダに移動
※ ~/tmp/hello-spring-boot をプロジェクトフォルダとします。
$ cd ~/tmp/hello-spring-boot
Java アプリをビルド(※参考)
※ target/app.jar が作成されます。
※ 下の Docker イメージを作成する操作でも同時に target/app.jar が作成されるので必須ではありません。
$ mvn clean install
Docker イメージを作成
Docker イメージをビルド
※ ローカルの Docker 環境 (Docker Desktop) に app-hello-spring-boot Docker イメージが作成されます。
※ Docker イメージの作成時間が Unix エポックになるのは spring-boot:build-image の仕様です。
$ mvn spring-boot:build-image \
-Dspring-boot.build-image.imageName=app-hello-spring-boot
Docker イメージの確認
$ docker images | grep app-hello-spring-boot
app-hello-spring-boot latest e37cc77f2b36 43 years ago 262MB
Kubernetes 環境の準備
Docker Desktop
Docker Desktop の Kubernetes 環境を有効化します。
[Settings] → [Kubernetes]
- Enable Kubernetes
Kubernetes のマニュフェストを作成
$ vim kube-all-in-one.yaml
ファイルの内容
apiVersion: v1
kind: Service
metadata:
name: app-service
spec:
type: NodePort
selector:
app: app
ports:
- name: http
port: 8080
targetPort: 8080
nodePort: 30000
---
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: app-hello-spring-boot
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
ディレクトリ・ファイル構成
$ tree -I test -I target
.
├── Dockerfile
├── HELP.md
├── docker-compose.yml
├── kube-all-in-one.yaml
├── mvnw
├── mvnw.cmd
├── nginx.conf
├── pom.xml
└── src
└── main
├── java
│ └── com
│ └── example
│ └── springboot
│ ├── SpringbootApplication.java
│ └── controller
│ └── DataController.java
└── resources
├── application.properties
├── static
└── templates
Kubernetes 環境
バージョン確認
$ kubectl version --short
Client Version: v1.25.4
Kustomize Version: v4.5.7
Server Version: v1.25.4
接続先を確認
$ kubectl config current-context
docker-desktop
※ 接続先をローカル (docker-desktop) に戻す場合
$ kubectl config use-context docker-desktop
デプロイ
$ 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-cdc7dcbf9-4rkp2 1/1 Running 0 22s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/app-service NodePort 10.103.38.116 <none> 8080:30000/TCP 22s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d22h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/app-deployment 1/1 1 1 22s
※ Docker Desktop を確認するとコンテナとして起動しています。
WEBブラウザで確認
http://localhost:30000/api/data
WEBブラウザに {"message":"Hello World!"} と表示され、JSON データを取得することが出来ました。
※ もしくは別ターミナルのコマンドで確認
$ curl -X GET http://localhost:30000/api/data
{"message":"Hello World!"}
まとめ
- Ubuntu の 最小構成の Java 開発環境で Spring Boot WEBサービスを Kubernetes 環境にてコンテナとして起動させることが出来ました。
- 次のステップとして構成にリバースプロキシを加える設定に続きます。