Kustomize — это инструмент, позволяющий пользователям «настраивать простые и свободные от шаблонов файлы YAML под различные цели, оставляя оригинальный YAML нетронутым и пригодным для использования» (описание позаимствовано из репозитория kustomize на GitHub).
Kustomize можно запускать как отдельный бинарник или использовать встроенную в kubectl функциональность через флаг -k (доступен начиная с Kubernetes 1.14). Важно отметить: отдельный бинарник, как правило, обновляется быстрее, чем версия, встроенная в kubectl, поэтому в сложных сценариях может потребоваться именно standalone-версия .
В своей простейшей форме Kustomize — это набор ресурсов (YAML-файлов, определяющих объекты Kubernetes: Deployments, Services и т.д.) плюс список инструкций по изменениям, которые необходимо внести в эти ресурсы. Подобно тому, как make использует инструкции из Makefile, а Docker собирает контейнер на основе Dockerfile, Kustomize использует kustomization.yaml для хранения предписаний о том, какие изменения пользователь хочет внести в набор ресурсов .
Базовый пример и его актуализация
Исторический пример из оригинальной статьи выглядел так:
resources:
- deployment.yaml
- service.yaml
namePrefix: dev-
namespace: development
commonLabels:
environment: developmentВажное обновление: поле commonLabels было объявлено устаревшим (deprecated) начиная с версии Kustomize v5.0.0. На смену ему пришло поле labels, которое позволяет более гибко управлять добавлением меток — в частности, не инжектировать их автоматически в селекторы ресурсов . Для автоматической миграции можно выполнить команду kustomize edit fix.
Актуализированный эквивалент приведённого выше примера:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
namePrefix: dev-
namespace: development
labels:
- pairs:
environment: development
includeSelectors: trueОбратите внимание на includeSelectors: true: оно воспроизводит поведение старого commonLabels, добавляя метку и в селекторы. Однако следует помнить, что менять селекторы уже применённых в кластере ресурсов (Deployments, Services) не рекомендуется — это может привести к сбоям, поскольку поле spec.selector у Deployment является неизменяемым . Если метка нужна только для идентификации, а не для связывания селекторов, includeSelectors можно опустить (по умолчанию false).
Краткое объяснение актуальных полей:
resources — указывает, какие ресурсы будет обрабатывать Kustomize (файлы deployment.yaml и service.yaml в текущем каталоге или относительные пути к ним).
namePrefix — добавляет префикс (в данном случае dev-) к атрибуту name всех ресурсов. Например, nginx-deployment превратится в dev-nginx-deployment.
namespace — добавляет указанное пространство имён ко всем ресурсам.
labels — добавляет набор меток ко всем ресурсам. В отличие от устаревшего commonLabels, позволяет управлять тем, попадут ли метки в селекторы (includeSelectors) и в шаблоны Pod’ов (includeTemplates) .
Сборка и применение
Если выполнить kustomize build . в директории с kustomization.yaml и необходимыми ресурсами, на выходе получится итоговый YAML с учётом всех трансформаций. Вывод детерминирован: при одинаковых входных данных результат всегда будет одним и тем же, поэтому сохранять его в файл необязательно — можно сразу передать в kubectl:
kustomize build . | kubectl apply -f -Или, используя встроенную в kubectl функциональность (начиная с Kubernetes 1.14):
kubectl apply -k .Флаг -k фактически заменяет собой kustomize build | kubectl apply -f -, что делает его удобным для повседневного использования .
Зачем это нужно: проблема форков и overlays
Читатели могут спросить: «Зачем нужны все эти сложности, если можно отредактировать файлы напрямую?» В простом примере действительно можно модифицировать deployment.yaml и service.yaml вручную. Но что, если они являются форком чьего-либо проекта? Прямое редактирование затрудняет (если вообще не делает невозможным) rebase форка при обновлении исходника. Kustomize позволяет централизовать изменения в kustomization.yaml, оставив оригинальные файлы нетронутыми.
Преимущества становятся очевидны в сценариях с базовой конфигурацией и множеством её вариантов — так называемыми overlays. Предположим, есть базовая директория с ресурсами nginx и три окружения: development, staging и production.
Структура каталогов:
- base
- deployment.yaml
- service.yaml
- kustomization.yaml
- overlays
- dev
- kustomization.yaml
- staging
- kustomization.yaml
- prod
- kustomization.yamlВ base/kustomization.yaml просто объявляются ресурсы:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yamlВ каждом из overlays/{dev,staging,prod}/kustomization.yaml пользователи ссылаются на базовую конфигурацию в поле resources и указывают изменения для конкретного окружения. Например, overlays/dev/kustomization.yaml (актуализированная версия):
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namePrefix: dev-
namespace: development
labels:
- pairs:
environment: development
includeSelectors: trueА overlays/prod/kustomization.yaml может выглядеть иначе:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namePrefix: prod-
namespace: production
labels:
- pairs:
environment: production
sre-team: blue
includeSelectors: trueПри запуске kustomize build . в каталоге overlays/dev генерируется development-вариант, а в overlays/prod — production-вариант. И всё это — без внесения каких-либо изменений в исходные файлы, декларативным и детерминированным способом. Базовую конфигурацию и overlay-директории можно коммитить в систему управления версиями, зная, что в любой момент можно воспроизвести нужную конфигурацию.
Что изменилось с 2019 года: краткий обзор
Помимо замены commonLabels на labels, стоит упомянуть несколько ключевых эволюций, которые делают Kustomize более мощным и удобным инструментом в 2026 году:
- Поле
patchesзаменило устаревшиеpatchesStrategicMergeиpatchesJson6902. Теперь можно применять как стратегические merge-патчи, так и JSON-патчи (JSON 6902) через единое поле, указывая цель патча с помощью селекторов (group, version, kind, name, namespace, labelSelector). - Генераторы
configMapGeneratorиsecretGeneratorпозволяют создавать ConfigMap и Secret из литералов или файлов. Имя сгенерированного ресурса включает хеш содержимого, поэтому при изменении данных Deployment автоматически перезапускается — это особенно удобно для GitOps-сценариев& - Поле
replicasдаёт простой способ изменения количества реплик без написания патчей: достаточно указать имя ресурса и желаемое количество. - Поле
imagesпозволяет изменять имена образов, теги или дайджесты без редактирования Deployment. - Компоненты (
components) — механизм переиспользования наборов трансформаций между overlays, который появился уже после выхода оригинальной статьи и снижает дублирование в сложных конфигурациях. - Интеграция с Helm через
helmCharts(ранееhelmChartInflationGenerator) позволяет рендерить Helm-чарты как базу для дальнейшей кастомизации в Kustomize. Это популярный паттерн: Helm используется только для рендеринга сторонних чартов, а Kustomize (часто в связке с Argo CD или Flux) — для применения и управления жизненным циклом ресурсов.
Заключение
Kustomize умеет гораздо больше, чем рассказано в этой статье, но надеюсь, что она послужит хорошим введением. Главная идея осталась неизменной с 2019 года: декларативная кастомизация YAML без шаблонов, с сохранением исходных файлов нетронутыми и возможностью воспроизвести любую конфигурацию в любой момент.
Дополнительные ресурсы






