【问题标题】:Insert multiline json string into helm template for base64 encoding将多行 json 字符串插入 helm 模板以进行 base64 编码
【发布时间】:2019-06-06 17:39:25
【问题描述】:

我正在尝试将多行 json 字符串插入到 helm 模板中,以实现 Kubernetes 机密所需的 base64 编码。

目标:

  • helm 值被注入到 json 字符串中
  • 多行json字符串必须使用b64enc进行base64编码

myfile1.json 不起作用,但 myfile2.json 起作用。 我不想把整个 json 文件放在values.yaml

apiVersion: v1
kind: Secret
metadata:
  name: {{ template "mychart.fullname" . }}
  labels:
    app: {{ template "mychart.name" . }}
    chart: {{ template "mychart.chart" . }}
    release: {{ .Release.Name }}
    heritage: {{ .Release.Service }}
type: Opaque
data:
  myfile.json: {{ |-
    {
      "item1": {
          "name": "{{ .Values.item1.name }}"
      },
      "item2": {
      }
    } | b64enc }}
  myfile2.json: {{ .Values.myfile2 | b64enc }}

【问题讨论】:

    标签: json kubernetes yaml kubernetes-helm kubernetes-secrets


    【解决方案1】:

    您实际上不需要对 helm 图表中的秘密进行 base64 编码。如果您使用 stringData 字段而不是 data 字段,Kubernetes 知道它需要在密钥部署时对数据进行 base64 编码。

    来自文档 (Source):

    The Secret 包含两张地图:datastringDatadata 字段用于存储任意数据,使用 base64 编码。 stringData 字段是为了方便而提供的,它允许您以未编码字符串的形式提供秘密数据。

    所以我们可以使用 stringData 而不是 data 重写您的秘密,并在模板中保留多行 json 字符串,如下所示:

    apiVersion: "v1"
    kind: "Secret"
    metadata:
      name: {{ template "mychart.fullname" . }}
      labels:
        app: {{ template "mychart.name" . }}
        chart: {{ template "mychart.chart" . }}
        release: {{ .Release.Name }}
        heritage: {{ .Release.Service }}
    type: "Opaque"
    stringData:
      myfile.json: |-
        {
          "item1": {
              "name": "{{ .Values.item1.name }}"
          },
          "item2": {
          }
        }
      myfile2.json: {{ .Values.myfile2 }}
    

    请注意,这并不意味着您突然需要担心有未编码的秘密。 stringData 最终会在安装时进行 base64 编码并转换为 data,因此一旦加载到 Kubernetes 中,其行为将完全相同。

    再次,来自文档(强调我的) (Source):

    stringData 允许以字符串形式指定非二进制机密数据。 它作为一种只写的便捷方法提供。 所有键和值在写入时合并到data 字段中,覆盖任何现有值。 从 API 读取时从不输出。

    【讨论】:

      【解决方案2】:

      我对@9​​87654321@ 的印象是,您必须在多行或不将其放入文件中做出妥协。我认为问题在于您必须使用 yaml 指令(|-)来获取多行,这是模板本身的一部分,因此您无法以某种方式从中获取“输出”输入b64enc

      如果这是一个 ConfigMap,您就不需要输入 b64enc,所以它很简单:

        myfile.json: |
          {
            "item1": {
                "name": "{{ .Values.item1.name }}"
            },
            "item2": {
            }
          }
      

      或者,如果您要在单行方法上妥协,那么可能是:

      myfile.json: {{ tpl ("{ 'item1': { 'name': '{{ .Values.item1.name }}' }, 'item2': { } }") . | toJson | b64enc }}

      如果它来自文件,那么您可以使用 {{ tpl (.Files.Get "files/myfile.json") . | b64enc | quote }}

      另一个选择是put the whole json in the values file

      或者你可以在你的值文件中有一个myfile 条目,例如:

      myfile:
        item1:
          name: "bob"
        item2:
          name: "fred"
      

      然后和myfile.json: {{ .Values.myfile | toJson | b64enc }}一起使用

      【讨论】:

        【解决方案3】:

        我找到了解决方案。您可以在 json 文件上使用 tpl 函数来渲染模板。

        apiVersion: v1
        kind: Secret
        metadata:
          name: {{ template "mychart.fullname" . }}
          labels:
            app: {{ template "mychart.name" . }}
            chart: {{ template "mychart.chart" . }}
            release: {{ .Release.Name }}
            heritage: {{ .Release.Service }}
        type: Opaque
        data:
          myfile.json: {{ tpl(.Files.Get "myfile.json") . | b64enc }}
        

        我的文件.json

        {
          "item1": {
            "name": "{{ .Values.item1.name }}"
          },
          "item2": {
          }
        }
        

        【讨论】:

          猜你喜欢
          • 2019-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-29
          • 2017-02-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多