Перейти к основному содержимому
Версия: 3.19.0

Доступ к файлам внутри шаблонов

В предыдущем разделе мы рассмотрели несколько способов создания и использования именованных шаблонов. Это упрощает импорт одного шаблона из другого. Однако иногда необходимо импортировать файл, который не является шаблоном, и вставить его содержимое без обработки движком шаблонов.

Helm предоставляет доступ к файлам через объект .Files. Прежде чем мы перейдём к примерам шаблонов, следует учесть несколько особенностей работы этого механизма:

  • В чарт Helm можно добавлять дополнительные файлы. Эти файлы будут включены в пакет чарта. Однако будьте осторожны: из-за ограничений на размер объектов Kubernetes чарты должны быть меньше 1 МБ.
  • Некоторые файлы недоступны через объект .Files, как правило, по соображениям безопасности:
    • Файлы в директории templates/ недоступны.
    • Файлы, исключённые с помощью .helmignore, недоступны.
    • Файлы, находящиеся за пределами приложения Helm — субчарта, включая файлы родительского чарта, недоступны.
  • Чарты не сохраняют информацию о правах доступа UNIX, поэтому права на уровне файлов не влияют на доступность файла через объект .Files.

Базовый пример

Учитывая вышеописанные ограничения, давайте напишем шаблон, который читает три файла и помещает их в 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 для отправки инструкций по завершении установки пользователям вашего чарта.