舵图中的多个Env变量

时间:2019-10-30 11:56:41

标签: kubernetes kubernetes-helm

我创建了常见的舵图。在 values.yml 文件中,我有一组env变量,需要将它们设置为Deployment.yaml文件的一部分。

值文件的片段。

env:
  name: ABC
  value: 123
  name: XYZ
  value: 567
  name:  PQRS
  value: 345

在deployment.yaml中,当引用值时,仅设置姓氏/值,其他值将被覆盖。如何读取/设置部署文件中的所有名称/值?

3 个答案:

答案 0 :(得分:0)

这是我在以前开发的通用舵图中解决它的方法:

          env:
            {{- if .Values.env }}
            {{- toYaml .Values.env | indent 12 }}
            {{- end }}

在values.yaml中:

env:
- name: ENV_VAR
  value: value
# or
- name: ENV_VAR
  valueFrom:
    secretKeyRef:
      name: secret_name
      key: secret_key

这里要注意的重要一点是缩进。不正确的缩进可能会导致有效的helm-chart(yaml文件),但是kubernetes API会给出错误。

答案 1 :(得分:0)

我已经经历了如何处理设置敏感环境变量的一些迭代。到目前为止,以下是最简单的解决方案:

模板:

{{- if or $.Values.env $.Values.envSecrets }}
env:
  {{- range $key, $value := $.Values.env }}
  - name: {{ $key }}
    value: {{ $value | quote }}
  {{- end }}
  {{- range $key, $secret := $.Values.envSecrets }}
  - name: {{ $key }}
    valueFrom:
      secretKeyRef:
        name: {{ $secret }}
        key: {{ $key | quote }}
  {{- end }}
{{- end }}

值:

env:
  ENV_VAR: value
envSecrets:
  SECRET_VAR: k8s-secret-name

优点:

语法非常简单

键很容易合并。当创建带有共享机密的CronJobs时,这很有用。我可以使用以下命令轻松覆盖“全局”值:

  {{- range $key, $secret := merge (default dict .envSecrets) $.Values.globalEnvSecrets }}

缺点:

这仅适用于与环境变量名称完全匹配的秘密密钥,但这似乎是典型的用例。

答案 2 :(得分:0)

您好像打错了字,忘记了破折号。如果没有破折号,yaml会将env评估为单个对象而不是列表,并以意想不到的方式覆盖值。

您的env应该更像这样:

env:
- name: ABC
  value: 123
- name: XYZ
  value: 567
- name:  PQRS
  value: 345
- name: SECRET
  valueFrom:
    secretKeyRef:
      name: name
      key: key

https://www.convertjson.com/yaml-to-json.htm可以帮助可视化如何解释yaml并调查语法问题。