Какие типы контейнеров могут быть внутри пода в Kubernetes?

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

Ответ

Pod в Kubernetes — это минимальная deployable unit, которая может содержать один или несколько контейнеров, разделяющих сетевое пространство и, опционально, тома. Основные типы:

  1. Основные контейнеры (Main Application Containers): Контейнеры, описанные в spec.containers[]. Они выполняют основную бизнес-логику пода (например, веб-сервер Nginx, backend-приложение на Go). Пода существует, пока работает хотя бы один из этих контейнеров.

  2. Init-контейнеры (Init Containers): Описываются в spec.initContainers[]. Они запускаются строго последовательно и только один раз перед стартом основных контейнеров. Их задача — выполнить подготовительные работы: дождаться готовности зависимого сервиса, настроить разрешения, скачать конфигурацию или данные.

    spec:
      initContainers:
      - name: wait-for-db
        image: busybox:1.28
        command: ['sh', '-c', 'until nc -z database 5432; do echo waiting for database...; sleep 2; done;']
      containers:
      - name: app
        image: myapp:latest
  3. Sidecar-контейнеры (Sidecar Containers): Это тоже основные контейнеры (spec.containers[]), но с вспомогательной функцией. Они работают параллельно с главным контейнером, расширяя или дополняя его. Классические примеры:

    • Агент логирования: Контейнер, который забирает логи главного приложения из общего volume и отправляет их в централизованную систему (Fluentd, Filebeat).
    • Прокси или адаптер сети: Например, контейнер с Envoy или Linkerd-proxy в service mesh.
    • Синхронизатор конфигураций: Контейнер, который следит за ConfigMap/Secret и обновляет файлы конфигурации в общем volume для основного приложения.
  4. Ephemeral Containers (Временные контейнеры): Специальный тип контейнеров, который можно добавить в уже работающий Pod только для целей отладки (например, через kubectl debug). Они не являются частью оригинальной спецификации пода, не могут иметь гарантий ресурсов (resources) или постоянных томов (persistent volumes).