在 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(Microsoft Store应用版)
> 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 環境にてコンテナとして起動させることが出来ました。

 

    次のステップとして構成にリバースプロキシを加える設定に続きます。
广告
将在 10 秒后关闭
bannerAds