Ответ
Pod — это базовая единица выполнения в Kubernetes, которую я, как DevOps-инженер, конфигурирую и управляю ею. Это не контейнер, а "обертка" для одного или нескольких контейнеров, которые должны работать вместе как единое целое.
Ключевые концепции и сценарии использования:
-
Совместное использование ресурсов: Контейнеры внутри одного Pod:
- Разделяют одно сетевое пространство (общий IP-адрес, localhost, порты).
- Могут монтировать одни и те же тома (volumes) для обмена данными.
- Могут общаться через Inter-Process Communication (IPC).
-
Паттерн "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'ов.