Доступ к файлам внутри шаблонов
В предыдущем разделе мы рассмотрели несколько способов создания и использования именованных шаблонов. Это упрощает импорт одного шаблона из другого. Однако иногда необходимо импортировать файл, который не является шаблоном, и вставить его содержимое без обработки движком шаблонов.
Helm предоставляет доступ к файлам через объект .Files. Прежде чем мы перейдём к примерам шаблонов, следует учесть несколько особенностей работы этого механизма:
- В чарт Helm можно добавлять дополнительные файлы. Эти файлы будут включены в пакет чарта. Однако будьте осторожны: из-за ограничений на размер объектов Kubernetes чарты должны быть меньше 1 МБ.
- Некоторые файлы недоступны через объект
.Files, как правило, по соображениям безопасности:- Файлы в директории
templates/недоступны. - Файлы, исключённые с помощью
.helmignore, недоступны. - Файлы, находящиеся за пределами приложения Helm — субчарта, включая файлы родительского чарта, недоступны.
- Файлы в директории
- Чарты не сохраняют информацию о правах доступа UNIX, поэтому права на уровне файлов не влияют на доступность файла через объект
.Files.
- Базовый пример
- Вспомогательные функции для путей
- Glob-паттерны
- Вспомогательные функции для ConfigMap и Secret
- Кодирование
- Строки
Базовый пример
Учитывая вышеописанные ограничения, давайте напишем шаблон, который читает три файла и помещает их в ConfigMap. Для начала добавим три файла в чарт, разместив их непосредственно в директории mychart/.
config1.toml:
message = "Hello from config 1"
config2.toml:
message = "This is config 2"
config3.toml:
message = "Goodbye from config 3"
Каждый из этих файлов представляет собой простой TOML-файл (напоминает старые INI-файлы Windows). Мы знаем имена этих файлов, поэтому можем использовать функцию range для перебора и вставки их содержимого в ConfigMap.
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
{{- $files := .Files }}
{{- range tuple "config1.toml" "config2.toml" "config3.toml" }}
{{ . }}: |-
{{ $files.Get . }}
{{- end }}
В этом ConfigMap используются несколько техник, рассмотренных в предыдущих разделах. Например, мы создаём переменную $files для хранения ссылки на объект .Files. Также мы используем функцию tuple для создания списка файлов, по которому выполняем перебор. Затем выводим имя каждого файла ({{ . }}: |-), а за ним — содержимое файла {{ $files.Get . }}.
Выполнение этого шаблона создаст один ConfigMap с содержимым всех трёх файлов:
# Source: mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: quieting-giraf-configmap
data:
config1.toml: |-
message = "Hello from config 1"
config2.toml: |-
message = "This is config 2"
config3.toml: |-
message = "Goodbye from config 3"
Вспомогательные функции для путей
При работе с файлами часто бывает полезно выполнять стандартные операции над путями. Для этого Helm импортирует многие функции из пакета Go path. Все они доступны с теми же именами, что и в Go, но с первой буквой в нижнем регистре. Например, Base становится base и так далее.
Импортированные функции:
- Base
- Dir
- Ext
- IsAbs
- Clean
Glob-паттерны
По мере роста вашего чарта может возникнуть потребность в лучшей организации файлов. Для этого мы предоставляем метод Files.Glob(pattern string), который помогает извлекать определённые файлы с гибкостью glob-паттернов.
.Glob возвращает объект типа Files, поэтому вы можете вызывать любые методы Files на возвращённом объекте.
Например, представим следующую структуру директорий:
foo/:
foo.txt foo.yaml
bar/:
bar.go bar.conf baz.yaml
С glob-паттернами у вас есть несколько вариантов:
{{ $currentScope := .}}
{{ range $path, $_ := .Files.Glob "**.yaml" }}
{{- with $currentScope}}
{{ .Files.Get $path }}
{{- end }}
{{ end }}
Или
{{ range $path, $_ := .Files.Glob "**.yaml" }}
{{ $.Files.Get $path }}
{{ end }}
Вспомогательные функции для ConfigMap и Secret
(Доступно начиная с Helm 2.0.2)
Очень часто возникает необходимость помещать содержимое файлов в ConfigMap и Secret для монтирования в Pod'ы во время выполнения. Для этого мы предоставляем несколько вспомогательных методов для типа Files.
Для лучшей организации особенно полезно использовать эти методы совместно с методом Glob.
Используя структуру директорий из примера Glob-паттернов:
---
apiVersion: v1
kind: ConfigMap
metadata:
name: conf
data:
{{ (.Files.Glob "foo/*").AsConfig | indent 2 }}
---
apiVersion: v1
kind: Secret
metadata:
name: very-secret
type: Opaque
data:
{{ (.Files.Glob "bar/*").AsSecrets | indent 2 }}
Кодирование
Вы можете импортировать файл и закодировать его в base64 в шаблоне для обеспечения успешной передачи:
apiVersion: v1
kind: Secret
metadata:
name: {{ .Release.Name }}-secret
type: Opaque
data:
token: |-
{{ .Files.Get "config1.toml" | b64enc }}
Этот пример возьмёт тот же файл config1.toml, который мы использовали ранее, и закодирует его:
# Source: mychart/templates/secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: lucky-turkey-secret
type: Opaque
data:
token: |-
bWVzc2FnZSA9ICJIZWxsbyBmcm9tIGNvbmZpZyAxIgo=
Строки
Иногда бывает необходимо получить доступ к каждой строке файла в шаблоне. Для этого мы предоставляем удобный метод Lines.
Вы можете выполнить перебор строк с помощью функции range:
data:
some-file.txt: {{ range .Files.Lines "foo/bar.txt" }}
{{ . }}{{ end }}
Невозможно передать файлы извне чарта во время выполнения helm install. Поэтому, если вы хотите, чтобы пользователи предоставили данные, их необходимо загрузить с помощью helm install -f или helm install --set.
На этом мы завершаем изучение инструментов и техник написания шаблонов Helm. В следующем разделе мы рассмотрим, как использовать специальный файл templates/NOTES.txt для отправки инструкций по завершении установки пользователям вашего чарта.