Helm3 - 将 json 文件读入 configmap 会产生一个字符串?

Helm3 - Reading json file into configmap produces a string?

问题:

我想将 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,而不是字符串。

我发现这不仅仅是 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 是从文件创建的。

这似乎不是一个错误,因为 kubectl 在从 ConfigMap:

中提取正确格式的 json 格式没有任何问题
kubectl get cm json-configmap -o jsonpath='{.data.test-json\.json}'

给出正确的输出:

{   
  "key": "val"
}

我会说应用程序有责任从这样的 json 中提取 json 并且它可以是可能以许多不同的方式完成,例如直接调用 kube-api 或使用 serviceaccount 配置为在 Pod.

中使用 kubectl