Ответ
Pod — это атомарная единица развертывания в Kubernetes с несколькими ключевыми особенностями:
1. Совместное сетевое пространство (Shared Network Namespace)
Все контейнеры внутри пода разделяют один IP-адрес, портовое пространство и сетевой интерфейс. Они могут общаться друг с другом через localhost. Это позволяет, например, основному контейнеру приложения обращаться к sidecar-контейнеру (прокси, лог-шейпер) на 127.0.0.1:port.
2. Совместное пространство хранения (Shared Storage Volumes) Тома, определенные на уровне пода, могут быть смонтированы в несколько контейнеров внутри него. Это позволяет контейнерам совместно использовать данные.
3. Общие пространства IPC и UTS (Shared IPC & UTS Namespaces) Контейнеры в одном поде могут общаться через IPC (межпроцессное взаимодействие) и видят одно и то же имя хоста (hostname).
4. Атомарный жизненный цикл (Atomic Lifecycle) Pod создается, запускается и удаляется как единое целое. Все контейнеры внутри пода запускаются параллельно (не последовательно), и Kubernetes управляет жизненным циклом пода, а не отдельных контейнеров.
5. Когезионность (Co-location and Co-scheduling) Контейнеры в поде всегда размещаются на одной ноде (хосте). Это гарантирует минимальную задержку для тесно связанных процессов (например, веб-сервер и кэширующий sidecar).
Практический пример: Pod с приложением и sidecar для логирования
apiVersion: v1
kind: Pod
metadata:
name: webapp-with-logger
spec:
containers:
- name: webapp
image: myapp:latest
ports:
- containerPort: 8080
volumeMounts:
- name: shared-logs
mountPath: /var/log/app
- name: log-shipper # Sidecar-контейнер
image: fluentd:latest
volumeMounts:
- name: shared-logs # Монтирует тот же том
mountPath: /fluentd/log
# Может обращаться к webapp как localhost:8080
volumes:
- name: shared-logs
emptyDir: {} # Общий том для обмена логами
Почему это важно: Эта модель позволяет проектировать приложения как набор слабосвязанных, но совместно размещенных процессов, что является фундаментом для паттернов sidecar и ambassador.