Helm从env文件创建secret



Kubectl提供了一种将环境变量文件转换为秘密文件的好方法:

$ kubectl create secret generic my-env-list --from-env-file=envfile

在Helm中有什么方法可以实现这个吗?我尝试了下面的代码片段,但结果完全不同:

kind: Secret
metadata:
name: my-env-list
data:
{{ .Files.Get "envfile" | b64enc }}

似乎kubectl只是做了简单的事情,只在单个=字符上分裂,所以Helm的方式将是复制该行为(Helm有regexSplit,这将足以满足我们的目的):

apiVersion: v1
kind: Secret
data:
{{ range .Files.Lines "envfile" }}
{{   if . }}
{{     $parts := regexSplit "=" . 2 }}
{{     index $parts 0  }}: {{ index $parts 1 | b64enc }}
{{   end }}
{{ end }}

认为{{ if . }}是因为.Files.Lines返回了一个空字符串,这当然不符合模式

请注意,kubectl的版本接受从helm不支持的环境中查找的裸字,所以如果您的envfile是这样格式化的,这个特定的实现将失败

我想使用env文件,但似乎helm还不支持。你可以用yaml file代替env file

我的意思是从这个env文件

#envfile
MYENV1=VALUE1
MYENV2=VALUE2

到这个yaml文件(检查yaml格式,冒号后面应该总是一个空格)

#envfile.yaml
MYENV1: VALUE1
MYENV2: VALUE2
在此之后,您应该移动在您的helm chart的根文件夹中生成的envfile.yaml(与yaml文件的值级别相同)

你必须设置你的秘密。

apiVersion: v1
kind: Secret
metadata:
name: my-secret
annotations:
checksum/config: {{ (tpl (.Files.Glob "envfile.yaml").AsSecrets . ) | sha256sum }}
type: Opaque
data:
{{- $v := $.Files.Get "envfile.yaml" | fromYaml }}
{{- range $key, $val := $v }}
{{ $key | indent 2 }}: {{ $val | b64enc }}
{{- end}}

我们在生成envfile.yamldata属性中迭代,并将值编码为base64。结果秘密将是下一个:

kubectl get secret my-secret -o yaml

apiVersion: v1
data:
MYENV1: VkFMVUUx
MYENV2: VkFMVUUy
kind: Secret
metadata:
annotations:
checksum/config: 8365925e9f9cf07b2a2b7f2ad8525ff79837d67eb0d41bb64c410a382bc3fcbc
creationTimestamp: "2022-07-09T10:25:16Z"
labels:
app.kubernetes.io/managed-by: Helm
name: my-secret
resourceVersion: "645673"
uid: fc2b3722-e5ef-435e-85e0-57c63725bd8b
type: Opaque

此外,我使用checksum/config注释在每次值更新时更新秘密对象。