记一次因jenkins迁移由于imagePullPolicy策略而导致发布内容不是最新的小问题

1.背景

  由于公司jenkins需要迁移到腾讯云,所以进行jenkins的迁移,jenkins迁移的过程不在描述,由于使用的yum安装,截止2022年4月1日时,jenkins老版本自动安装很多默认插件在国内安装失败,个人也不想去一个一个去下载安装,于是将jenkins升级到了最新版本;(jenkins版本2.338-1.1,jenkins版本在这个文档这里其实不重要,只是做个记录)

  后面迁移完jenkins的job文件夹,虽然历史信息以及版本号都做了保留,但是只要更改配置文件就会出错,觉得没有必要去修复这个错误,于是便新建任务重新发布,便出现了以下问题:

  不管状态发布的多么正常,但是最新的程序代码一直无法展示,出现的一直是很久之前的程序代码。(具体的代码内容就不展示了)

  于是有了以下排错的过程:

 

2.排错过程

  由于这里使用是jenkins完成ci/cd部分,于是排查以下流程。

  1. 检查源站git上的代码是否正常。 (正常)
  2. 检查构建的镜像内的代码是否正常。 (正常)
  3. 检查jenkins的工作目录的job是否正常,害怕有缓存或者什么不确定因素。 (正常)
  4. 检查运行中pod 容器的运行代码 (异常,为老代码)

  参考之前的博客<jenkins-k8s-Class not found io.kubernetes.client.openapi.models.V1Service报错 >,以为是降级了kubernetes cd插件的问题而出现的bug,可能与新版本不兼容。

  后面突然想到,负责项目的小伙子会不会重新创建job,最终导致镜像名称以及tag重复,而k8s的镜像拉取策略是‘IfNotPresent’,于是查看了pod的yaml文件,再次登录k8s中运行pod的node节点,果然,当前版本号构建次数为6,而该任务在之前的jenkins已经发布了42次。意思就是说在这42次之内,都不可能更新到最新代码。因为镜像tag重复了,又因为k8s镜像拉取策略,本地如果有镜像,那么就不去仓库去拉取最新镜像。在连续点击40次之后,代码才能显示最新。于是这里手动删除了镜像tag为10-30的,临时解决了问题。

 

3.问题解决

  其实该问题也是一个很小的问题,解决方式有很多,但是竟然出现了,还是简单记录一下。有以下几种解决方案。

 

3.1 删除node上的下载的镜像

  使用docker rmi删除机器上所有重复的镜像就可以解决,但是缺点在于如果你有100个node,每个node上随机分布了pod,那么就得把所有node上重复的镜像tag给删除。

 

3.2 Jenkins pipeline不要起重复的名字

  比如之前任务是takt-home-frontend,那么随便加一个标识,如takt-home-frontend-new,改变镜像名称也可以。但是显得不太整洁。

 

 

3.3 k8s镜像的下载策略

  这里不做过多解释,直接上图。

  查看pod的详细配置文件,这里的拉取策略就是‘IfNotPresent’。所以最简单的方式还是手动直接指定 imagePullPolicy字段为Always。

  以下附上官网链接:https://kubernetes.io/zh/docs/concepts/containers/images/

 

posted @ 2022-04-01 21:06  小家电维修  阅读(166)  评论(0编辑  收藏  举报