如何通过YAML文件从多键.env文件创建指定键的Kubernetes Secret
需求与实现方案
问题背景
我有一个包含多键值对的.env文件:
K1=s1 K2=s2 K3=s3 # 其他未知键值对
需要仅基于K1创建Kubernetes Secret,效果等价于执行kubectl create secret generic k1-secret --from-literal="K1=s1",但要满足:
- 从上述多键的
.env文件读取数据 - 不能用命令式指令,必须通过
k1-secret.yaml文件执行kubectl create -f k1-secret.yaml实现
另外,我在GitHub Actions步骤中会拉取GitHub Secrets并保存为.env文件,计划通过Helm Chart实现:在values.yaml里配置需要的键映射,比如:
generic_secret_keys: K1: K1 k2: K2 ....
然后在Helm模板的secrets.yaml中循环遍历这些键,从.env文件取值创建对应Secret。
实现步骤
1. 配置Helm的values.yaml
在你的Helm Chart的values.yaml中,定义需要从.env文件提取的键映射,仅保留K1的示例如下:
generic_secret_keys: K1: K1 # 左侧为Secret内的键名,右侧为.env文件中的对应键名
2. 编写Helm模板secrets.yaml
在Helm Chart的templates/secrets.yaml中,编写模板逻辑,循环读取values中配置的键,并从环境变量(.env文件加载的变量)中取值:
apiVersion: v1 kind: Secret metadata: name: k1-secret type: Opaque data: {{- range $secretKey, $envKey := .Values.generic_secret_keys }} {{ $secretKey }}: {{ getenv $envKey | b64enc }} {{- end }}
getenv $envKey:从环境变量中读取.env文件加载的对应键值b64enc:Kubernetes Secret要求值必须为Base64编码,因此用该函数完成编码
3. GitHub Actions中的执行步骤
在GitHub Actions的Workflow文件中,先加载.env文件的变量,再执行Helm模板渲染和Kubectl创建操作:
steps: # 拉取代码等前置步骤省略 - name: 加载.env文件变量 run: | # 将.env文件的键值对导入当前shell环境 set -a source .env set +a # 可选:验证变量是否加载成功 echo "K1的值为: $K1" - name: 用Helm渲染生成k1-secret.yaml run: helm template my-chart --values values.yaml --output-dir ./rendered # 注意:my-chart需替换为你的Helm Chart实际目录名 - name: 创建Kubernetes Secret run: kubectl create -f ./rendered/templates/secrets.yaml
关键说明
- 用
set -a和source .env可以把.env里的键值对导入到当前shell环境,确保Helm的getenv函数能读取到对应值 - 如果需要提取多个键,只需在
values.yaml的generic_secret_keys中添加对应映射,模板会自动循环生成Secret的键值对
内容的提问来源于stack exchange,提问作者Amin Ba
相关产品推荐
相关产品推荐

