12

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

目标:

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

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

3 回答 3

29

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

来自文档(Source):

Secret 包含两个地图:datastringData。该data字段用于存储使用 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 读取时从不输出。

于 2019-11-27T20:33:03.880 回答
5

我的印象(以及其他人似乎也遇到了)是你必须在它是多行或不把它放在文件中做出妥协。我认为问题在于您必须使用 yaml 指令(the |-)来获取多行,这是模板本身的一部分,因此您无法从中获取“输出”,然后您可以将其输入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 }}

另一种选择是将整个json放在值文件中

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

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

然后使用它myfile.json: {{ .Values.myfile | toJson | b64enc }}

于 2019-01-11T20:09:25.450 回答
4

我找到了解决方案。您可以在 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-01-15T17:42:51.733 回答