YamlBox

Статья-путеводитель · 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 сразу же делает это очевидным.

Практичный рабочий процесс

  1. Сначала выполните рендеринг (если Helm): шаблон управления mychart > render.yaml.
  2. Преобразование с поддержкой нескольких документов в массив JSON, чтобы ни один ресурс не был удален.
  3. Сравните с тем, что есть в кластере: kubectl get Deploy Web-App -o JSON по сравнению с инструментом JSON сравнения — важные изменения сразу бросаются в глаза.
  4. Вносите исправления с уверенностью: исправления JSON (RFC 6902) и стратегические исправления слияния легче писать против однозначного JSON.

Оба шага описаны инструментами на этом сайте: от YAML до JSON для преобразования и JSON Diff для сравнения результата с выходными данными kubectl — данные кластера не покидают ваш компьютер.