Kubernetes Job 的某些特殊 YAML 属性是不允许更新的,因此需要规范云产品 Job 模板的开发规范。以保证云产品的 Job 可以正常升级。
Job 修改规范
首先,只要在云产品当前开发版本修改了 Job,包括 YAML 模板、脚本等内容,必须修改 Job 名称,规则是在现有名称后面加上 “-” + “云产品版本”。例如:Job 名称叫 “db-init”,云产品当前开发版本号为 6.2.1,在 Job 做了修改时,需要将 Job 的名称修改为 “db-init-6.2.1”。
Job 镜像使用规范
Job 的镜像必须使用固定版本,分为两种情况:
- 依赖云产品自身组件的镜像。需要将 values.yaml 中的 image tag 写为 5.0.1 标识(历史遗留问题,CD 会在打包时自动替换为云产品当前 build version),确保开发过程中每次构建都会跟当前 build version 保持一致,从而能够使用到云产品自身组件最新的镜像。
- 依赖到外部镜像。必须指定为确定的版本号,不能使用 latest。因为云产品是按需安装的,不同版本携带的 latest 镜像内容可能不一致,会导致 latest tag 相互覆盖。
已知问题
使用以上规范更新 Job,无法彻底解决云产品小版本升级问题。目前需要先删除环境中的 Job 之后才能正确执行升级。例如上面例子中的 Job 名称修改为 “db-init-6.2.1” 之后,只会在下一次升级时替换掉原有的 “db-init” Job,后续升级都不会重建 Job,会有以下两个异常场景:
- 如果这个 Job 的镜像版本是跟随 build version 的,或者再次修改了 Job 的 YAML 属性,会导致后续每次升级都失败,错误原因是 Job 某些 YAML 属性不允许更改;
- 如果这个 Job 的 YAML 模板不变,后续只更新了脚本内容,后续每次升级都不会生效。因为每次升级 Job 没有变化,不会被更新。