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. Исправление для меня состояло в том, чтобы удалить все конечные пробелы.