Секреты в шаблонах
Что нужно знать перед уроком
- M4.05 — CLI Nelm целиком — нужны команды chart secret из CLI для практики этого урока
Что нужно знать перед уроком
M4 урок 2 — устройство .helm/secret-values.yaml/.helm/secret/. Этот урок — практическое руководство «когда какой подход применять» в реальных шаблонах.
Теория
.Values.password — маленькие отдельные значения
| |
| |
Подход через secret-values.yaml уместен, когда у вас есть набор отдельных небольших значений (пароли, токены, API-ключи) — они естественно вписываются в структуру, аналогичную обычному values.yaml, доступны через тот же .Values-объект, легко компонуются с обычными (незашифрованными) значениями в одном шаблоне.
{{ werf_secret_file "config.yaml" }} — целые файлы
| |
Подход через .helm/secret/ + werf_secret_file уместен для целых файлов — сертификатов, приватных ключей, крупных конфигурационных файлов (например, готовый config.yaml внешнего инструмента, который приложение читает целиком, а не по отдельным значениям). Пытаться уместить содержимое сертификата как одно многострочное значение в secret-values.yaml технически возможно (YAML поддерживает multiline-строки), но неудобно для редактирования/ревью и не соответствует конвенции — .helm/secret/ явно предназначен именно для файлового случая.
Практическое правило выбора
| Критерий | secret-values.yaml | secret/ + werf_secret_file | |
|---|---|---|---|
| Тип данных | Отдельное значение (строка, число) | Целый файл | |
| Типичный пример | Пароль БД, API-токен | TLS-сертификат, приватный ключ, крупный конфиг стороннего формата | |
| Синтаксис доступа | .Values.path.to.value (как обычное значение) | werf_secret_file "filename" (отдельная функция) | |
Кодирование для data: | Обычно уже готовая строка | Часто требует ` | b64enc` явно |
Частые ошибки и подводные камни
- Пытаться использовать
werf_secret_fileдля значений изsecret-values.yaml. Это разные механизмы:werf_secret_fileчитает файлы из.helm/secret/, а не значения изsecret-values.yaml— попытка передать туда имя, ожидая значение, приведёт к ошибке «файл не найден». - Забыть
| b64encпри вставке содержимого файла в полеdata:объектаSecret. Полеdata:(в отличие отstringData:) Kubernetes ожидает в base64 — без явного кодирования манифест будет синтаксически валиден, но приложение получит не то, что ожидало (Kubernetes попытается интерпретировать не-base64-строку как уже закодированную и может исказить итоговое значение). - Хранить крупные файлы как значения в
secret-values.yamlвместо.helm/secret/. Формально работает, но затрудняет редактирование черезnelm chart secret values-file edit(весь файл открывается целиком в редакторе) — для отдельных крупных файлов удобнееnelm chart secret file edit <filename>.
Практика в кластере
Практики в кластере в этом уроке нет — фокус на паттернах шаблонизации секретов.
Практика разработки
- Добавьте оба типа секретов для Vikunja — пароль БД (значение) и TLS-сертификат для внутреннего сервиса (файл):
| |
- Создайте оба шаблона:
| |
| |
- Отрендерите оба шаблона и убедитесь, что оба типа секретов появляются в открытом виде в финальном манифесте (это ожидаемо на этапе Render — расшифровка в памяти для формирования конечного манифеста, который затем применяется как обычный Kubernetes
Secret):
| |
Шпаргалка команд урока
| |
{{ .Values.<path> }} # значение из secret-values.yaml
{{ werf_secret_file "<filename>" | b64enc }} # содержимое файла из secret/
Вопросы для самопроверки
secret-values.yaml естественно подходит для отдельных небольших значений, доступных через привычный .Values.
Источник: Deckhouse — Nelm-аннотации
werf_secret_file читает файл целиком, в отличие от отдельных значений через .Values.
Источник: Deckhouse — Nelm-аннотации
data: требует base64; stringData: — открытый текст, который Kubernetes сам кодирует.
Источник: Kubernetes — Secrets
file edit работает с отдельным файлом из secret/, values-file edit — с целым secret-values.yaml.
Источник: Nelm — README на GitHub
Это два разных механизма с разными источниками данных — путать их вызовет ошибку 'файл не найден'.
Источник: Deckhouse — Nelm-аннотации
Рекомендуемая литература
Официальная документация
Статьи и блоги
- Вышла werf 2.0: новый движок развёртывания Nelm — Flant на Habr.
- Представляем werf 1.0 stable: GitOps и Helm — Flant на Habr.
- GitLab + K8s + Werf — Habr.
Книги
- Matt Butcher, Matt Farina, Josh Dolitsky. Learning Helm. 2019. ISBN 978-1492036781.
Связанные материалы
- Предыдущий урок: M4.05 — CLI Nelm целиком.
- Следующий модуль: M5 — Разработка Application: глубокое погружение, урок 1 — Анатомия пакета Application целиком.
- Полный список шаблонных функций: M7 урок 7.
✓ Урок пройден — все вопросы самопроверки отвечены верно