Springboot部署至容器云

提示

如果是需要客开的springboot服务部署到v8的k8s集群,可以参考下列步骤实现

构建镜像-> 上传至镜像仓库->创建发布容器

1、构建镜像

提示

条件:需要win/mac安装dockerdesktop,并且已拉取jdk8等基础镜像

注意事项:构建镜像需要注意cpu架构,arm/amd 如果客户环境是arm需要构建arm架构的镜像,我这里就遇到了,这种情况:

1、使用客户服务器去构建(没用过)

2、使用buildx+虚拟机可以跨架构构建(比较折腾,建议自行百度,我用的就是这种,坑得要死)

3、最好的方式直接找台相同架构的电脑构建(这个最快最推荐)

构建步骤:

在springboot pom同级项目目录增加Dockerfile文件:

456fd064-aa6a-43f7-b4cc-78201a7b8b70.png

以下是我的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看到该镜像: 09d44b80-daa3-4548-b5f3-7ea35df93de5.png

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

安装上述方式推送迭代后的镜像上去,就会如下图:

962fb048-2128-4b27-bcf3-cc80d3f529d8.png

然后进入Kuboard进行修YAML

b74b4ea0-8f84-4c4b-aff3-c2073b713f90.png

bcc35785-2669-4dc2-a568-afc0506bb24a.png

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