Как обеспечить общий доступ к файлам для нескольких контейнеров внутри одного пода в Kubernetes?

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

Ответ

Контейнеры в одном поде могут совместно использовать данные через общие тома (Volumes). Это стандартный паттерн для sidecar-контейнеров, например, когда один контейнер пишет логи, а другой их обрабатывает или выгружает.

Наиболее частый и безопасный вариант — emptyDir:

apiVersion: v1
kind: Pod
metadata:
  name: shared-files-pod
spec:
  containers:
    - name: app-container
      image: nginx:alpine
      volumeMounts:
        - name: shared-storage
          mountPath: /usr/share/nginx/html # Папка для статики
    - name: sidecar-sync
      image: alpine
      command: ["/bin/sh", "-c"]
      args:
        - |
          apk add curl &&
          while true; do
            echo "Sidecar data $(date)" > /shared-data/status.txt;
            sleep 30;
          done
      volumeMounts:
        - name: shared-storage
          mountPath: /shared-data
  volumes:
    - name: shared-storage
      emptyDir: {}

Как это работает:

  1. В секции spec.volumes объявляется том shared-storage типа emptyDir.
  2. Каждый контейнер монтирует этот том в свою файловую систему, указывая путь в volumeMounts.mountPath.
  3. emptyDir создается на ноде при старте пода. Все контейнеры пода видят одни и те же файлы в этом томе.
  4. Данные в emptyDir сохраняются при перезапуске контейнеров, но удаляются при удалении пода.

Альтернативы:

  • hostPath: Монтирует директорию с ноды. Использую редко, только для системных демонов (например, сборщиков логов), так как это привязывает под к конкретной ноде.
  • Сетевые тома (CSI)**: Для данных, которые должны пережить удаление пода (например, PersistentVolumeClaim на основе NFS или облачного диска).