【问题标题】:Multiple Env Variables in Helm ChartsHelm 图表中的多个环境变量
【发布时间】:2020-02-25 17:19:39
【问题描述】:

我已经创建了常见的舵图。在 values.yml 文件中,我有一组环境变量需要设置为 deployment.yaml 文件的一部分。

值文件的片段。

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

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

【问题讨论】:

    标签: kubernetes kubernetes-helm


    【解决方案1】:

    我已经经历了几次关于如何处理设置敏感环境变量的迭代。到目前为止,我想出的最简单的解决方案如下:

    模板:

    {{- 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 }}
    

    缺点:

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

    【讨论】:

    • 另一个缺点:如果你打算使用依赖环境变量,那么使用这种语法会破坏你定义环境变量的顺序,并可能导致这个问题:stackoverflow.com/a/62896111/2832282
    • 关于我上面提到的问题,我同时使用的一种解决方法是拥有与变量依赖级别一样多的 env 顶级键,我在模板中重复声明Values.env、Values.dependentEnv 等
    【解决方案2】:

    这就是我在之前开发的通用 helm-chart 中解决它的方法:

              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 会报错。

    【讨论】:

    • 看起来很有希望,但我遇到了错误(Helm v3.4.1)helm template pact-broker Error: YAML parse error on ${applicationName}/templates/deployment.yaml: error converting YAML to JSON: yaml: line 44: mapping values are not allowed in this context Use --debug flag to render out invalid YAML 这对我来说效果更好stackoverflow.com/a/60098256/535560
    【解决方案3】:

    您好像打错了字,忘记了破折号。如果没有破折号,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 的解释方式并调查语法问题。

    【讨论】:

      【解决方案4】:

      您可以让图表用户决定他是想从秘密中获取环境变量、提供值还是从values.yaml 中的向下 API 获取它

      env: 
        FOO: 
          value: foo
        BAR: 
          valueFrom:
            secretKeyRef:
              name: bar
              key: barKey
        POD_NAME:    
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
      

      并在deployment.yaml中渲染它

      spec:
        # ...
        template:
          # ...
          spec:
            # ...
            containers:
              - name: {{ .Chart.Name }}
                env: 
                  {{- range $name, $item := .Values.env }}
                  - name: {{ $name }}
                    {{- $item | toYaml | nindent 14 }}
                  {{- end }}
                # ...
      

      这个比较简单灵活。

      它的缺点是不保持环境变量的顺序。这可能会破坏dependent environment variables

      我还写了一篇关于如何支持正确排序的长篇文章:An Advanced API for Environment Variables in Helm Charts

      【讨论】:

        猜你喜欢
        • 2020-07-08
        • 2021-04-06
        • 2022-08-17
        • 2020-05-28
        • 2018-09-30
        • 2020-10-20
        • 2019-10-20
        • 2019-03-14
        • 2021-12-29
        相关资源
        最近更新 更多