需求:
一个服务的jar包启动会在jar包所处位置动态生成可变的配置,生产环境需要该配置持久化保持不变,且需要3个副本数
解决办法:
使用statefulset有状态服务部署,利用k8s的init容器注入jar包和配置文件,已达到配置文件的固定
1、镜像构建
1. init容器所需镜像
cat Dockerfile
FROM busybox:1.28.4
COPY *.jar /tmp/app.jar
2. 工作容器镜像
cat Dockerfile
FROM openjdk:8-jdk
LABEL maintainer="Geray <1690014753@qq.com>" \
image.authors="geray" \
image.description="Application packaged by Geray" \
image.ref.name="openjdk:8-jdk" \
image.title="gxjh_desp_exchange" \
image.vendor="VMware, Inc." \
build.date="2022.10.16"
ENV PARAMS="--server.port=8080"
ENV CONFPATH="-Dloader.path=/app-conf/resources,/app-conf/lib"
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone ; \
mkdir /app-conf/ ; mkdir /app/
ADD resources.tar.gz /app-conf/
ADD lib.tar.gz /app-conf/
COPY *.jar /app/app.jar
EXPOSE 8080
#ENTRYPOINT ["/bin/sh","-c","java -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar ${CONFPATH} app.jar ${PARAMS}"]
CMD ["/bin/sh","-c","java -Dfile.encoding=utf8 -Djava.security.egd=file:/dev/./urandom -jar ${CONFPATH} /app/app.jar ${PARAMS}"]
2、服务部署(测试部署)
1. 先部署工作容器(平台无法选择init容器)
流程和无状态一样
2. 添加init容器到服务
1)修改yaml清单
- 工作负载》有状态》更多》查看YML
- 编辑yaml,添加初始化容器到清单
initContainers:
- 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']"
image: "10.223.225.62:32000/gxjhpt/exchange-service-preposition:busybox-v3"
- 设置init容器和工作容器的挂载点,将init容器中的jar包和配置文件挂载到工作容器中使用;
- 全量替换》数据卷》添加临时卷
- init容器卷挂载(读写模式)
- 工作容器卷挂载(只读模式)
- 提交重新部署服务
- 进入容器查看每个pod所产生的配置文件是否固定
- 查看redis数据,观察是否成功
2、以上是准生产环境,部署生产环境
准生产环境和生产环境1:1比例,所以可以使用准生产环境的已经部署好的yaml清单快速部署
- 导出准生产环境的yaml清单
- 拷贝到生产环境的master节点
- 修改镜像地址
- 启动服务