如何在Helm中拆分文件以生成多个ConfigMap?
问题描述
众所周知,Kubernetes ConfigMap的大小上限为1MB。我有一个需要以ConfigMap形式传递(而非挂载卷)的文件,路径为helm chart/file/rules.yaml,文件结构如下:
groups: - name: alert-1 rules: - alert: MimirIngesterUnhealthy annotations: message: {{printf "%f" $value }} unhealthy ingester(s). expr: | <expresseion> for: 15m labels: severity: critical - name: alert-2 rules: - alert: MimirIngesterUnhealthy annotations: message: {{printf "%f" $value }} unhealthy ingester(s). expr: | <expresseion> for: 15m labels: severity: critical ... ... - name: alert-n rules: - alert: MimirIngesterUnhealthy annotations: message: {{printf "%f" $value }} unhealthy ingester(s). expr: | <expresseion> for: 15m labels: severity: critical
如果创建单个ConfigMap会超出1MB限制导致安装失败,因此我希望将该文件拆分为多个ConfigMap,每个对应一个告警组,示例如下:
configmap-1--> 包含alert-1的配置 configmap-2--> 包含alert-2的配置
能否仅通过Helm模板或函数实现此需求?注:无法修改etcd的大小限制。
解决方案
完全可以通过Helm模板的循环与数据处理功能实现需求,核心逻辑是读取规则文件中的告警组列表,遍历每个组生成独立的ConfigMap。
具体实现步骤
- 加载并解析规则文件:用Helm的
fromYaml函数将规则文件的字符串内容转为可遍历的对象。 - 遍历生成ConfigMap:通过
range循环遍历每个告警组,为每个组生成单独的ConfigMap资源。 - 构造单组配置内容:为每个ConfigMap构造仅包含当前告警组的YAML结构,保证格式与原文件一致。
示例模板代码
创建templates/alert-configmaps.yaml文件,内容如下:
{{- $rules := fromYaml (include "chart-name.rules-content" .) -}} {{- range $index, $group := $rules.groups }} apiVersion: v1 kind: ConfigMap metadata: name: {{ include "chart-name.fullname" $ }}-alert-{{ $group.name }} labels: {{- include "chart-name.labels" $ | nindent 4 }} data: rules.yaml: | {{- $singleGroup := dict "groups" (list $group) }} {{- toYaml $singleGroup | nindent 4 }} --- {{- end }}
在_helpers.tpl中添加加载规则文件的模板定义:
{{- define "chart-name.rules-content" -}} {{- .Files.Get "file/rules.yaml" | nindent 0 -}} {{- end -}}
关键细节说明
fromYaml:将规则文件的纯文本内容解析为Helm可操作的字典对象,实现对groups数组的遍历。range $index, $group:遍历每个告警组,$group包含当前组的完整配置,$index可用于生成序号类命名。dict "groups" (list $group):构造仅包含当前组的groups数组,确保每个ConfigMap的YAML结构与原文件匹配。toYaml:将构造的单组对象转回YAML字符串,填充到ConfigMap的data.rules.yaml字段中。- 命名规则:示例用告警组名作为ConfigMap名称后缀,也可替换为
{{ $index }}生成序号式名称,根据需求调整。
通过该方案,Helm渲染时会为每个告警组生成独立的ConfigMap,单个ConfigMap大小远低于1MB限制,避免安装失败。
内容的提问来源于stack exchange,提问作者SHC
相关产品推荐
相关产品推荐

