Доступ до файлів всередині шаблонів
У попередньому розділі ми розглянули кілька способів створення та доступу до іменованих шаблонів. Це полегшує імпорт одного шаблону в інший шаблон. Але іноді корисно імплементувати файл, який не є шаблоном і вбудувати його вміст без використання рендерера шаблонів.
Helm надає доступ до файлів через обʼєкт .Files. Перш ніж переходити до прикладів шаблонів, є кілька моментів, які слід врахувати:
- Можна додавати додаткові файли до вашого Helm чарту. Ці файли будуть упаковані. Але будьте обережні. Чарти мають бути меншими за 1М через обмеження зберігання обʼєктів Kubernetes.
- Деякі файли не можна отримати через обʼєкт
.Files, зазвичай з міркувань безпеки.- Файли в
templates/не можна отримати. - Файли, виключені за допомогою
.helmignore, не можна отримати. - Файли поза Helm-застосукном subchart, включаючи файли батьківського чарту, не можна отримати.
- Файли в
- Чарти не зберігають інформацію про режим 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
У вас є кілька варіантів з Globs:
{{ $currentScope := .}}
{{ range $path, $_ := .Files.Glob "**.yaml" }}
{{- with $currentScope}}
{{ .Files.Get $path }}
{{- end }}
{{ end }}
Або
{{ range $path, $_ := .Files.Glob "**.yaml" }}
{{ $.Files.Get $path }}
{{ end }}
Утиліти для ConfigMap і Secrets
(Доступні з Helm 2.0.2 і пізніше)
Дуже часто потрібно помістити вміст файлів як у ConfigMaps, так і в Secrets, для монтування в ваші 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 }}
Кодування
Ви можете імплементувати файл і змусити шаблон закодувати його в base-64, щоб забезпечити успішну передачу:
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 для цього.
Ви можете перебрати 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, для надсилання інструкцій після установки користувачам вашого чарту.