Springboot部署至容器云
如果是需要客开的springboot服务部署到v8的k8s集群,可以参考下列步骤实现
构建镜像-> 上传至镜像仓库->创建发布容器
1、构建镜像
条件:需要win/mac安装dockerdesktop,并且已拉取jdk8等基础镜像
注意事项:构建镜像需要注意cpu架构,arm/amd 如果客户环境是arm需要构建arm架构的镜像,我这里就遇到了,这种情况:
1、使用客户服务器去构建(没用过)
2、使用buildx+虚拟机可以跨架构构建(比较折腾,建议自行百度,我用的就是这种,坑得要死)
3、最好的方式直接找台相同架构的电脑构建(这个最快最推荐)
构建步骤:
在springboot pom同级项目目录增加Dockerfile文件:

以下是我的Dockerfile文件示例,仅供参考,根据项目情况自行调整:
# 使用官方的 OpenJDK 8 镜像作为基础镜像
FROM arm64v8/openjdk:8-jdk-alpine
# 设置工作目录
WORKDIR /app
ARG MY_ARG=dev
ENV ACTIVE=$MY_ARG
ADD target/mdmApp.jar /app/mdmApp.jar
# 暴露应用程序的端口
EXPOSE 9999
# 定义启动命令
CMD ["java", "-jar", "/app/mdmApp.jar","--spring.profiles.active=${ACTIVE}"]
然后在项目终端执行dockerbuild命令(Dockerfile存在的路径执行):
docker build -t mdm-app:arm-latest .
# mdm-app镜像名称,arm-latest镜像标签
构建完成后,可以通过idea看到该镜像:

2、上传至镜像仓库
镜像仓库就是Harbor镜像仓库,这个联系运维获取对应信息即可,一般开发环境对应有开发环境的,生产有生产的,这个找到对应的环境上传就行
上传操作,需要使用docker命令,先进行登录仓库,然后对仓库进行push上去
# 登录
docker login 10.242.56.00 -u admin -p pwdxxxx
# 标记镜像:
docker tag mdm-app:latest 10.242.56.00/seeyon-dev/mdm-app:latest
# 推送镜像到Harbor
# 10.242.56.29 Harbor地址,seeyon-dev是Harbor的项目
docker push 10.242.56.00/seeyon-dev/mdm-app:latest
注意:一般咋们部署的Harbor都是http的,这个时候需要调整下本地的docker配置文件否则可能会登录不成功
# 如果Harbor是http的,需要docker开启 daemon.json 文件:
# 在 Linux 上,编辑 /etc/docker/daemon.json 文件。
# 在 Windows 上,编辑 %ProgramData%\Docker\config\daemon.json 文件。
# 在文件增加下列参数,
{
"insecure-registries" : ["http://10.242.56.00"]
}
3、创建/修改 发布容器
初始化创建容器,建议直接告诉运维镜像已经推送到镜像仓库了,提出剩下的要求,比如策略,挂载,端口等信息,剩下的让运维整,因为这块确实属于运维的范畴了,如果是有经验的运维基本上也许能搞定,如果搞不定可以让他参考下列Deployment的配置去创建,因为可能运维大部分都是参考产品的Deployment.yml去做,但经过我验证,产品的yaml不能直接用,容器起不来,像一些nacos之类的配置都去掉,只保留示例里那些部分即可
下列是我项目实际的K8s的Deployment.yml
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations: {}
labels:
app: mdm-app
type: backend
name: mdm-app
namespace: seeyon-dev
resourceVersion: '22168956'
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: mdm-app
type: backend
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: mdm-app
type: backend
spec:
containers:
- name: mdm-app
image: '10.242.56.29/seeyon-dev/mdm-app:arm-latest'
imagePullPolicy: IfNotPresent
lifecycle:
preStop:
httpGet:
path: /deregisterInstance
port: appport
scheme: HTTP
livenessProbe:
failureThreshold: 30
initialDelaySeconds: 600
periodSeconds: 10
successThreshold: 1
tcpSocket:
port: 9999
timeoutSeconds: 1
ports:
- containerPort: 9999
hostPort: 9999
protocol: TCP
readinessProbe:
failureThreshold: 30
httpGet:
path: /mdm/check
port: 9999
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
resources:
limits:
cpu: '2'
memory: 5Gi
requests:
cpu: 500m
memory: 3Gi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /app/logs
name: log
dnsPolicy: Default
imagePullSecrets:
- name: harbor
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoSchedule
key: group
operator: Equal
value: bip
volumes:
- name: log
nfs:
path: /data/logs
server: 10.242.56.32
如果运维实在搞不定,那让他先用产品的创建出来这个Deployment,剩下的自己Kuboard慢慢调整发布也行
如果运维到这部也搞不定,那就只能自己来了,以上面的文件示例,自己做调整后,到服务器上
kubectl apply -f deployment.yaml 试试把,需要调整里面的Harbor仓库,namespace命名空间,以及image对应的镜像,还有name不能和其他pod重复
4、关于更新迭代
通过以上步骤基本上可以让这个容器运行起来了,就剩下网络,nginx代理告诉运维让运维接着搞就行
接下来描述的是更新镜像进行功能迭代的方式:
1、首先本地代码调整完成后,按照第一步构建镜像,这一步的tag标签不用管,和以前一样就行
2、推送镜像到Harbor,这一步的tag,要变化,标记镜像时要使用新tag,因为k8s要用新tag拉取你的镜像才能更新新镜像到容器里
# 标记镜像:v1是新的标签,后面以此类推,v2,v3等等更新就行
docker tag mdm-app:latest 10.242.56.29/seeyon-dev/mdm-app:v1
安装上述方式推送迭代后的镜像上去,就会如下图:

然后进入Kuboard进行修YAML


把内容的tag更新后,确定,应用,然后就会生成新副本运行,至此更新完成。