通过解析外部INI文件在Helm中创建Secret

后端开发 2026-07-09

我需要通过解析文件中的键和值来从外部INI文件的内容创建Secret对象(不包含节信息)。例如,使用以下Secret文件,

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: my-secret
data:
  .env: {{ .Values.secretPath | b64enc | quote }}

我希望在 helm install --set-file secrePath=~/.aws/credentials 期间创建该Secret

解决方案

这有几个原因让实现变得困难。

再次强调 @ChrisBecke的回答,因为你似乎确实在谈论AWS凭证:从Kubernetes获取Secret值其实很容易,例如对 kubectl get secret -o yaml 进行base64解码,或者启动一个临时Pod将其挂载后打印出来。AWS凭证通常具有相当强的权限,如果滥用会带来高成本。我会考虑在这里采用其他方式提供凭证,或许可以使用EKS的内置系统,或者像kube2iam这样的工具。

helm install --set-file secrePath=~/.aws/credentials

Helm只能 访问文件 从图表目录(并且不能读取 templates 目录中的文件);它不能从宿主机系统或你的家目录中读取任意文件。

... from external INI file content by parsing the keys and values from the file ....

Go的 text/template语言在某种程度上是有些受限的,即便结合 Helm的扩展(包括大部分的 Sprig 库)。你几乎可以做成任何事,但会感到挫败,而且会包含大量大括号。如果一个 .ini 文件是一系列行,每行都包含一个 key=value 对,那么你可以这样做,例如:

data:
{{-/* Remember: base64 encoding is trivial to decode, and any secret
      you inject this way can be easily extracted from your cluster. */-}}
{{- range .Files.get .Values.iniFile | splitList "\n" -}}
{{- $kvs := splitList "=" . -}}
{{- if gt (len $kvs) 1 -}}
{{- $k := first $kvs -}}
{{- $v := rest $kv | join "=" }}
  $k: {{ b64enc $v }}
{{- end -}}
{{- end -}}

这会跳过至少没有一个 = 标记的行,包括空行和TOML风格的节头。因此,结构会丢失;如果该文件在不同的节中有重复的键,将会产生重复的Secret键。

Helm内置了用于解析外部YAML和 JSON文件的辅助函数(同样,这些文件也必须位于chart目录中,而不能放在 templates 目录),但不支持其他文件格式。因此如果你也能控制输入,为这个目的你可以考虑将数据存储为这些格式之一,而不是ini/TOML格式。你也可以考虑使用外部工具解析该文件,并创建一个YAML(或等价的JSON)文件,将其作为值传给 helm install -f,以直接使用,无需进行复杂的模板化。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章