将多行json字符串插入helm模板以进行base64编码

时间:2019-01-11 19:07:55

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

我正在尝试将多行json字符串插入舵模板中,以实现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 }}

3 个答案:

答案 0 :(得分:3)

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

从文档(Source):

  

“秘密”包含两个映射: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读取时永远不会输出。

答案 1 :(得分:1)

我对(and others seem to have hit it too)的印象是您必须妥善处理多行或不将其放入文件中的问题。我认为问题在于您必须使用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 }}

一起使用

答案 2 :(得分:0)

我找到了解决方案。您可以在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 }}

myfile.json

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