Доступ до файлів всередині шаблонів
У попередньому розділі ми розглянули кілька способів створення та доступу до іменованих шаблонів. Це полегшує імпорт одного шаблону в інший шаблон. Але іноді корисно імплементувати файл, який не є шаблоном і вбудувати його вміст без використання рендерера шаблонів.
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: |-
bWVzc2FnZSA9IEhlbGxvIGZyb20gY29uZmlnIDEK
Рядки
Іноді потрібно отримати доступ до кожного рядка файлу у вашому шаблоні. Ми надаємо зручний метод 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
, для надсилання інструкцій після установки користувачам вашого чарту.