SpringBoot应用打包并在MiniKube部署

  1. 概览

    1. 准备环境

      1. windows下安装Docker Desktop
      2. 编写一个用于测试的HelloWord的SpringBoot应用
    2. 基于应用打包docker镜像

      1. 使用Dockerfile(最通用,本次以这个为准)
      2. 使用 Spring Boot build-image(免 Dockerfile)
      3. 使用 Jib(不需要 Docker 环境)
    3. 发布到K8S集群,编写Deployments和Service运行服务6

    4. 参考资料

      1. ((20250805021845-4bl30iz '标准参考步骤'))
      2. ((20250815014300-yce4q7x '镜像推送到K8S服务的三种方法'))
  2. 详细步骤

    1. 安装docker desktop 并设置国内镜像源

      这样使用 docker build 的时候才能拉得到镜像,否则会访问docker.io网络原因失败。

      image

    2. 创建SpringBoot 工程

      └─k8sHello3 - 副本
          │  Dockerfile
          │  pom.xml
          └─src
              └─main
                  ├─java
                  │  └─com
                  │      └─example
                  │              HelloworldApplication.java
                  │              HelloWorldController.java
                  └─resources
                          application.properties
      
      <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <parent>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>3.5.4</version>
              <relativePath/>
          </parent>
          <groupId>org.example</groupId>
          <artifactId>k8sHello3</artifactId>
          <version>1.0-SNAPSHOT</version>
      
          <properties>
              <java.version>21</java.version>
          </properties>
      
          <dependencies>
              <!-- Spring Boot Web -->
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-web</artifactId>
              </dependency>
      
              <!-- JDBC + 数据源 -->
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-jdbc</artifactId>
              </dependency>
      
              <!-- MySQL 驱动 -->
              <dependency>
                  <groupId>com.mysql</groupId>
                  <artifactId>mysql-connector-j</artifactId>
                  <version>8.3.0</version> <!-- 可根据需求升级 -->
              </dependency>
          </dependencies>
      
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-maven-plugin</artifactId>
                      <version>3.5.4</version> <!-- 根据你使用的 Spring Boot 版本 -->
                      <executions>
                          <execution>
                              <goals>
                                  <goal>repackage</goal> <!-- 关键点! -->
                              </goals>
                          </execution>
                      </executions>
                  </plugin>
              </plugins>
          </build>
      </project>
      
    3. 创建Dockerfile脚本

      FROM maven:3.9.6-eclipse-temurin-21 as builder
      WORKDIR /app
      COPY . .
      RUN mvn clean package -DskipTests
      
      FROM eclipse-temurin:21-jdk
      WORKDIR /app
      COPY --from=builder /app/target/*.jar app.jar
      EXPOSE 9000
      ENTRYPOINT ["java", "-jar", "app.jar"]
      
    4. 构建Docker镜像

      注意:这里需要用到系统的maven路径,maven的参数,所以需要本地的默认jdk和maven最好和springboot工程的一致

      image
      image

    5. 执行构建

      PS E:\develop\IdeaCode\MyCode\SpringK8S\k8sHello3> docker build -t mazhiqiang/springboot-demo:1.0 .
      PS E:\develop\IdeaCode\MyCode\SpringK8S\k8sHello3> docker build -t mazhiqiang/springboot-demo:1.0 .
      [+] Building 151.3s (13/13) FINISHED                                                                                                                                                                                                                               docker:desktop-linux
       => [internal] load build definition from Dockerfile                                                                                                                                                                                                                               0.0s
       => => transferring dockerfile: 795B                                                                                                                                                                                                                                               0.0s
       => WARN: FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 20)                                                                                                                                                                                                    0.0s
       => [internal] load metadata for docker.io/library/eclipse-temurin:21-jre-alpine                                                                                                                                                                                                   8.6s
       => [internal] load metadata for docker.io/library/maven:3.9.6-eclipse-temurin-21                                                                                                                                                                                                  5.6s
       => [internal] load .dockerignore                                                                                                                                                                                                                                                  0.0s
       => => transferring context: 2B                                                                                                                                                                                                                                                    0.0s
       => [builder 1/4] FROM docker.io/library/maven:3.9.6-eclipse-temurin-21@sha256:8d63d4c1902cb12d9e79a70671b18ebe26358cb592561af33ca1808f00d935cb                                                                                                                                    0.0s
       => [internal] load build context                                                                                                                                                                                                                                                  2.3s
       => => transferring context: 24.43MB                                                                                                                                                                                                                                               2.3s
       => [stage-1 1/3] FROM docker.io/library/eclipse-temurin:21-jre-alpine@sha256:4ca7eff3ab0ef9b41f5fefa35efaeda9ed8d26e161e1192473b24b3a6c348aef                                                                                                                                    13.5s
       => => resolve docker.io/library/eclipse-temurin:21-jre-alpine@sha256:4ca7eff3ab0ef9b41f5fefa35efaeda9ed8d26e161e1192473b24b3a6c348aef                                                                                                                                             0.0s
       => => sha256:4ca7eff3ab0ef9b41f5fefa35efaeda9ed8d26e161e1192473b24b3a6c348aef 2.68kB / 2.68kB                                                                                                                                                                                     0.0s
       => => sha256:3408c45e1faee20e4e68808939a75f87efa469b927d20e12309689ead053daba 1.94kB / 1.94kB                                                                                                                                                                                     0.0s
       => => sha256:1ab59740150ab3beff6f26cb814b36f6b3d51aae8959b288d98c2df258e093f5 3.98kB / 3.98kB                                                                                                                                                                                     0.0s
       => => sha256:9824c27679d3b27c5e1cb00a73adb6f4f8d556994111c12db3c5d61a0c843df8 3.80MB / 3.80MB                                                                                                                                                                                     1.4s
       => => sha256:6a46580b98941ec4960dce678993b8f83a0b4d2d146c9d4e59e3aa6e788c13e2 16.28MB / 16.28MB                                                                                                                                                                                   4.1s
       => => sha256:57f9d657519484ce2f35f23c98dec4ef4411ffbb8df53ae594b3563de635b94c 53.14MB / 53.14MB                                                                                                                                                                                  12.6s
       => => extracting sha256:9824c27679d3b27c5e1cb00a73adb6f4f8d556994111c12db3c5d61a0c843df8                                                                                                                                                                                          0.1s
       => => sha256:cf466e9ba1cfaf9351b9b793d92033975eb18f8b2ffadf9b5720caea1fcb9f48 127B / 127B                                                                                                                                                                                         2.6s
       => => sha256:fb760d495f93020b467e7edca17a273394c877a25c14ce0d90a9a039e90bcb08 2.28kB / 2.28kB                                                                                                                                                                                     3.6s
       => => extracting sha256:6a46580b98941ec4960dce678993b8f83a0b4d2d146c9d4e59e3aa6e788c13e2                                                                                                                                                                                          0.4s
       => => extracting sha256:57f9d657519484ce2f35f23c98dec4ef4411ffbb8df53ae594b3563de635b94c                                                                                                                                                                                          0.7s
       => => extracting sha256:cf466e9ba1cfaf9351b9b793d92033975eb18f8b2ffadf9b5720caea1fcb9f48                                                                                                                                                                                          0.0s
       => => extracting sha256:fb760d495f93020b467e7edca17a273394c877a25c14ce0d90a9a039e90bcb08                                                                                                                                                                                          0.0s
       => CACHED [builder 2/4] WORKDIR /app                                                                                                                                                                                                                                              0.0s
       => [builder 3/4] COPY . .                                                                                                                                                                                                                                                         0.9s
       => [builder 4/4] RUN mvn clean package -DskipTests                                                                                                                                                                                                                              138.9s
       => [stage-1 2/3] WORKDIR /app                                                                                                                                                                                                                                                     0.1s
       => [stage-1 3/3] COPY --from=builder /app/target/*.jar app.jar                                                                                                                                                                                                                    0.0s
       => exporting to image                                                                                                                                                                                                                                                             0.1s
       => => exporting layers                                                                                                                                                                                                                                                            0.0s
       => => writing image sha256:a2aa390e0f30a3a35fb0821f003e1ce9ec15e11c53ed7a832a5006cd4511049c                                                                                                                                                                                       0.0s
       => => naming to docker.io/mazhiqiang/springboot-demo:1.0                                                                                                                                                                                                                          0.0s
      
       1 warning found (use docker --debug to expand):
       - FromAsCasing: 'as' and 'FROM' keywords' casing do not match (line 20)
      
      View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/6dzxj7h5mtsxefsnptlkl5lwt
      PS E:\develop\IdeaCode\MyCode\SpringK8S\k8sHello3>
      

      image

    6. 尝试本地启动

      PS E:\develop\IdeaCode\MyCode\SpringK8S\k8sHello3> docker run -p 9001:9000 a2aa390e0f30
      
        .   ____          _            __ _ _
       /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
      ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
       \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
        '  |____| .__|_| |_|_| |_\__, | / / / /
       =========|_|==============|___/=/_/_/_/
      
       :: Spring Boot ::                (v3.5.4)
      
      2025-08-13T15:45:14.109Z  INFO 1 --- [           main] com.example.HelloworldApplication        : Starting HelloworldApplication v1.0-SNAPSHOT using Java 21.0.8 with PID 1 (/app/app.jar started by root in /app)
      2025-08-13T15:45:14.111Z  INFO 1 --- [           main] com.example.HelloworldApplication        : No active profile set, falling back to 1 default profile: "default"
      2025-08-13T15:45:14.985Z  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 9000 (http)
      2025-08-13T15:45:14.999Z  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
      2025-08-13T15:45:14.999Z  INFO 1 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.43]
      2025-08-13T15:45:15.022Z  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
      2025-08-13T15:45:15.023Z  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 859 ms
      2025-08-13T15:45:15.452Z  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 9000 (http) with context path '/'
      2025-08-13T15:45:15.462Z  INFO 1 --- [           main] com.example.HelloworldApplication        : Started HelloworldApplication in 1.712 seconds (process running for 2.03)
      2025-08-13T15:46:16.120Z  INFO 1 --- [nio-9000-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
      2025-08-13T15:46:16.120Z  INFO 1 --- [nio-9000-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
      2025-08-13T15:46:16.120Z  INFO 1 --- [nio-9000-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms
      

      image

  3. 将镜像部署到K8S

    1. 从开发主机将镜像导出,并在K8S服务器上导入

      PS E:\develop\IdeaCode> docker images
      REPOSITORY                   TAG       IMAGE ID       CREATED        SIZE
      mazhiqiang/springboot-demo   1.0       a2aa390e0f30   26 hours ago   230MB
      <none>                       <none>    bad723415641   28 hours ago   1.09GB
      springboot-demo              1.0       0536d6d59796   9 days ago     472MB
      PS E:\develop\IdeaCode> docker save mazhiqiang/springboot-demo:1.0 -o myapp.tar
      
    2. 在服务器导入镜像

      root@mzq-VMware-Virtual-Platform:/home/mzq# docker images
      REPOSITORY                                                                    TAG       IMAGE ID       CREATED       SIZE
      registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver            v1.22.1   f30469a2491a   3 years ago   128MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy                v1.22.1   36c4ebbc9d97   3 years ago   104MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager   v1.22.1   6e002eb89a88   3 years ago   122MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler            v1.22.1   aca5ededae9c   3 years ago   52.7MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard                 <none>    e1482a24335a   4 years ago   220MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/etcd                      3.5.0-0   004811815584   4 years ago   295MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper           <none>    7801cfc6d5c0   4 years ago   34.4MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/coredns                   v1.8.4    8d147537fb7d   4 years ago   47.6MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner       v5        6e38f40d628d   4 years ago   31.5MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/pause                     3.5       ed210e3e4a5b   4 years ago   683kB
      root@mzq-VMware-Virtual-Platform:/home/mzq# docker load -i myapp.tar
      418dccb7d85a: Loading layer [==================================================>]  8.596MB/8.596MB
      c2d2b55d55c7: Loading layer [==================================================>]   34.3MB/34.3MB
      1eb3de508cc3: Loading layer [==================================================>]  164.2MB/164.2MB
      bb64f233ca86: Loading layer [==================================================>]  2.048kB/2.048kB
      880a6d9a5a59: Loading layer [==================================================>]  7.168kB/7.168kB
      4e89c95e0e62: Loading layer [==================================================>]  1.536kB/1.536kB
      0a30d1234cb0: Loading layer [==================================================>]  24.41MB/24.41MB
      Loaded image: mazhiqiang/springboot-demo:1.0
      root@mzq-VMware-Virtual-Platform:/home/mzq# docker images
      REPOSITORY                                                                    TAG       IMAGE ID       CREATED        SIZE
      mazhiqiang/springboot-demo                                                    1.0       a2aa390e0f30   26 hours ago   230MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver            v1.22.1   f30469a2491a   3 years ago    128MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler            v1.22.1   aca5ededae9c   3 years ago    52.7MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy                v1.22.1   36c4ebbc9d97   3 years ago    104MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager   v1.22.1   6e002eb89a88   3 years ago    122MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/dashboard                 <none>    e1482a24335a   4 years ago    220MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/etcd                      3.5.0-0   004811815584   4 years ago    295MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-scraper           <none>    7801cfc6d5c0   4 years ago    34.4MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/coredns                   v1.8.4    8d147537fb7d   4 years ago    47.6MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner       v5        6e38f40d628d   4 years ago    31.5MB
      registry.cn-hangzhou.aliyuncs.com/google_containers/pause                     3.5       ed210e3e4a5b   4 years ago    683kB
      
      
    3. 在dashboard创建depolyment

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: springboot-demo
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: springboot-demo
        template:
          metadata:
            labels:
              app: springboot-demo
          spec:
            containers:
              - name: springboot-demo
                image: mazhiqiang/springboot-demo:1.0
                ports:
                  - containerPort: 9000 
      

      image

      image

      image

    4. 在dashboard创建service

      apiVersion: v1
      kind: Service
      metadata:
        name: springboot-service
      spec:
        type: NodePort
        selector:
          app: springboot-demo
        ports:
          - protocol: TCP
            port: 80         # Service 对外暴露的端口(集群内部访问用)
            targetPort: 9000 # 转发到 Pod 容器的端口
            nodePort: 30080  # 节点映射端口(集群外访问用)
      
      

      image

      image

    5. 访问应用

      image

    6. 其他

  4. 最终概览

    image

  5. 阿斯蒂芬

posted @ 2025-08-15 09:12  箛獨劍  阅读(9)  评论(0)    收藏  举报