带有图片原版博客地址:https://blog.zhenglin.work/other/devops_practices_k8s.html
有这么一场景,Java被测应用和Java探针一起制作成镜像后部署到k8s环境,当有新版探针发布时,要基于新版探针制作一个新的镜像,并在k8s集群中更换镜像。
分析需求后,决定用两个jenkins project来完成这个任务。 第一个project,把原来编译打包探针project中增加触发下游项目和传递探针版本参数功能。第二个project,由第一个project触发;1,copy第一个脚本编译出来的探针文件,然后利用docker插件把最新探针文件连同被测应用镜像合成出 我们需要的镜像;2,推送到harbor仓库;3,最后在k8s集群更新镜像。 我们探针源码有多个分支,有开发用的dev、测试用的test,以及正式版本uat-x.x.x(x为数字);关于正式版呢,在测试通过后,会基于test分支创建出一个uat-x.x.x的正式版。这个时候人为构建project时,输入正式分支版本号,即可下拉这个版本源码,进行编译、和打包存档操作。
project 部分截图
拉取指定分支源码
[外链图片转存失败(img-sucnjy2b-1563714386265)(images/1563352085287.png)]
编译和存档,编译在execute shell模块实现编译,并对版本参数处理,去掉uat-,只保留数值。
[外链图片转存失败(img-NCVtllHA-1563714386267)(images/1563352263335.png)]
增加的两步
1,在execute shell中 把截取后版本号保存到一个文件中
echo "SER_NO=${SER_NO}" > server_release_number.txt
然后注入到环境变量
[外链图片转存失败(img-yn65NCvG-1563714386268)(images/1563352492070.png)]
2,触发下游项目并传递参数
增加构建后操作"trigger parameterized build on other projects",里面增加"Predefined parameters"
[外链图片转存失败(img-ZvRuMUwh-1563714386268)(images/1563352708618.png)]
额外所需插件 Docker,建议提前把所有用到插件罗列好,然后再进行安装,这样安装完成后重启jenkins一次就行了。
docker配置:
1,首先把用来制作镜像的节点机 增加调用的接口2375;
具体配置可以参考我的另一篇博客jenkins调用docker编译程序
2,jenkins配置cloud中增加docker
[外链图片转存失败(img-iW3ltsk5-1563714386269)(images/1563415312891.png)]
3,也增加构建参数,便于再没有接收到来自project1传递过来的参数时,可以手动输入
[外链图片转存失败(img-ScGAAPcq-1563714386269)(images/1563416062387.png)]
4,copy上游构建编译出来的探针
[外链图片转存失败(img-9HMnbqf3-1563714386270)(images/1563416146348.png)]
这里先不指定copy目标目录
5,增加copy探针和判断这个版本镜像是否已经存在(很可能出现2.3.5版本有重大问题,开发向2.3.5版本合入修改bug代码)
execute shell
AGENT_DIR="/dockerfile_work_dir/tomcat-no-app" rm -f $AGENT_DIR/*.tar.gz cp -f $WORKSPACE/*.tar.gz $AGENT_DIR rm -f ${AGENT_DIR}/test-toyota.yaml IMAGES_NU="$(docker image ls 172.16.35.31:1180/apm-images/tomcat-agent:${SER_NO} | wc -l)" echo $IMAGES_NU if [[ $IMAGES_NU -ge 2 ]];then kubectl get deployment/test-toyota-demo -n test-shop --export -o yaml > ${AGENT_DIR}/test-toyota.yaml kubectl get deployment/test-toyota-demo -n test-shop --export -o yaml > ${AGENT_DIR}/test-toyota-${date +%F%H%M%S}.bak kubectl delete deployment test-toyota-demo -n test-shop docker rmi 172.16.35.31:1180/apm-images/tomcat-agent:${SER_NO} fi删除制作镜像路径下的探针压缩包,把最新的copy过去;然后判断是否已有这个tag的镜像,有就删除应用后,再删除镜像(如果不删除deploy 镜像被占用无法删除);这个场景重点测试的是探针,所以不用关心应用的高可用、滚动更新、灰度发布等问题;如果重点是应用的测试,一定要保证应用的可用性;这一步的execute shell ,就不需要了,直接进入下一步。
6,镜像生成和推送
[外链图片转存失败(img-NyTqdkeI-1563714386270)(images/1563416938092.png)]
填写好dockerfile的目录,cloud选择之前配置的就行,image名称,仓库证书(里面有仓库用户名和密码)就可以把生成镜像推送到仓库了;
7,最关键的一步更换k8s集群中应用的镜像版本;
execute shell 代码:
AGENT_DIR="/dockerfile_work_dir/tomcat-no-app" IMAGE_NAME="172.16.35.31:1180/apm-images/tomcat-agent:${SER_NO}" if [[ ! -e ${AGENT_DIR}/test-toyota.yaml ]];then kubectl get deployment/test-toyota-demo -n test-shop --export -o yaml > ${AGENT_DIR}/test-toyota.yaml kubectl get deployment/test-toyota-demo -n test-shop --export -o yaml > ${AGENT_DIR}/test-toyota-${date +%F%H%M%S}.bak fi kubectl delete deployment test-toyota-demo -n test-shop sed -ri "s#image: .*#image: ${IMAGE_NAME}#" $AGENT_DIR/test-toyota.yaml kubectl apply -f $AGENT_DIR/test-toyota.yaml要测试最新探针,首先判断一下是否有yaml文件,这里强制性把之前被测应用deploy给删除了,如果换成应用的测试,这里脚本可以稍作调整
除了第一个execute shell 不需要外,此地execute shell 可以调整为:
AGENT_DIR="/dockerfile_work_dir/tomcat-no-app" IMAGE_NAME="172.16.35.31:1180/apm-images/tomcat-agent:${SER_NO}" kubectl get deployment/test-toyota-demo -n test-shop --export -o yaml > ${AGENT_DIR}/test-toyota-${date +%F%H%M%S}.bak kubectl set image deployment/test-toyota-demo test-toyota-demo=${IMAGE_NAME} -n test-shop就可以了,在deploy部署应用时设定了滚动更新策略如金丝雀、先更新后停止pod等。这样应用就达到平滑过渡。
强调一点,部署应用时,一定要设置镜像拉取规则为总是拉取。