web-dev-qa-db-ja.com

base64エンコーディング用の複数行json文字列をhelmテンプレートに挿入する

Kubernetesシークレットに必要なbase64エンコード用のヘルムテンプレートに複数行のjson文字列を挿入しようとしています。

目標:

  • ヘルム値は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
Steve Yoon

実際には、ヘルムチャートの秘密をbase64でエンコードする必要はありません。 stringDataフィールドの代わりにdataフィールドを使用すると、Kubernetesは、シークレットのデプロイ時にデータをbase64エンコードする必要があることを認識します。

ドキュメントから( Source ):

シークレットには、2つのマップ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からの読み込み時に出力されることはありません。

5
Technetium

私の印象 (そして他の人もそれを打ったようです) あなたはそれが複数行であること、またはファイルに入れていないことのどちらかで妥協する必要があります。問題は、複数行を取得するために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 }}を使用できます

別のオプションは、値ファイルにjson全体を 置くことです

または、次のようにmyfileエントリを値ファイルに含めることができます。

_myfile:
  item1:
    name: "bob"
  item2:
    name: "fred"
_

そして、それを_myfile.json: {{ .Values.myfile | toJson | b64enc }}_で使用します

2
Ryan Dawson

解決策を見つけました。 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": {
  }
}
1
Steve Yoon