Что такое Pod в Kubernetes?

Ответ

Pod — это наименьшая и простейшая единица развертывания в Kubernetes. Это абстракция над одним или несколькими контейнерами, которые всегда размещаются вместе на одном узле и разделяют общие ресурсы.

Ключевые характеристики Pod, которые я учитываю в работе:

  1. Общее сетевое пространство: Все контейнеры внутри Pod имеют один IP-адрес и могут общаться друг с другом через localhost. Они также совместно используют пространство портов, поэтому контейнеры не могут использовать один и тот же порт.
  2. Общее хранилище: Pod может определять набор томов (volumes), которые доступны для всех контейнеров внутри него. Это позволяет контейнерам обмениваться данными.
  3. Единый жизненный цикл: Pod создается, запускается и удаляется как единое целое. Контейнеры внутри Pod запускаются параллельно, а не последовательно.

Типичные сценарии использования Pod'ов:

  • Один контейнер: Наиболее распространенный шаблон, где Pod является оберткой вокруг одного контейнера приложения.
  • Вспомогательные контейнеры (sidecar): Например, основной контейнер веб-сервера и sidecar-контейнер, который синхронизирует файлы из внешнего хранилища.

Пример манифеста Pod с двумя контейнерами (основным и sidecar):

apiVersion: v1
kind: Pod
metadata:
  name: web-app-with-log-shipper
spec:
  volumes:
  - name: shared-logs
    emptyDir: {}
  containers:
  - name: web-app
    image: myapp:latest
    volumeMounts:
    - name: shared-logs
      mountPath: /var/log/myapp
  - name: log-shipper
    image: fluentd:latest
    volumeMounts:
    - name: shared-logs
      mountPath: /var/log/myapp

Важно: В реальной практике Pod'ы редко создаются напрямую. Вместо этого я использую контроллеры более высокого уровня, такие как Deployment или StatefulSet, которые управляют созданием, репликацией и состоянием Pod'ов, обеспечивая отказоустойчивость и масштабируемость приложения.

Ответ 18+ 🔞

Давай разберем эту вашу модульную единицу, Pod, без всей этой заумной пыли в глаза. Представь, что Pod — это как маленькая квартира-студия в огромном доме под названием Kubernetes.

Если на пальцах, то Pod — это такая общажная банка, куда ты можешь поселить один или несколько контейнеров, и они будут жить душа в душу, как соседи по коммуналке.

Что у них там общего, эти бедолаги в одной банке:

  1. Сеть одна на всех: У всей этой банки один-единственный IP-адрес на всех. Контейнеры внутри могут болтать между собой по localhost, как будто в одной комнате. Но порты, блять, делить не могут — представь, что у вас одна розетка на всех, и два чайника сразу не воткнёшь. Доверия ебать ноль, что они не начнут драться за порт 8080.
  2. Хранилище общее: Можно прикрутить к этой банке общий том (volume) — типа общего холодильника или шкафа. Один контейнер пишет логи, другой из этого же шкафа их читает и куда-то отправляет. Удобно, хитрая жопа.
  3. Судьба одна: Рождается, живёт и помирает Pod целиком. Контейнеры внутри стартуют все разом, а не по очереди. Если один накрылся медным тазом и умер — ну, значит, и вся банка считается кривой.

Где эту хуйню применяют:

  • Один контейнер: Чаще всего так и есть. Один чувак в однокомнатной квартире. Скучно, зато без конфликтов.
  • Sidecar-контейнеры (эти ваши "боковые тележки"): Вот тут уже веселее. Например, основной контейнер — твой веб-сервер, а рядом к нему прицеплен второй, маленький и юркий, который эти логи из общего тома хватает и шлёт прямиком в Elasticsearch. Ёперный театр, а удобно!

Вот смотри, как выглядит эта коммуналка в коде (этот кусок не трогаю, он святой):

apiVersion: v1
kind: Pod
metadata:
  name: web-app-with-log-shipper
spec:
  volumes:
  - name: shared-logs
    emptyDir: {}
  containers:
  - name: web-app
    image: myapp:latest
    volumeMounts:
    - name: shared-logs
      mountPath: /var/log/myapp
  - name: log-shipper
    image: fluentd:latest
    volumeMounts:
    - name: shared-logs
      mountPath: /var/log/myapp

Видишь? Два контейнера (web-app и log-shipper) сидят в одном Pod'е и маунтят один и тот же том shared-logs. Один пишет, другой забирает. Ебушки-воробушки, просто и гениально.

Но! Главный секрет, о котором все молчат: в нормальной жизни Pod'ы руками почти не создают. Это как собирать процессор из транзисторов — можно, но терпения ноль ебать. Вместо этого используют всякие Deployment или StatefulSet. Это такие умные надсмотрщики, которые сами создают эти банки-под'ы, следят, чтобы их было нужное количество, и если одна банка вдруг впиздюрилась и умерла, они тут же создают новую, идентичную. Вот так-то.