Для чего нужен Pod в Kubernetes?

«Для чего нужен Pod в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Pod — это базовая единица выполнения в Kubernetes, которую я, как DevOps-инженер, конфигурирую и управляю ею. Это не контейнер, а "обертка" для одного или нескольких контейнеров, которые должны работать вместе как единое целое.

Ключевые концепции и сценарии использования:

  1. Совместное использование ресурсов: Контейнеры внутри одного Pod:

    • Разделяют одно сетевое пространство (общий IP-адрес, localhost, порты).
    • Могут монтировать одни и те же тома (volumes) для обмена данными.
    • Могут общаться через Inter-Process Communication (IPC).
  2. Паттерн "Sidecar": Самый частый случай нескольких контейнеров в Pod. Основное приложение работает вместе со вспомогательным. Например:

    • Nginx + Log Shipper: Контейнер с приложением и контейнер с Fluentd/Fluent Bit, который собирает и отправляет его логи.
    • Web Server + Config Reloader: Контейнер с веб-сервером и контейнер, который следит за изменениями в ConfigMap и перезагружает конфигурацию.

Пример манифеста Pod с sidecar-контейнером для синхронизации файлов:

apiVersion: v1
kind: Pod
metadata:
  name: web-app-with-sync
spec:
  volumes:
  - name: shared-data
    emptyDir: {}
  containers:
  - name: web-app
    image: nginx:alpine
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html
  - name: sync-sidecar
    image: alpine/sync
    command: ['sh', '-c', 'while true; do rsync -av /remote/data/ /html/; sleep 30; done']
    volumeMounts:
    - name: shared-data
      mountPath: /html

Важные для DevOps аспекты:

  • Жизненный цикл: Все контейнеры в Pod создаются и удаляются одновременно. Они "рождаются и умирают" вместе.
  • Масштабирование: Масштабируется именно Pod (например, через Deployment). Нельзя масштабировать отдельные контейнеры внутри Pod.
  • Ресурсы: Requests и Limits задаются для каждого контейнера внутри Pod отдельно, но учитываются на уровне Pod как сумма.

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