簡體   English   中英

將多行 json 字符串插入 helm 模板以進行 base64 編碼

[英]Insert multiline json string into helm template for base64 encoding

我正在嘗試將多行 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 }}

您實際上不需要對掌舵圖中的秘密進行 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 中,它的行為將完全相同。

再次,從文檔(強調我的)來源):

stringData允許以字符串形式指定非二進制秘密數據。 它是作為只寫方便的方法提供的。 所有鍵和值在寫入時合並到data字段中,覆蓋任何現有值。 從 API 讀取時從不輸出。

我的印象(和其他人似乎也遇到了它)是你必須妥協,要么是多行,要么是不把它放在一個文件中。 我認為問題在於您必須使用 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 }} {{ tpl (.Files.Get "files/myfile.json") . | b64enc | quote }}

另一種選擇是將整個 json 放在值文件中

或者您可以在您的值文件中有一個myfile條目,例如:

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM