Сколько контейнеров может быть внутри одного пода (Pod) в Kubernetes?

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

Ответ

В Pod Kubernetes может находиться один или несколько контейнеров. Технического жесткого ограничения на максимальное количество нет, но на практике обычно используется от 1 до 3-4 контейнеров в рамках определенных паттернов.

Ключевая идея: Все контейнеры внутри пода:

  • Запускаются на одном узле (worker node) и никогда не разделяются.
  • Разделяют одни и те же сетевые пространства имен (общий IP-адрес, localhost).
  • Могут совместно использовать тома (volumes) для обмена данными.

Типичные сценарии с несколькими контейнерами (Multi-Container Pods):

  1. Sidecar-паттерн: Основной контейнер приложения дополняется вспомогательным.

    • Пример: Контейнер с веб-приложением (nginx) и sidecar-контейнер, который синхронизирует статические файлы из облачного хранилища (например, s3fs).
  2. Ambassador-паттерн: Контейнер-посредник, который управляет сетевыми подключениями для основного приложения (например, прокси к базе данных).

  3. Adapter-паттерн: Контейнер, который нормализует или трансформирует выходные данные основного приложения (например, форматирует логи).

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

apiVersion: v1
kind: Pod
metadata:
  name: web-server-with-log-shipper
spec:
  volumes:
    - name: shared-logs
      emptyDir: {}
  containers:
  - name: nginx
    image: nginx:alpine
    volumeMounts:
      - name: shared-logs
        mountPath: /var/log/nginx
  - name: log-shipper # Sidecar-контейнер
    image: busybox
    command: ["sh", "-c", "tail -f /logs/access.log"]
    volumeMounts:
      - name: shared-logs
        mountPath: /logs

Важно: Хотя можно запустить много контейнеров, чрезмерное их количество усложняет управление жизненным циклом, отладку и распределение ресурсов. Pod следует рассматривать как единицу развертывания для тесно связанных процессов.