OpenShift 3.6.1升级至3.7.1后部署触发器异常行为问询
遇到这种跨版本升级后的触发器异常,我之前维护OpenShift集群的时候也碰到过类似情况,结合3.6到3.7的版本差异,咱们一步步来排查解决:
可能的原因分析
OpenShift 3.7在镜像触发器的判断逻辑上做了不少优化,和3.6的行为差异主要集中在这几点:
- 镜像Digest校验逻辑增强:3.6版本可能仅校验镜像标签名称,而3.7会默认校验镜像的唯一Digest值——哪怕你用的是
latest这类可变标签,只要镜像内容更新(Digest变化),就会触发重新部署 - 部署配置触发器默认行为变更:升级过程中,原有部署配置的
imageChangeTrigger参数可能被自动调整(比如automatic字段默认从false改成了true) - 镜像流同步机制优化:3.7对镜像流的更新检测更频繁,可能捕捉到了3.6版本忽略的镜像细微变化
排查步骤
先通过命令确认核心配置的差异,定位问题根源:
- 对比DEV和INT的部署配置触发器
在两个环境分别执行:
重点看oc get dc <你的部署配置名称> -o yaml | grep -A 10 "triggers"imageChangeParams下的automatic字段,以及from段的镜像引用是否一致 - 查看部署触发日志
在DEV环境执行:
拉取最近的部署事件,确认触发原因里的镜像Digest是否真的发生了变化,还是OpenShift的误判oc describe dc <你的部署配置名称> - 检查镜像流状态
查看对应镜像流的标签和Digest:
确认同一个标签下的Digest是否在触发部署的时间点有更新oc get is <你的镜像流名称> -o yaml | grep -A 5 "tags" - 排查GitLab流水线脚本
检查流水线中部署阶段的命令,看是否存在无意中更新镜像流或部署配置的操作(比如oc import-image、oc set image这类命令)
解决办法
根据排查结果,对应调整配置:
- 禁止镜像内容变更触发部署
如果不需要镜像Digest变化时自动部署,可修改部署配置的触发器为手动模式:oc patch dc <你的部署配置名称> -p '{"spec":{"triggers":[{"type":"ImageChange","imageChangeParams":{"automatic":false,"from":{"kind":"ImageStreamTag","name":"<镜像名>:<标签>","namespace":"<项目名>"}}}]}}' - 固定镜像Digest引用
为了完全避免可变标签带来的意外部署,可将部署配置中的镜像引用从标签改为具体的Digest:oc set image dc/<你的部署配置名称> <容器名>=<镜像仓库>/<镜像名>@sha256:<具体的Digest值> - 调整流水线部署逻辑
如果是流水线脚本无意中修改了镜像引用,可在部署步骤中增加判断:仅当部署配置模板发生变更时,才执行更新部署配置的操作
注意事项
OpenShift 3.7的镜像触发器逻辑调整是为了提升部署的确定性,但和旧版本的行为差异可能导致意外。后续维护时建议:
- 尽量避免使用
latest这类可变标签,改用固定版本标签或Digest - 升级前备份所有部署配置,方便对比升级后的参数变化
内容的提问来源于stack exchange,提问作者Christoph
相关产品推荐
相关产品推荐

