Ответ
Манифест Kubernetes — это конфигурационный файл в формате YAML (реже JSON), который декларативно описывает желаемое состояние объекта в кластере, например, Deployment, Service или Pod.
Каждый манифест содержит четыре обязательных поля верхнего уровня:
apiVersion: Версия API Kubernetes, используемая для создания объекта (например,apps/v1,v1).kind: Тип создаваемого объекта (например,Deployment,Pod,Service).metadata: Данные, помогающие уникально идентифицировать объект, включаяname(имя) иlabels(метки).spec: Спецификация желаемого состояния объекта. Содержимое этого поля зависит отkind.
Пример манифеста для Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2 # Желаемое количество работающих копий Pod'а
selector:
matchLabels:
app: nginx # Deployment будет управлять Pod'ами с этой меткой
template: # Шаблон для создания Pod'ов
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21.6
ports:
- containerPort: 80
Манифест применяется к кластеру с помощью команды kubectl apply -f <имя-файла.yaml>.
Ответ 18+ 🔞
Давай разжую тебе эту тему, как будто мы на кухне сидим и я пытаюсь объяснить, пока водку не налили.
Вот смотри, есть у тебя кластер куберов, и чтобы ему что-то приказать, ты не кричишь на него, как на пьяного соседа. Ты пишешь ему бумажку — манифест. Это такой файлик, обычно в формате YAML, где ты по-человечески описываешь: «Хочу вот это, в таком количестве, и чтобы работало так-то». Кластер потом сам бегает и пытается сделать мир похожим на твою бумажку. Магия, блядь, а не технология.
В каждой такой бумажке есть четыре главных раздела, без них нихуя не получится. Запомни, как «Отче наш», если хочешь, чтобы твой под не отправился в цифровое небытие:
apiVersion— Это типа как версия закона, по которому ты пишешь заявление. Для разных сущностей в кубере — разные версии API.apps/v1,v1— выглядит как хуйня, но если перепутаешь, кластер тебя пошлёт нахуй с ошибкой.kind— А это кого ты вообще создаёшь?Deployment,Pod,Service... Это как в анкете выбрать: «я гражданин», «я ИП» или «я бомж». От этого зависит, что писать дальше.metadata— Ну тут всё просто, ебать. Имя даёшь (name) и можешь наклеить стикеров (labels), чтобы потом в куче всего этого говна найти именно свой под. Без имени — вообще пипец, кто ты такой, безымянный дух?spec— А вот это, сука, самое интересное! Это «спецификация», или, по-русски, «хотелки». Здесь ты расписываешь по пунктам, какого хуя ты хочешь. Сколько копий (replicas), какой образ (image) запускать, какие порты открыть. Содержимое этого поля полностью зависит от того, что ты написал вkind.
Вот, смотри, живой пример. Хочешь запустить два энжикса? Пишешь такую молитву:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 2 # Хочу две штуки, блядь! Одна упадёт — вторая подхватит.
selector:
matchLabels:
app: nginx # Буду командовать только теми подами, у кого на лбу стикер "app: nginx"
template: # А вот и инструкция, как такого пода слепить
metadata:
labels:
app: nginx # Вешаю на каждый созданный под этот самый стикер
spec:
containers:
- name: nginx
image: nginx:1.21.6 # Беру конкретный образ, а не "самый последний", ибо так охуенно сюрпризов не будет
ports:
- containerPort: 80 # И слушать он будет на 80-м порту, как приличный веб-сервер
Написал эту простыню? Отлично. Теперь суёшь её куберу командой kubectl apply -f <имя-твоего-файла.yaml>. Он прочитает, подумает своим железным мозгом «ёпта, ну ладно» и начнёт городить то, что ты просил. Если что-то пойдёт не так — он тебе внятно наёрничает, что ты опять, мудак, где-то пробел лишний поставил или отступ не тот.