【发布时间】:2020-07-14 20:17:49
【问题描述】:
我是 helm 新手,我希望能够使用配置映射和共享环境变量将 gitlab 项目变量写入文件。
我有一组环境变量定义为每个环境的 gitlab 项目变量(gitlab 运行程序将它们公开为环境变量)(为了简洁起见,<ENV> 是 DEV/TEST/PROD):
MYSQL_USER_<ENV> = "user"
MYSQL_PASSWORD_<ENV> = "pass"
在掌舵图中,每个环境都有其变量的映射。例如 values.
envVars:
MYSQL_USER: $MYSQL_USER_<ENV>
MYSQL_PASSWORD: $MYSQL_PASSWORD_<ENV>
values.yaml 包含一个 Ruby 文件,它将使用这些变量:
files:
config.rb: |
mysql['username'] = ENV["MYSQL_USER"]
mysql['password'] = ENV["MYSQL_PASSWORD"]
configmap.env.yaml 定义:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "mychart.fullname" . }}-config-env
data:
{{- range $config_key, $config_value := .Values.envVars }}
{{ $config_key }}: {{ $config_value | quote | nindent 4 }}
{{- end }}
configmap.files.yaml 定义:
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "mychart.fullname" . }}-config-volume
data:
{{- range $file_path, $file_content := .Values.files }}
{{ $file_path }}: |
{{ $file_content | indent 4 -}}
{{- end }}
最后是配置图的部署(这里只展示了配置图部分,这里我不使用秘密,因为这个问题已经够长了):
volumes:
- name: {{ include "mychart.fullname" . }}-config-volume
configMap:
name: {{ include "mychart.fullname" . }}-config-volume
containers:
- name: {{ .Chart.Name }}
volumeMounts:
- name: {{ include "mychart.fullname" . }}-config-volume
mountPath: /etc/my-config-dir
envFrom:
- configMapRef:
name: {{ include "mychart.fullname" . }}-config-env
所以,一句话,工作流程应该是:
MYSQL_USER/PASSWORD_<ENV>保存到MYSQL_USER/PASSWORD,然后写入/etc/my-config-dir/config.rb
我似乎无法让 values.yaml(MYSQL_USER、MYSQL_PASSWORD)的环境变量获取项目变量(MYSQL_USER_<ENV>、MYSQL_PASSWORD_<ENV>)的值。
我使用 helm 3,但 {{ env "MYSQL_USER_<ENV>" }} 失败。
我可以使用带有环境变量名称的字符串插值,它是 Ruby 文件,但是我必须知道应该为每个容器创建哪些环境变量。
我试图避免使用多个 --set 参数。另外我不确定这里如何使用envsubst...
任何帮助将不胜感激,谢谢!
【问题讨论】:
-
我想我必须将环境变量写入文件并导出它们......当我得到这个时,我会创建一个答案。
-
您可能会发现将变量写成 JSON 文件更方便。 Helm 将接受
helm install -f选项中的 JSON 格式值文件。 (...因为有效的 JSON 是有效的 YAML。) -
@DavidMaze 我同意,但不幸的是我必须使用 gitlab 项目变量。
标签: ruby gitlab-ci kubernetes-helm