Файл 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() на весь текст работает только с первым документом или падает с ошибкой.
Ручное разбиение файла по строке с дефисами регулярным выражением стоит делать аккуратно, учитывая, что разделитель должен стоять на отдельной строке сам по себе, а не быть частью какого-то значения.