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