首页 > 解决方案 > 将多行 json 字符串插入 helm 模板以进行 base64 编码

问题描述

我正在尝试将多行 json 字符串插入到 helm 模板中,以进行 Kubernetes 机密所需的 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 }}

标签: jsonkubernetesyamlkubernetes-helmkubernetes-secrets

解决方案


您实际上不需要对 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 读取时从不输出。


推荐阅读