Какие уникальные характеристики есть у Pod в Kubernetes?

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

Ответ

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.