Errors
Kubernetes

Kubernetes: How to create ConfigMap from directory using helm

Ты сидишь и смотришь на папку `postman` с тремя JSON-файлами. Нужно запихнуть их в ConfigMap через Helm. В голове сразу всплывает знакомая команда `kubectl crea

Ты сидишь и смотришь на папку postman с тремя JSON-файлами. Нужно запихнуть их в ConfigMap через Helm. В голове сразу всплывает знакомая команда kubectl create configmap --from-file. Она работает, она простая. Но ты же не на голом kubectl разворачиваешь, у тебя тут целый Helm-чарт, всё должно быть красиво и в YAML.

И начинается: гугление, попытки впихнуть --from-file в values.yaml, осознание что так не работает. Знакомо?

Простой путь, который не подходит

Да, через kubectl это делается в одну строку:

kubectl create configmap test-config --from-file=postman/

Получаешь готовый ConfigMap. Можно даже вывести его в YAML и вставить в шаблон. Но это ручной workaround, а не решение. При каждом изменении файлов нужно повторять процедуру. Это не наш метод.

Магия Helm-шаблонов: .Files.Glob

Helm не оставляет своих в беде. В его арсенале есть функция Files.Glob. Она умеет читать файлы из директории templates/ чарта. Вот ключ к решению.

Чтобы создать ConfigMap со всеми JSON-файлами из папки postman, пишем в шаблоне (например, templates/configmap.yaml):

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-config
data:
  {{- (.Files.Glob "postman/**.json").AsConfig | nindent 2 }}

Всё. Это работает.

Что здесь происходит?

"postman/**.json" — это паттерн. Две звезды ** означают “любой уровень вложенности в этой папке”. Можно использовать "postman/*.json", если файлы лежат прямо в postman/.

.Files.Glob возвращает объект со всеми найденными файлами. Метод .AsConfig преобразует их содержимое в нужный для ConfigMap формат, где ключом будет имя файла, а значением — его содержимое.

Модификатор | nindent 2 отвечает за отступы, чтобы YAML оставался валидным.

Важные нюансы

Файлы должны находиться внутри директории чарта. Обычно их кладут рядом с templates/, а в шаблоне указывают относительный путь.

Если нужно выбрать не все файлы или файлы с другим расширением, просто измените паттерн в Glob. Например, "postman/*.yaml" или "configs/*.conf".

Этот подход — каноничный способ решения задачи в Helm. Он declarative, он идемпотентный, и он хранится в git. Что ещё нужно для счастья?

Итог

Забываем про ручной kubectl create configmap --from-file для файлов внутри чарта. Открываем документацию Helm, пишем три строчки в шаблоне и спим спокойно. Инструмент должен работать на инженера, а не наоборот.