需求:

一个服务的jar包启动会在jar包所处位置动态生成可变的配置,生产环境需要该配置持久化保持不变,且需要3个副本数

解决办法:

使用statefulset有状态服务部署,利用k8s的init容器注入jar包和配置文件,已达到配置文件的固定

1、镜像构建

1. init容器所需镜像

  1. cat Dockerfile
  2. FROM busybox:1.28.4
  3. COPY *.jar /tmp/app.jar

深圳民生诉求共享交换有状态部署 - 图1

2. 工作容器镜像

  1. cat Dockerfile
  2. FROM openjdk:8-jdk
  3. LABEL maintainer="Geray <1690014753@qq.com>" \
  4. image.authors="geray" \
  5. image.description="Application packaged by Geray" \
  6. image.ref.name="openjdk:8-jdk" \
  7. image.title="gxjh_desp_exchange" \
  8. image.vendor="VMware, Inc." \
  9. build.date="2022.10.16"
  10. ENV PARAMS="--server.port=8080"
  11. ENV CONFPATH="-Dloader.path=/app-conf/resources,/app-conf/lib"
  12. RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone ; \
  13. mkdir /app-conf/ ; mkdir /app/
  14. ADD resources.tar.gz /app-conf/
  15. ADD lib.tar.gz /app-conf/
  16. COPY *.jar /app/app.jar
  17. EXPOSE 8080
  18. #ENTRYPOINT ["/bin/sh","-c","java -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar ${CONFPATH} app.jar ${PARAMS}"]
  19. CMD ["/bin/sh","-c","java -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar ${CONFPATH} /app/app.jar ${PARAMS}"]

深圳民生诉求共享交换有状态部署 - 图2

2、服务部署(测试部署)

1. 先部署工作容器(平台无法选择init容器)

流程和无状态一样

2. 添加init容器到服务

1)修改yaml清单

  1. 工作负载》有状态》更多》查看YML

深圳民生诉求共享交换有状态部署 - 图3

  1. 编辑yaml,添加初始化容器到清单
  1. initContainers:
  2. - command: ['sh', '-c', 'cp /tmp/app.jar /data-test/ ;hostname=`hostname` ; if [[ $hostname = exchange-service-preposition2-0 ]]; then echo "com.zdww.machine=1" > /data-test/application-machine.properties ; elif [[ $hostname = exchange-service-preposition2-1 ]]; then echo "com.zdww.machine=2" > /data-test/application-machine.properties ; elif [[ $hostname = exchange-service-preposition2-2 ]]; then echo "com.zdww.machine=3" > /data-test/application-machine.properties; else echo "error" > /data-test/application-machine.properties; fi']"
  3. image: "10.223.225.62:32000/gxjhpt/exchange-service-preposition:busybox-v3"

深圳民生诉求共享交换有状态部署 - 图4

  1. 设置init容器和工作容器的挂载点,将init容器中的jar包和配置文件挂载到工作容器中使用;
  2. 全量替换》数据卷》添加临时卷

深圳民生诉求共享交换有状态部署 - 图5

  1. init容器卷挂载(读写模式)

深圳民生诉求共享交换有状态部署 - 图6

  1. 工作容器卷挂载(只读模式)

深圳民生诉求共享交换有状态部署 - 图7

  1. 提交重新部署服务
  2. 进入容器查看每个pod所产生的配置文件是否固定
  3. 查看redis数据,观察是否成功

2、以上是准生产环境,部署生产环境

准生产环境和生产环境1:1比例,所以可以使用准生产环境的已经部署好的yaml清单快速部署

  1. 导出准生产环境的yaml清单
  2. 拷贝到生产环境的master节点
  3. 修改镜像地址
  4. 启动服务