部署Spring boot 的项目到k8s集群

0
(0)

构建Spring boot 项目为Docker镜像并发布到仓库

第一步:编译Spring boot 项目为 jar 文件

此处为了减少等待时间,忽略了单元测试;实际生产环境中不应跳过单元测试;

mvn clean package -DskipTests=true

第二步:编写Dockerfile包含运行环境和jar文件

# 使用官方的OpenJDK镜像作为基础镜像
FROM openjdk:11-jre-slim
RUN apt update && apt install -y fontconfig
ARG app=xifei-server
# 设置工作目录
WORKDIR ${workdir}
## 将后端项目的 Jar 文件,复制到镜像中
COPY ./target/${app}.jar /app/server.jar

## 设置 TZ 时区
## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖
ENV TZ=Asia/Shanghai JAVA_OPTS="-Duser.timezone=Asia/Shanghai -Xms512m -Xmx8192m -XX:+HeapDumpOnOutOfMemoryError" PROFILES_ACTIVE="" ARGUMENTS="" MYSQL_HOST=localhost:3306 MYSQL_DBNAME="" MYSQL_USER="" MYSQL_PWD="" REDIS_HOST=localhost REDIS_DB=0 REDIS_PORT=6379 REDIS_PWD="" 

## 暴露后端项目的 48080 端口
EXPOSE 48080

## 启动后端项目
CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app/server.jar --spring.profiles.active=$PROFILES_ACTIVE $ARGUMENTS

第三步:编译为镜像,推送到仓库

docker buildx build -t xfky-server:latest --platform linux/amd64,linux/arm64 --build-arg app=xifei-server xifei-server
docker tag xifei-server:latest 192.168.0.200:5000/xifei-server:latest
docker push 192.168.0.200:5000/xifei-server

部署项目的镜像到K8S集群中

第一步:创建命名空间

kubectl create namespace xfky

也可以使用 yaml文件方式创建 kubectl apply -f xxx.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: xfky

第二步:创建Secret以及ConfigMap来保存配置

此处需要注意,data里面每一项的value都必须是base64编码过的

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: xfky-server-secret
  namespace: xfky
data:
  MYSQL_HOST: MTkyLjE2OC4wLjIwMDozMzA2
  MYSQL_DBNAME: eGZreV9kZXY=
  MYSQL_USER: eGlmZWk=
  MYSQL_PWD: MTIzNDU2Nzg=
  REDIS_HOST: MTkyLjE2OC4wLjIwMA==
  REDIS_PORT: NjM3OQ==
  REDIS_DB: MA==
  REDIS_PWD: MTIzNDU2Nzg=

第三步 创建 Deployment

此时就需要创建应用以及应用用到的所有其他服务的Deployment的,如果使用的是已经存在的数据库或者Redis则不需要再创建,直接在上述的配置中配置已有的链接和密码即可。

为了减少篇幅,此处我仅演示已有MySQL和Redis服务器的情况下,仅部署应用Service,对于MySQL和Redis等服务的K8s部署计划可以单独列一个文章写。

因为考虑到应用中有上传文件的功能,为了保证文件被持久保存,所以需要先创建 PV 和 PVC,磁盘我这里用的是NFS的,如果你也可需要配置NFS 的 Storage Class,可以自己配置。

NFS 的 PV:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: xfky-server-pv
  namespace: xfky
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: nfs-storageclass
  mountOptions:
    - hard
    - nfsvers=3
  nfs:
    server: 192.168.0.135
    path: /nfs/k8s/xfky-server/data

下面是创建应用服务对应的Deployment 的YAML:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: xfky-server-pvc
  namespace: xfky
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: nfs-storageclass
  volumeMode: Filesystem
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: xfky-server
  namespace: xfky
  labels:
    app: xfky-server
spec:
  replicas: 2
  strategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: xfky-server
  template:
    metadata:
      namespace: xfky
      name: xfky-server
      labels:
        app: xfky-server
    spec:
      containers:
        - name: xfky-server
          image: 192.168.0.200:5000/xfky-server:latest
          imagePullPolicy: Always
          ports:
            - containerPort: 48080
          envFrom:
            - secretRef:
                name: xfky-server-secret
          env:
            - name: HTTP_PORT
              value: '48080'
            - name: ARGUMENTS
              value: '' # 执行 Spring Boot main 方法传递的参数
            - name: PROFILES_ACTIVE
              value: dev,debug
          volumeMounts:
            - mountPath: /data
              name: xfky-server-data
          livenessProbe:
            httpGet:
              path: /actuator/health/liveness
              port: 48080
              scheme: HTTP
            initialDelaySeconds: 30
            timeoutSeconds: 10
            periodSeconds: 10
            successThreshold: 1
            failureThreshold: 3
          readinessProbe:
            httpGet:
              path: /actuator/health/readiness
              port: 48080
              scheme: HTTP
            initialDelaySeconds: 30
            timeoutSeconds: 10
            periodSeconds: 10
            successThreshold: 1
            failureThreshold: 3
      volumes:
        - name: xfky-server-data
          persistentVolumeClaim:
            claimName: xfky-server-pvc
      restartPolicy: Always

---
apiVersion: v1
kind: Service
metadata:
  name: xfky-server-service
  namespace: xfky
spec:
  type: ClusterIP
  selector:
    app: xfky-server
  ports:
    - name: http
      port: 80
      targetPort: 48080

第四步 在Gateway 上配置服务和域名绑定,暴露服务

我这里用的是 apisix 做的配置,所以比较简单,配置上游使用到完整的服务名 xfky-server-service.xfky.svc.cluster.local 和 对应的域名后,域名解析到 apisix 的 geteway上就可以了。apisix目前我还不是特别熟悉,有学习到高级的用法后再写文章分享出来。

这篇文章有用吗?

平均评分 0 / 5. 投票数: 0

到目前为止还没有投票!成为第一位评论此文章。

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?


了解 工作生活心情记忆 的更多信息

Subscribe to get the latest posts sent to your email.

分类: