Kubernetesシークレットに必要なbase64エンコード用のヘルムテンプレートに複数行の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 ):
シークレットには、2つのマップ
data
とstringData
が含まれています。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 }}
を使用できます
別のオプションは、値ファイルにjson全体を 置くことです
または、次のようにmyfile
エントリを値ファイルに含めることができます。
_myfile:
item1:
name: "bob"
item2:
name: "fred"
_
そして、それを_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 }}
myfile.json
{
"item1": {
"name": "{{ .Values.item1.name }}"
},
"item2": {
}
}