开发者社区 问答 正文

helm发现A应用的tag跟正在运行的A应用的tag不一致,也会进行,更新请教下这种情况如何解释?

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 点击链接欢迎加入感兴趣的技术领域群。

展开
收起
初商 2019-08-13 17:36:36 545 分享 版权
阿里云 AI 助理回答

在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也会试图进行更新以达到配置的一致性。

解决这个问题的方法有几种:

  1. 分隔values.yaml:你可以考虑将不同应用的配置拆分成不同的values文件,比如values-a.yamlvalues-b.yaml等。这样,在升级特定应用时,只传递相关的values文件,减少误操作的风险。

  2. 精确控制升级范围:在执行helm upgrade时,更精确地使用--set--set-string参数来仅覆盖你确实想要更改的值。例如,如果你只想更新B应用的tag,确保只对B应用的相关配置进行设置,避免影响到A应用。

  3. 使用Helm Hooks:虽然在这个场景下直接用Hooks可能不太合适,但了解Helm Hooks可以帮助你在更复杂的部署逻辑中控制哪些资源何时被创建或更新。例如,可以利用pre-upgradepost-upgrade钩子来执行自定义脚本,进一步细化控制流程。

  4. 条件判断:在Chart的templates中,可以通过Go模板语言实现条件判断,使得某些资源只有在特定条件满足时才被渲染和部署。不过,这种方法可能会增加Chart的复杂度。

综上所述,为了防止无意中更新不想改动的服务,最佳实践是尽量隔离和精确控制每次升级的影响范围,通过合理的配置管理和命令行参数使用,确保Helm的操作符合预期。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答