~/guides/multi-document-yaml-kubernetes

YAML

Многодокументный YAML: как устроены Kubernetes-манифесты в одном файле

Как разделитель из трёх дефисов позволяет хранить Deployment, Service и ConfigMap в одном applyable.yaml, и как разобрать такой файл на части.

Файл applyable.yaml из шаблона проекта содержит Deployment, Service и ConfigMap подряд, и всё это применяется одной командой kubectl apply. Выглядит как один YAML документ, но на самом деле это несколько независимых документов, просто записанных в один физический файл.

Разделитель из трёх дефисов

Три дефиса на отдельной строке — это официальный разделитель документов в спецификации YAML, а не какая-то придумка Kubernetes. Всё, что до первого разделителя, до второго и так далее — это отдельные, полностью независимые YAML документы, каждый со своей собственной структурой данных.

kind: Deployment metadata: name: web

kind: Service metadata: name: web-svc

kind: ConfigMap metadata: name: web-config

Почему kubectl понимает это правильно

kubectl apply -f applyable.yaml разбирает файл именно как множество независимых документов, применяя каждый по отдельности к кластеру. Инструмент не пытается слить их в один общий объект — если бы он это делал, поля Deployment и Service начали бы конфликтовать друг с другом.

Частая ошибка при написании инструментов вокруг YAML

Если писать собственный скрипт обработки такого файла и наивно вызвать обычный парсер YAML один раз на весь текст, велик шанс получить только первый документ или ошибку парсинга, потому что многие простые обёртки над YAML-библиотеками по умолчанию ожидают ровно один документ в строке ввода, а не несколько подряд.

Ситуация Что произойдёт Как правильно
Обычный parse() на весь текст с несколькими документами Вернёт только первый документ либо упадёт с ошибкой Использовать функцию, специально предназначенную для множества документов, например loadAll в js-yaml
Ручное разбиение по строке с тремя дефисами Может сломаться на дефисах внутри строковых значений Использовать регулярное выражение, учитывающее, что разделитель должен быть на отдельной строке
Файл с одним документом без разделителей вообще Обрабатывается как обычно, разделитель не обязателен Код должен корректно работать и без единого разделителя в файле

Как быстро разобрать такой файл на части глазами

Открывать длинный applyable.yaml и искать глазами границы между Deployment и Service неудобно, особенно если манифест уже разросся до сотни строк. YAML Multi-Document Splitter разбирает файл по разделителям и показывает каждый документ отдельно, уже в разобранном виде.

Итоговый чеклист

Разделитель из трёх дефисов — это стандарт самой спецификации YAML, а не специфика Kubernetes, и kubectl использует именно эту особенность формата.

Многодокументный YAML требует специальной функции парсинга вроде loadAll, обычный однократный parse() на весь текст работает только с первым документом или падает с ошибкой.

Ручное разбиение файла по строке с дефисами регулярным выражением стоит делать аккуратно, учитывая, что разделитель должен стоять на отдельной строке сам по себе, а не быть частью какого-то значения.