SpringBoot打包部署到K8s示例
Posted gdwkong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
将SpringBoot项目打包并部署到服务器
将SpringBoot项目打包并部署到服务器
该篇博文记录我手动部署SpringBoot项目的jar包到服务器上,和我遇到的一些坑和解决过程。
1.打包项目
2.得到jar包
成功打包后,jar包会在 target
文件夹中
3.单独运行jar包
这时候,这个jar包在有Java的环境下就可以直接在DOS窗口中启动了 (SpringBoot项目内置了Tomcat,不需要我们再配置)
4.在服务器上运行jar包
若jar包能在本机DOS窗口中成功启动,我们就可以将这个jar包拉到服务器中了。(使用Xshell和Xftp远程操作服务器)
因为是jar包,所以是需要Java环境的,与开发环境相同。我这里是 jdk 1.8
可参考文章:https://blog.csdn.net/u010993514/article/details/82926514
5.防火墙开放端口
需要注意一个点,因为想要访问服务器(或虚拟机)内部的端口的话,是会被防火墙的卡住的。所以我们需要提前开放项目使用的那个端口,以供我们在本地访问。
我们这里的项目所用端口是 8099
端口,所以我们要开放 8099 端口。
可参考文章:https://blog.csdn.net/Honnyee/article/details/81535464
# 开放8099端口
firewall-cmd --zone=public --add-port=8099/tcp --permanent (--permanent永久生效,没有此参数重启后失效)
# 添加8099端口外部访问权限(这样外部才能访问)
firewall-cmd --add-port=8099/tcp
# 重新载入,添加端口后重新载入才能起作用
firewall-cmd --reload
其余指令:
# 查看防火墙状态
systemctl status firewalld
# 查看开启了哪些端口
firewall-cmd --list-ports
# 查看端口
firewall-cmd --zone=public --query-port=80/tcp
6.在本地访问(爬坑)
然后就可以尝试在本地访问该项目了。
不出意外的话,在本地访问 服务器IP:项目端口/...
是可以访问到项目接口的。可是。。。还是出意外了。
无法访问,就是单纯地访问不到服务器上的这个端口(我用虚拟机做了一样的步骤:能成功访问)。
再次检查服务器开放的端口:没毛病呀,8099
是开放了呀!
我甚至将服务器内部的防火墙都关闭了,还是 嗯... 无法访问此页面
反正,就是端口开放的问题!!!!
然后突然受到一篇文章的启发:进入腾讯云服务器的控制台,这还有一个防火墙!??
而且,这里的防火墙开放的端口和我刚才在服务器内部开放的端口不一样。。。
然后我就尝试在这也开放一次 8099
端口,然后在本地再请求一次服务器的 8099 端口。
成功出现了这个页面!那就意味着访问成功了!
尝试调用项目接口:(成功!!)
因为我的项目中有数据库,所以我还要把本地的数据库导入到服务器中。接口才能成功访问。
所以我们还需要在服务器中安装MySQL。
安装MySQL可参考文章:https://www.cnblogs.com/xsge/p/13827288.html
数据库数据:可以先将本地数据库导出为.sql文件,然后将该.sql文件拉到服务器上,然后再导入到服务器的数据库中。
7.注意
切记:还需要在腾讯云服务器(可能每种服务器都需要)的控制台,开放相应端口
8.让jar包一直处于运行状态
之前我们都是直接用命令:
# 运行jar包
java -jar harmonyos-0.0.1-SNAPSHOT.jar
这种方式是直接运行jar包,当你关闭远程连接时,它就被关闭了,相当于这个进程被杀死了。
可是部署一个项目,那它就应该一直处于运行状态,这样我们才能随时随地的调用API。
在服务器上(我这是centOS)想要让一个jar一直处于运行状态,需要让其在后台启动。
# 后台启动
nohup java -jar xxx.jar &
# 然后通过exit退出终端窗口
exit
以上是关于SpringBoot打包部署到K8s示例的主要内容,如果未能解决你的问题,请参考以下文章