Kustomize управление манифестами помогает избавиться от дублирования YAML и поддерживать несколько окружений без горы копий. В этой статье разберём, как устроен Kustomize, какие приёмы ускоряют работу с конфигурацией и как внедрить его в привычный рабочий процесс. Материал практический — с понятной логикой и примерами из реальных задач.
Почему Kustomize появился и чем он отличается от шаблонов
Когда в проекте появляются dev, staging и production, манипуляции с YAML превращаются в рутину: меняешь одно поле — мусорится в десяти местах. Kustomize решил эту проблему не шаблонизацией, а декларативной композицией — манифесты остаются валидным YAML, а изменения описываются отдельными слоями.
В отличие от инструментов, которые подставляют переменные или генерируют конфигурацию, Kustomize работает с уже готовыми ресурсами: объединяет их, добавляет патчи и изменяет поля на уровне структуры. Это делает конфигурации проще для ревью и удобнее для поддержки в Git.
Ключевые концепции: базовые ресурсы, overlays и патчи
В основе лежит идея base — набор базовых манифестов, который описывает приложение независимо от окружения. Поверх base накладываются overlays: они содержат изменения, специфичные для окружения, например, другой образ контейнера или конфигурация реплик.
Патчи позволяют целенаправленно изменить часть ресурса, не копируя весь объект. Есть разный синтаксис патчей: strategic merge и JSON 6902; первый удобнее для основных случаев, второй — когда нужно точечное изменение по пути объекта.
Файлы и структура проекта: как организовать kustomize
Стандартная структура выглядит просто и предсказуемо. Обычно есть папка base с kustomization.yaml и несколько overlay-папок типа prod, staging, dev. Такая иерархия минимизирует дублирование и делает изменения локальными.
Ниже — пример таблицы с типичными файлами и их назначением:
| Путь | Назначение |
|---|---|
| base/kustomization.yaml | Список ресурсов, общий для всех окружений |
| base/deployment.yaml | Описание Deployment без окруженческих отличий |
| overlays/staging/kustomization.yaml | Патчи и замены для staging |
| overlays/prod/kustomization.yaml | Патчи и секреты для production |
Практика: как менять image, replicas и сервисы без копирования
Частая задача — переопределить тег образа для конкретного окружения. В overlay вы добавляете поле images с указанием нового тега, и Kustomize подменит значение в Deployment автоматически. Это избавляет от поиска и правки YAML вручную.
Аналогично с replicas: патч в overlay позволяет увеличить число реплик для production, оставив базовую конфигурацию минимальной. Такой подход снижает риск расхождений между версиями и упрощает откат.
Генерация секретов и конфигмапов: преимущества и ограничения
Kustomize умеет генерировать Secret и ConfigMap из файлов или literals. Это удобно для статических файлов конфигурации, которые не должны быть в нескольких местах. Генераторы создают ресурсы с предсказуемыми именами или с хешем, чтобы Kubernetes корректно обновлял поды.
Однако стоит помнить о безопасности: хранить чувствительные данные в репозитории не следует. Для секретов в production лучше интегрировать Kustomize с внешними провайдерами (Sealed Secrets, HashiCorp Vault и т.д.) или использовать внешние генераторы в CI.
Интеграция с GitOps и CI/CD
Kustomize легко вписывается в GitOps-процесс: ветка или каталог в репозитории отражает состояние окружения, а контроллер (например Argo CD) применяет собранные манифесты. Это даёт прозрачен контроль изменений и историю для ревью. В CI обычно задача собрать kustomize build и применить результат в кластер.
В пайплайне имеет смысл проверять итоговые манифесты через kubectl apply —dry-run и тесты схемы, чтобы отлавливать ошибки до релиза. Автоматическая валидация и тесты обеспечивают предсказуемость и уменьшают риск человеческих ошибок.
Советы по оформлению kustomization.yaml
Не перегружайте один kustomization.yaml всем подряд. Разделяйте ответственности: base — только общие ресурсы; overlays — минимальные изменения. Это помогает быстро понять, что именно меняется для каждого окружения.
Используйте именованные patches и описательные комментарии. Хорошая практика — явно указывать, зачем сделан патч и какие поля он меняет. Это экономит время при поиске причин неожиданного поведения в кластере.
Типичные ошибки и как их избежать
Одна из частых ошибок — попытка править base под конкретное окружение. Это приводит к неожиданным побочным эффектам, когда новая feature вдруг оказывается включена в staging. Решение простое: все окруженческие изменения делать в overlays.
Ещё распространённый промах — доверять автоматическим именам ресурсов без понимания, как Kustomize генерирует хэши. Проверяйте итоговые имена и поведение при обновлении, иначе можно получить лишнюю перезагрузку подов или проблемы с обновлением портов.
Сравнение с альтернативами
Helm остаётся популярным выбором для пакетов, поскольку умеет шаблонизировать сложную логику и управлять релизами. Но Helm добавляет слой рендеринга и иногда усложняет ревью. Kustomize сохраняет YAML читабельным и предсказуемым, что подходит для простых и средних по сложности приложений.
Иногда имеет смысл сочетать инструменты: использовать Helm для сложных chart’ов и Kustomize для легких наложений. Такой гибрид позволяет взять лучшее из обоих миров без излишней сложности.
Мой опыт: как это помогло в проекте
В одном из проектов у нас была монолитная конфигурация с тремя окружениями и множеством сервисов. Мы ввели Kustomize, вынесли общие части в base и сделали overlays для каждого окружения. Через несколько недель стало видно уменьшение конфликтов в Git и ускорение развертываний.
Особенно ценно оказалось единообразие: новые разработчики быстро понимали, где менять параметр для staging, а ревью манифестов перестали растягиваться. Патчи позволили сохранить контроль над изменениями без дублирования YAML.
Небольшая шпаргалка: команды и порядок действий
Основные команды просты: kustomize build выводит финальные манифесты, kubectl apply -k применяет их. В CI часто используют kustomize build | kubectl apply -f — для атомарного билда и деплоя.
- Создайте base с минимальным набором ресурсов.
- Добавьте overlays для каждого окружения с патчами и images.
- Проверяйте итоговые манифесты и автоматизируйте в CI.
Когда Kustomize не подходит
Если ваша конфигурация требует сложной логики ветвления и вычислений — например, динамическая генерация множества вариаций ресурсов — шаблонизаторы вроде Helm или генераторы на языке могут быть удобнее. Kustomize сильнее в простоте и прозрачности, а не в выражении сложной логики.
Ещё один ограничивающий фактор — управление секретами: встроенные генераторы не заменяют хранилище секретов. Для больших проектов придётся интегрировать Kustomize с внешними инструментами безопасности.
Подытоживая: Kustomize управление манифестами — это инструмент для тех, кто хочет избавиться от копий YAML и сделать изменения декларативными и локальными. Он не решит все задачи, но в большинстве случаев упрощает жизнь и делает конфигурацию предсказуемой и удобной для командной работы.

