Helm3 - Чтение json файла в configmap дает строку? - PullRequest
0 голосов
/ 06 февраля 2020

Проблема:

Я хочу прочитать 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

static / содержит один файл: test.json:

{
    "key": "val"
}

шаблонов / содержит один файл конфигурации, который читает 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, а не строку.

1 Ответ

2 голосов
/ 07 февраля 2020

Я вижу, что это не специфическое c поведение только для 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 вполне нормально преобразовать исходный json формат в строку , когда из файла создается ConfigMap.

Кажется, это не ошибка, поскольку у kubectl нет проблем с извлечением правильно отформатированного json формата из таких ConfigMap:

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

дает правильный вывод :

{   
  "key": "val"
}

Я бы сказал, что приложение должно извлекать json из такой строки , и это может быть сделано, вероятно, во многих например, прямой вызов kube-api или serviceaccount, настроенный на kubectl в Pod.

...