Helm中能否遍历目录下的资源清单实现批量渲染部署?
Helm Chart 批量渲染多份目录资源实现方案
完全可以实现,不需要在每个独立清单文件里写重复循环逻辑,核心利用Helm的文件加载规则和内置模板函数即可,是生产环境验证过的稳妥方案:
目录结构调整
首先把需要批量部署的单个资源清单,统一放到templates下以下划线开头的子目录中,比如templates/_thingy_resources/。
注意:Helm 加载模板时会自动跳过所有名称以下划线
_开头的文件/目录,不会直接渲染这些路径下的yaml,避免资源被重复渲染或上下文缺失报错。
这个目录下每个文件对应一个独立的K8s资源,不需要写任何range循环,直接写单个资源的模板内容即可,比如:
templates/_thingy_resources/configmap.yaml存ConfigMap模板templates/_thingy_resources/pv.yaml存PV模板templates/_thingy_resources/pvc.yaml存PVC模板- 后续新增资源直接往这个目录丢对应单资源模板即可,不需要改其他公共逻辑
单个资源模板里直接引用上下文即可,以ConfigMap为例:
apiVersion: v1 kind: ConfigMap metadata: name: {{ .thingy.name }}-config namespace: {{ .Release.Namespace }} data: app.conf: | instance_id={{ .thingy.id }} listen_port={{ .thingy.port }}
编写唯一的批量渲染入口
在templates根目录新建一个入口模板文件,比如templates/thingies-render.yaml,这里只需要写一次range循环逻辑,自动遍历上面目录下的所有资源文件,逐个传入当前遍历的thingy实例上下文完成渲染:
{{- range $thingy := .Values.thingies }} {{- /* 遍历资源目录下的所有yaml清单 */ -}} {{- range $path, $_ := $.Files.Glob "templates/_thingy_resources/*.yaml" }} {{- /* 传入全局上下文+当前批量实例上下文,渲染单个资源 */ -}} {{- tpl ($.Files.Get $path) (dict "Values" $.Values "Release" $.Release "Chart" $.Chart "Files" $.Files "thingy" $thingy) }} --- {{- end }} {{- end }}
关键说明
- 所有批量循环逻辑只在入口文件写一次,后续新增/修改/删除单个资源,只需要调整
_thingy_resources目录下的对应文件即可,不需要动循环逻辑 tpl函数支持在单个资源模板里正常使用所有Helm内置函数、自定义命名模板,和普通模板的使用体验完全一致- 每个资源渲染完成后拼接
---做YAML文档分隔,避免多个资源内容拼接导致语法错误 - 如果需要递归遍历子目录下的资源,把Glob匹配规则改成
templates/_thingy_resources/**/*.yaml即可
可选优化:抽离为公共命名模板
如果你的批量渲染逻辑需要被多个不同的组件复用,可以把入口的循环逻辑抽到templates/_helpers.tpl里定义为命名模板,其他场景直接调用即可,不需要重复写循环代码。
内容的提问来源于stack exchange,提问作者Vorticity
相关产品推荐
相关产品推荐

