在 Kubernetes 环境下启动 Spring Boot WEB 服务
在Kubernetes环境下启动Spring Boot WEB服务
目的 – One option
在Kubernetes环境下启动Spring Boot WEB服务,以加深理解。
实现
在本地(Ubuntu)的Kubernetes环境(Docker Desktop)中,部署并启动Spring Boot WEB应用的Docker镜像。
开发环境
-
- Windows 11 Home 22H2 を使用しています。
WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。
> wsl –version
WSL版本:1.0.3.0
内核版本:5.15.79.1
WSLg版本:1.0.47Ubuntu
$ lsb_release -a
没有可用的LSB模块。
发行商ID:Ubuntu
描述:Ubuntu 22.04.1 LTS
发布版本: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
版本 4.16.3 (96739)
$ docker –version
Docker 版本 20.10.22,构建号 3a2c30b
$ docker-compose –version
Docker Compose 版本 v2.15.1
$ kubectl version –short
客户端版本:v1.25.4
Kustomize 版本:v4.5.7
服务器版本:v1.25.4
※本文中主要使用Ubuntu终端进行操作。
展示“你好世界”的步骤
创建Spring Boot网页服务
请参考最简单的Spring Boot WEB服务的”Hello World!”。
请将项目文件夹更改为指定位置
※ 假设将 ~/tmp/hello-spring-boot 当作项目文件夹
$ cd ~/tmp/hello-spring-boot
在构建Java应用程序时(请参考),
将创建一个目标/app.jar的文件。
并不一定是必需的,因为在创建下面的Docker镜像时,同时也会创建目标/app.jar的文件。
$ mvn clean install
创建Docker镜像
构建Docker镜像
* 在本地Docker环境(Docker Desktop)中创建app-hello-spring-boot Docker镜像。
* Docker镜像的创建时间是根据spring-boot:build-image规范设置为Unix纪元时间。
$ 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桌面版
启用Docker Desktop的Kubernetes环境。
\[\text{设置} \rightarrow \text{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桌面时,它作为一个容器在运行。
请使用网络浏览器进行确认。
http://localhost:30000/api/data
我成功地在网页浏览器上显示了{“message”:”Hello World!”}并获取了JSON数据。
可以通过另一个终端的命令进行确认。
$ curl -X GET http://localhost:30000/api/data
{"message":"Hello World!"}
总结 jié)
-
- Ubuntu の 最小構成の Java 開発環境で Spring Boot WEBサービスを Kubernetes 環境にてコンテナとして起動させることが出来ました。
- 次のステップとして構成にリバースプロキシを加える設定に続きます。