问题:
我想将json文件读到configmap中,因此它看起来像:
apiVersion: v1
kind: ConfigMap
metadata:
name: json-test
data:
test.json: |-
{
"key": "val"
}
代替我得到
apiVersion: v1
kind: ConfigMap
metadata:
name: json-test
data:
test.json: |-
"{\r\n \"key\": \"val\"\r\n}"
我做了什么:
我有以下头盔图:
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2020-02-06 10:51 AM static
d----- 2020-02-06 10:55 AM templates
-a---- 2020-02-06 10:51 AM 88 Chart.yaml
静态/包含一个文件:test.json
:
{
"key": "val"
}
templates /包含一个读取test.json的配置映射:test.yml
:
apiVersion: v1
kind: ConfigMap
metadata:
name: json-test
data:
test.json: |-
{{ toJson ( .Files.Get "static/test.json" ) | indent 4}}
当我运行helm install test . --dry-run --debug
时,得到以下输出
NAME: test
LAST DEPLOYED: Thu Feb 6 10:58:18 2020
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
{}
COMPUTED VALUES:
{}
HOOKS:
MANIFEST:
---
# Source: sandbox/templates/test.yml
apiVersion: v1
kind: ConfigMap
metadata:
name: json-test
data:
test.json: |-
"{\r\n \"key\": \"val\"\r\n}"
这里的问题是我的json用双引号引起来。我想读取json的进程期望使用实际的json,而不是字符串。
我看到这不是仅对helm 3的特定行为。通常,它以这种方式在kubernetes中工作。
我刚刚在kubernetes v1.13上进行了测试。
首先,我基于此文件创建了一个ConfigMap
:
apiVersion: v1
kind: ConfigMap
metadata:
name: json-test
data:
test.json: |-
{
"key": "val"
}
我跑步时:
$ kubectl get configmaps json-test -o yaml
我得到了预期的输出:
apiVersion: v1
data:
test.json: |-
{
"key": "val"
}
kind: ConfigMap
metadata:
...
但是当我基于具有以下内容的json文件创建ConfigMap
时:
{
"key": "val"
}
通过运行:
$ kubectl create configmap json-configmap --from-file=test-json.json
然后我跑步时:
kubectl get cm json-configmap --output yaml
我得到:
apiVersion: v1
data:
test-json.json: " { \n \"key\": \"val\"\n } \n"
kind: ConfigMap
metadata:
...
因此,从文件创建ConfigMap
时,kubernetes将原始json格式转换为string看起来很正常。
[这似乎不是错误,因为kubectl从这样的ConfigMap
中提取格式正确的json格式没有任何问题:
kubectl get cm json-configmap -o jsonpath='{.data.test-json\.json}'
提供正确的输出:
{
"key": "val"
}
我会说能够从这样的string中提取json是应用程序的责任,并且可能可以通过许多不同的方式来完成,例如直接呼叫kube-api
或使用配置为使用serviceaccount
中的kubectl
的Pod
。