1

问题:

我想将一个 json 文件读入一个配置映射,所以它看起来像:

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

static/ 包含一个文件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,而不是字符串。

4

1 回答 1

2

我看到这不仅仅是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:
...

但是当我ConfigMap使用以下内容创建基于 json 的文件时:

{   
      "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:
...

所以看起来 kubernetes在从文件创建a 时将原始的json 格式转换为字符串是很正常的。ConfigMap

这似乎不是一个错误,因为 kubectl 从以下内容中提取正确格式化的 json 格式没有任何问题ConfigMap

kubectl get cm json-configmap -o jsonpath='{.data.test-json\.json}'

给出正确的输出:

{   
  "key": "val"
}

我想说的是,能够从这样的字符串中提取json是应用程序的责任,并且可以通过许多不同的方式来完成,例如直接调用或使用配置为使用in 。kube-apiserviceaccountkubectlPod

于 2020-02-07T19:21:29.437 回答