Helm3 - чтение json файла в configmap производит строку?

Проблема:

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

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, а не строки.

2 ответа

Решение

Я вижу, что это не специфическое поведение только для Helm 3. В кубернетах это обычно работает.

Я только что протестировал его на 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.

У меня была такая же проблема с форматом, в том числе при создании configmap из файла yaml. Исправление для меня состояло в том, чтобы удалить все конечные пробелы.

Другие вопросы по тегам