Ооочень распространенная боль новичков:
Я скопировал YAML из документации, поменял пару строк — и получил ошибку mapping values are not allowed here. Что не так?
Спойлер: в 90% случаев - лишний пробел. Но за такой мелочью стоит целая философия работы с Kubernetes. Сегодня разберемся с этим😎
YAML (YAML Ain't Markup Language) - формат сериализации данных, человекочитаемая альтернатива JSON. Kubernetes использует его как основной способ описания желаемого состояния кластера
Когда мы пишем
kubectl apply -f deployment.yaml, то мы передаем кластеру: «Вот какое состояние я хочу видеть», а Kubernetes, в свою очередь, сам разбирается, как к этому состоянию прийтиЛюбой YAML-файл в Kubernetes имеет строго определённую структуру. Примерно вот такую:
apiVersion: apps/v1 # Версия API, в которой описан объект
kind: Deployment # Тип объекта (Pod, Service, Deployment...)
metadata: # Метаданные: имя, namespace, лейблы
name: my-app
namespace: production
labels:
app: backend
spec: # Спецификация — "что мы хотим"
replicas: 3
selector: ...
template: ...
status: # Статус — "что есть на самом деле" (только для чтения)
availableReplicas: 3
Ооочень важно! После
status мы ничего никогда не пишем сами. Его заполняет контроллер на основе реального состояния. А вот нам нужно заполнить только spec, то есть желаемое состояниеБолее того, у YAML есть две ключевые концепции: декларативность и идемпотентность
Декларативность: ты описываешь что ты хочешь, а не как это сделать. Не «создай 3 пода», а «пусть всегда будет 3 пода»
Идемпотентность: `kubectl apply -f file.yaml ` можно запустить 1 раз, 10 раз или 1000 раз - результат будет одинаковым. Если состояние уже соответствует желаемому, Kubernetes ничего не изменит
А теперь к подводным камням:
• Отступы - синтаксис. В YAML нельзя использовать табы, только пробелы (обычно 2). Один лишний пробел и весь документ поломался
• Регистр имеет значение. `apiVersion `и `apiversion `- это разные вещи
• Многострочные строки. Используй `|` для сохранения переносов или `>` для схлопывания в одну строку
