10多个微服务,全部helm化 image地址和tag模板都写进values.yaml. 我发现我用jenkins去调用helm upgrade 去更新B应用. 由于values.yamlj里面A应用的tag版也是用helm upgrade --set去替换的tag 实际不会修改,这个时候helm发现A应用的tag跟正在运行的A应用的tag不一致,也会进行更新 请教下这种情况如何解释?
本问题来自阿里云开发者社区的【11大垂直技术领域开发者社群】。https://developer.aliyun.com/article/706511 点击链接欢迎加入感兴趣的技术领域群。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Helm中,当你使用helm upgrade
命令时,Helm会比较Chart的当前状态(包括values.yaml中定义的配置)与集群中已部署的Release。如果发现任何差异,Helm默认会尝试更新这些差异,以使实际部署与新的Chart配置保持一致。
你提到的情况是,即使A应用的tag没有通过--set
显式改变,但由于values.yaml中包含了所有微服务的image地址和tag模板,当执行针对B应用的helm upgrade
时,Helm会检查整个values.yaml文件的内容。如果它检测到A应用的tag在values.yaml中有定义但与集群中运行的实例不匹配,即使这个不匹配是因为之前的操作导致而非本次升级所意图修改的,Helm也会试图进行更新以达到配置的一致性。
解决这个问题的方法有几种:
分隔values.yaml:你可以考虑将不同应用的配置拆分成不同的values文件,比如values-a.yaml
、values-b.yaml
等。这样,在升级特定应用时,只传递相关的values文件,减少误操作的风险。
精确控制升级范围:在执行helm upgrade
时,更精确地使用--set
或--set-string
参数来仅覆盖你确实想要更改的值。例如,如果你只想更新B应用的tag,确保只对B应用的相关配置进行设置,避免影响到A应用。
使用Helm Hooks:虽然在这个场景下直接用Hooks可能不太合适,但了解Helm Hooks可以帮助你在更复杂的部署逻辑中控制哪些资源何时被创建或更新。例如,可以利用pre-upgrade
或post-upgrade
钩子来执行自定义脚本,进一步细化控制流程。
条件判断:在Chart的templates中,可以通过Go模板语言实现条件判断,使得某些资源只有在特定条件满足时才被渲染和部署。不过,这种方法可能会增加Chart的复杂度。
综上所述,为了防止无意中更新不想改动的服务,最佳实践是尽量隔离和精确控制每次升级的影响范围,通过合理的配置管理和命令行参数使用,确保Helm的操作符合预期。