Helm子chart如何检测父chart部署的ConfigMap变更并触发Pod重启
问题根因
你当前的报错存在两个问题:
$.Files.Get只能读取当前执行的子Chart根目录下的文件,父Chart存储的configmaps/myproduct.yaml不在子Chart的文件搜索路径内,自然读取不到- 语法逻辑错误:
include函数的第一个参数需要是模板名称,你直接把Files.Get返回的文件内容传给include,本身就会触发模板解析错误
可行解决方案
方案1:父Chart传递校验和(推荐,无场景限制)
这是适配全场景的标准实现,逻辑是父Chart计算好ConfigMap的校验和,再传递给子Chart使用:
- 在子Chart的
values.yaml中新增预留字段:
# 子Chart values.yaml # 父Chart传入的外部ConfigMap校验和 externalConfigChecksum: ""
- 在父Chart引用子Chart的配置中,计算校验和并传入:
# 父Chart values.yaml 中覆盖子Chart配置的部分 your-subchart-name: # 替换为实际的子Chart名称 externalConfigChecksum: {{ .Files.Get "configmaps/myproduct.yaml" | sha256sum }}
- 修改子Chart Deployment的annotation配置:
annotations: checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} checksum/config1: {{ .Values.externalConfigChecksum }}
后续只要父Chart修改了myproduct.yaml的内容,校验和会自动更新,触发子Chart的Pod滚动重启。
方案2:使用lookup函数查询集群资源(适配已有部署场景)
如果不想修改父Chart配置,可以直接用Helm的lookup函数查询集群中已存在的目标ConfigMap,计算其内容的校验和:
annotations: checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }} checksum/config1: {{ sha256sum (toJson ((lookup "v1" "ConfigMap" .Release.Namespace "my-product").data | default dict)) }}
注意该方案有个限制:首次同时部署父Chart的ConfigMap和子Chart时,lookup会找不到还未创建的ConfigMap,会用空字典计算校验和,第二次执行升级命令时就会恢复正常。
内容的提问来源于stack exchange,提问作者Matvey Nefedov
相关产品推荐
相关产品推荐

