Статья-путеводитель · 5 минута чтения
Безопасное преобразование Kubernetes YAML в JSON
Преобразование Kubernetes YAML в JSON происходит на границе API: Kubernetes говорит на JSON, а YAML — это удобный уровень, который kubectl и его клиентские библиотеки преобразуют за вас — поэтому понимание преобразования важно, когда что-то идет не так.
Обновлено
От Kubernetes от YAML до JSON: зачем вообще конвертировать?
- Отладка с использованием фактической формы API: когда поле отклонено, JSON показывает именно то, что видит сервер, без двусмысленности ввода YAML.
- Питающие конвейеры: многие инструменты (системы политики, сценарии CI, конвейеры jq) потребляют JSON более комфортно, чем YAML.
- Различие визуализированного вывода: сравнение двух выпусков Helm с JSON делает изменения типа видимыми — классическая ошибка «истина не является «истиной»».
- Документация и обучение: фигурные скобки JSON делают вложение spec.template.spec.containers безошибочным.
Проблема с несколькими документами
Файл манифеста обычно содержит множество ресурсов, разделенных ---: пространство имен, ConfigMap, развертывание, служба, вход, HPA. Наивный преобразователь YAML в JSON считывает первый документ и молча удаляет остальные — действительно опасный режим отказа для работы инфраструктуры. Хорошие преобразователи создают массив JSON, по одному элементу на документ, и сообщают вам, сколько они нашли.
Helm, привязки и «почему в моих выводах нет привязок?»
Якоря YAML и псевдонимы могут выполнять дедупликацию блоков внутри одного файла. Шаблоны Helm идут дальше — они вообще не являются YAML, пока не отрендерены. Конвертируйте только обработанный вывод (шаблон Helm / манифест Helm), а не необработанный файл шаблона. Объединение якорей в их значения — правильное поведение: JSON не имеет псевдонимов, поэтому преобразователь должен их разыменовать.
Ловушки при наборе текста
- Логические значения: версии и имена типа «y», «yes», «on» являются логическими значениями в YAML 1.1. В Kubernetes тег изображения типа «on» или версия типа «1.10» является классическим случаем скрытой коррупции — всегда цитируйте их в источнике.
- Порты и ресурсы:ContainerPort: 8080 — целое число; Строка «8080» будет отклонена значением API для типизированных полей. JSON сохраняет четкое различие.
- Объемы памяти: 128Mi — это строка в обоих форматах — правильно, потому что она анализируется по Kubernetes, а не по YAML.
- Значения среды: значения env представляют собой строки по спецификации; значение: 3000 в YAML становится числом 3000, которое API отклоняет. Это одна из наиболее распространенных ошибок манифеста, и вывод JSON сразу же делает это очевидным.
Практичный рабочий процесс
- Сначала выполните рендеринг (если Helm): шаблон управления mychart > render.yaml.
- Преобразование с поддержкой нескольких документов в массив JSON, чтобы ни один ресурс не был удален.
- Сравните с тем, что есть в кластере: kubectl get Deploy Web-App -o JSON по сравнению с инструментом JSON сравнения — важные изменения сразу бросаются в глаза.
- Вносите исправления с уверенностью: исправления JSON (RFC 6902) и стратегические исправления слияния легче писать против однозначного JSON.
Оба шага описаны инструментами на этом сайте: от YAML до JSON для преобразования и JSON Diff для сравнения результата с выходными данными kubectl — данные кластера не покидают ваш компьютер.