问题描述
目前有一个k8s项目,其中有多个服务由helm chart进行管理。helm chart安装在用户的本地机器上,并希望保持这种方式。但现在用户需要提供一种简单易用的方式,让其他人可以更改某些服务的docker镜像版本。用户考虑创建一个jenkins任务,允许更改这些服务的”image”字段,但这将与helm发布产生冲突:下次使用helm更新时,它会将jenkins的”image”字段更改回helm chart中的值。
用户想知道是否有一种简单的方法来解决这个冲突,比如告诉helm不要更改”image”字段?如果没有,用户如何继续使用helm进行项目配置,同时允许jenkins更改”image”字段?
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
Helm并不是用来这样使用的。如果您希望使用静态部署,最好使用纯Kubernetes清单。这样,更改image字段的人不会破坏您的发布。
您可以通过运行helm get manifest
命令将其轻松转换为静态部署。
Helm用于管理发布版本。也就是说,每次有新的发布(docker镜像更改肯定符合此条件),您都需要对helm chart进行更改。
您还有另一种选择,即将docker镜像定义为一个值。然后,您可以传递一个命令行参数来替换新的镜像标签,并在每次有新的部署时从Jenkins重新运行helm。
示例:
在values.yaml中:
image:
repo: foo
tag: bar
在运行helm时的命令行:
helm upgrade --install my-app --set image.tag=newtag
最后,也是最不推荐的方法是使用可变的标签(例如”master”),并将您的ImagePullPolicy设置为Always。这样,当您有一个部署时,您只需要重启部署/守护进程集/有状态集对象中的所有pod。
方案2
评论:我想我会将我的helm发布移到另一台可以从jenkins访问的主机上,并使用您提供的命令行参数的解决方案。
用户可以将helm发布移到另一台可以从jenkins访问的主机上,并使用命令行参数的解决方案。这样,jenkins就可以更改”image”字段,而不会与helm发布产生冲突。
以上是解决这个冲突的两种方案,用户可以根据自己的需求选择适合的方法。