一、前提條件
有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
