Что такое манифест Kubernetes и из каких основных полей он состоит

Ответ

Манифест 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, где ты по-человечески описываешь: «Хочу вот это, в таком количестве, и чтобы работало так-то». Кластер потом сам бегает и пытается сделать мир похожим на твою бумажку. Магия, блядь, а не технология.

В каждой такой бумажке есть четыре главных раздела, без них нихуя не получится. Запомни, как «Отче наш», если хочешь, чтобы твой под не отправился в цифровое небытие:

  1. apiVersion — Это типа как версия закона, по которому ты пишешь заявление. Для разных сущностей в кубере — разные версии API. apps/v1, v1 — выглядит как хуйня, но если перепутаешь, кластер тебя пошлёт нахуй с ошибкой.
  2. kind — А это кого ты вообще создаёшь? Deployment, Pod, Service... Это как в анкете выбрать: «я гражданин», «я ИП» или «я бомж». От этого зависит, что писать дальше.
  3. metadata — Ну тут всё просто, ебать. Имя даёшь (name) и можешь наклеить стикеров (labels), чтобы потом в куче всего этого говна найти именно свой под. Без имени — вообще пипец, кто ты такой, безымянный дух?
  4. 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>. Он прочитает, подумает своим железным мозгом «ёпта, ну ладно» и начнёт городить то, что ты просил. Если что-то пойдёт не так — он тебе внятно наёрничает, что ты опять, мудак, где-то пробел лишний поставил или отступ не тот.