SpringBoot打包部署到K8s示例


一、前提條件

有Kubenertes集群可用,docker環境、docker hub上創建了私有倉庫;

集群搭建可參考我一篇筆記:https://www.cnblogs.com/gdwkong/p/15253215.html

二、新建springboot示例工程

1、使用IDEA開發工具創建一個簡單的WEB

2、編寫pom.xml鏡像打包插件

<build>
        <finalName>springboot-k8s</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
            <!-- 使用Maven插件直接將應用打包為一個Docker鏡像 -->
            <plugin>
                <groupId>com.spotify</groupId>
                <!-- 這里使用新版dockerfile-maven-plugin插件 -->
                <artifactId>dockerfile-maven-plugin</artifactId>
                <version>1.4.10</version>
                <executions>
                    <execution>
                        <id>default</id>
                        <goals>
                            <goal>build</goal>
                            <goal>push</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <!-- Dockerfile目錄指定 根目錄下-->
                    <dockerfile>Dockerfile</dockerfile>
                    <!--遠程倉庫名 -->
                    <repository>cenobitor/${project.build.finalName}</repository>
                    <!-- 生成鏡像標簽 如不指定 默認為latest -->
                    <tag>${project.version}</tag>
                    <buildArgs>
                        <!-- 理論上這里定義的參數可以傳遞到Dockerfile文件中,目前未實現 -->
                        <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
                    </buildArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>

3、指定開放端口

在application.properties指定開放端口

#指定開放端
server.port=8885

4、編寫一個簡單接口

package com.cenobitor.springbootk8s.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class TestController {

      @GetMapping("/test")
      public String test(){
          log.info("接收到外界訪問.");
          return "歡迎訪問K8s中的springboot項目";
      }

}

三、編寫DockerFile 文件

#基礎鏡像,如果本地倉庫沒有,會從遠程倉庫拉取
FROM openjdk:17
#暴露端口
EXPOSE 8885
#容器中創建目錄
RUN mkdir -p /usr/local/cenobitor
#編譯后的jar包copy到容器中創建到目錄內
COPY target/springboot-k8s.jar /usr/local/cenobitor/app.jar
#指定容器啟動時要執行的命令
ENTRYPOINT ["java","-jar","/usr/local/cenobitor/app.jar"]

四、打包上傳鏡像

1、設置鏡像倉庫地址

 2、鏡像打包推送到私有倉庫

依次執行指定操作,1、2、3、4

鏡像倉庫可以看到該鏡像

五、Kubenertes部署

1、創建部署文件springboot-k8s.yaml

apiVersion: v1
kind: Service
metadata:
  name: springboot-k8s
  namespace: dev
  labels:
    app: springboot-k8s
spec:
  type: NodePort
  ports:
    - port: 8885
      nodePort: 30090 #service對外開放端口
  selector:
    app: springboot-k8s
---
apiVersion: apps/v1
kind: Deployment #對象類型
metadata:
  name: springboot-k8s #名稱
  namespace: dev
  labels:
    app: springboot-k8s #標注
spec:
  replicas: 3 #運行容器的副本數,修改這里可以快速修改分布式節點數量
  selector:
    matchLabels:
      app: springboot-k8s
  template:
    metadata:
      labels:
        app: springboot-k8s
    spec:
      containers: #docker容器的配置
        - name: springboot-k8s
          image: docker.io/cenobitor/springboot-k8s:1.0.0 # pull鏡像的地址 ip:prot/dir/images:tag
          imagePullPolicy: IfNotPresent #pull鏡像時機,
          ports:
            - containerPort: 8885 #容器對外開放端口,需與springboot配置文件一致
      #從私有倉庫拉取鏡像憑證
      imagePullSecrets:
        - name: regcred

2、配置私有倉庫拉取鏡像憑證

參考:https://kubernetes.io/zh/docs/tasks/configure-pod-container/pull-image-private-registry/#registry-secret-existing-credentials

3、創建命名空間

kubectl create ns dev

4、部署應用

kubectl create -f springboot-k8s.yaml

5、查看部署及查看pod日志

# 實時查看指定pod的日志

 

kubectl logs -f <pod_name> -n <namespace>

[root@master1 ~]# kubectl get pod -n dev -o wide
NAME                             READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
springboot-k8s-bb9bc44cd-9r879   1/1     Running   0          25m   10.244.4.18    node1   <none>           <none>
springboot-k8s-bb9bc44cd-c54sb   1/1     Running   0          25m   10.244.4.17    node1   <none>           <none>
springboot-k8s-bb9bc44cd-fsmkt   1/1     Running   0          25m   10.244.3.114   node2   <none>           <none>
[root@master1 ~]# kubectl logs -f springboot-k8s-bb9bc44cd-9r879 -n dev

7、Postman訪問循環訪問2000次

 

7、日志情況

六、所遇問題及解決方法

部署時發生錯誤:failed to set bridge addr: "cni0" already has an IP address different from 10.244.1.1/24

原因:所在節點服務器重啟,flannel文件丟失,cni0網卡地址flannel1不在同一網段;

解決方法:首先停用網絡,然后刪除配置

ifconfig cni0 down    
ip link delete cni0

重新部署應用,具體可參考一位大神的文章:https://blog.csdn.net/Wuli_SmBug/article/details/104712653

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM