我正在尝试将多行json字符串插入舵模板中,以实现Kubernetes机密所需的base64编码。
目标:
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 }}
答案 0 :(得分:3)
实际上,您不需要对舵图中的秘密进行base64编码。如果您使用stringData
字段而不是data
字段,则Kubernetes知道它需要根据秘密的部署对数据进行base64编码。
从文档(Source):
“秘密”包含两个映射:
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中,其行为将完全相同。
再次根据文档(重点是我的)(Source):
stringData
允许以字符串形式指定非二进制机密数据。 它是仅写便利方法。所有键和值在写入时都会合并到data
字段中,并覆盖所有现有值。 从API读取时永远不会输出。
答案 1 :(得分:1)
我对(and others seem to have hit it too)的印象是您必须妥善处理多行或不将其放入文件中的问题。我认为问题在于您必须使用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 }}
另一种选择是put the whole json in the values file
或者您可以在值文件中有一个myfile
条目,例如:
myfile:
item1:
name: "bob"
item2:
name: "fred"
然后将其与myfile.json: {{ .Values.myfile | toJson | b64enc }}
答案 2 :(得分:0)
我找到了解决方案。您可以在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": {
}
}