【问题标题】:Assigning an environment variable's value to a helm variable将环境变量的值分配给 helm 变量
【发布时间】:2020-07-14 20:17:49
【问题描述】:

我是 helm 新手,我希望能够使用配置映射和共享环境变量将 gitlab 项目变量写入文件。

我有一组环境变量定义为每个环境的 gitlab 项目变量(gitlab 运行程序将它们公开为环境变量)(为了简洁起见,<ENV> 是 DEV/TEST/PROD):

MYSQL_USER_<ENV> = "user"
MYSQL_PASSWORD_<ENV> = "pass"

在掌舵图中,每个环境都有其变量的映射。例如 values..yaml 包含:

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_&lt;ENV&gt;保存到MYSQL_USER/PASSWORD,然后写入/etc/my-config-dir/config.rb

我似乎无法让 values.yaml(MYSQL_USERMYSQL_PASSWORD)的环境变量获取项目变量(MYSQL_USER_&lt;ENV&gt;MYSQL_PASSWORD_&lt;ENV&gt;)的。 我使用 helm 3,但 {{ env "MYSQL_USER_&lt;ENV&gt;" }} 失败。 我可以使用带有环境变量名称的字符串插值,它是 Ruby 文件,但是我必须知道应该为每个容器创建哪些环境变量。

我试图避免使用多个 --set 参数。另外我不确定这里如何使用envsubst...

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 我想我必须将环境变量写入文件并导出它们......当我得到这个时,我会创建一个答案。
  • 您可能会发现将变量写成 JSON 文件更方便。 Helm 将接受 helm install -f 选项中的 JSON 格式值文件。 (...因为有效的 JSON 是有效的 YAML。)
  • @DavidMaze 我同意,但不幸的是我必须使用 gitlab 项目变量。

标签: ruby gitlab-ci kubernetes-helm


【解决方案1】:

所以最终我使用了envsubst

  script:
    - VALUES_FILE=values.${ENV}.yaml
    - envsubst < ${VALUES_FILE}.env > ${VALUES_FILE}
    - helm upgrade ... -f ${VALUES_FILE}

【讨论】:

    猜你喜欢
    • 2021-02-26
    • 2021-02-26
    • 2021-09-24
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多