如何通过Values.yaml向依赖的第三方Helm Chart传递checksum/config注解?
解决从values.yaml传入checksum/config注解的问题
首先要明确:Helm不会解析values.yaml中的模板表达式,所以直接把{{ include ... }}写在values里只会被当成字符串输出,无法计算出真实的checksum。下面给出几种可行的解决方案,按推荐程度排序:
方法一:覆盖第三方Chart的模板(最可靠)
如果第三方Chart的资源(比如Deployment)模板中定义了annotations字段,你可以将该模板文件复制到父Chart的templates目录下,然后修改它,直接添加checksum注解:
- 找到第三方Chart中定义annotations的模板文件(比如
charts/mychart/templates/deployment.yaml) - 复制该文件到父Chart的
templates目录下(保持相同的路径结构,比如templates/charts/mychart/deployment.yaml,不同Helm版本可能路径要求略有不同,测试下即可) - 修改复制后的模板,在annotations部分添加checksum计算:
这里用metadata: annotations: {{- if .Values.annotations }} {{- toYaml .Values.annotations | nindent 8 }} {{- end }} checksum/config: {{ include (print $.Parent.Template.BasePath "/configmap.yaml") $.Parent | sha256sum }}$.Parent来引用父Chart的上下文,从而可以调用父Chart的configmap.yaml模板计算checksum。
方法二:使用Helm的Post-Rendering功能(无需修改模板)
Helm支持Post-Rendering,允许你在Helm渲染完所有资源后,用脚本修改生成的YAML文件:
创建一个bash脚本
add-checksum.sh:#!/bin/bash # 计算父Chart中configmap.yaml的checksum CHECKSUM=$(helm template . --show-only templates/configmap.yaml | sha256sum | cut -d' ' -f1) # 给目标资源添加checksum/config注解(这里假设目标是Deployment,可根据实际修改) yq eval 'select(.kind == "Deployment").metadata.annotations."checksum/config" = "'"$CHECKSUM"'"' -注意:需要提前安装
yq工具(v4版本以上)给脚本添加执行权限:
chmod +x add-checksum.sh安装Chart时指定Post-Renderer:
helm install my-release . --post-renderer ./add-checksum.sh
方法三:通过命令行动态传递checksum(适合临时测试)
先手动计算出checksum,再通过--set参数传递给values:
计算父Chart中configmap的checksum:
CHECKSUM=$(helm template . --show-only templates/configmap.yaml | sha256sum | cut -d' ' -f1)安装Chart时传入该值:
helm install my-release . --set mychart.annotations.checksum/config=$CHECKSUM
为什么直接在values.yaml中写表达式不行?
Helm的加载顺序是:先加载values.yaml文件(将所有内容解析为静态字符串/数据结构),再开始渲染模板文件。所以values中的模板表达式不会被执行,只会原样输出为字符串,自然无法得到真实的checksum值。
内容的提问来源于stack exchange,提问作者Sam Alex
相关产品推荐
相关产品推荐

