Что такое S3-совместимое хранилище и как его использовать в Kubernetes?

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

Ответ

S3 (Simple Storage Service) — это протокол объектного хранилища, первоначально разработанный AWS. В контексте Kubernetes под "S3 хранилищем" обычно понимают S3-совместимое объектное хранилище (например, AWS S3, MinIO, Ceph RGW, Google Cloud Storage), которое можно использовать для внешнего хранения данных из кластера: бэкапов, логов, статических ассетов или больших наборов данных.

Основные способы интеграции с Kubernetes:

  1. Использование внутри пода через Sidecar или Init Container: Приложение или вспомогательный контейнер использует SDK (например, aws-cli, boto3, minio-client) для прямого взаимодействия с S3 API.

    apiVersion: v1
    kind: Pod
    metadata:
      name: data-loader
    spec:
      containers:
      - name: app
        image: my-data-processor
        env:
        - name: S3_ENDPOINT
          value: "https://s3.amazonaws.com"
        - name: AWS_ACCESS_KEY_ID
          valueFrom:
            secretKeyRef:
              name: s3-credentials
              key: accessKey
        # ...
  2. CSI (Container Storage Interface) драйверы: Позволяют монтировать бакеты S3 как файловые системы внутри подов (например, драйверы csi-s3, juicefs).

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: s3-pvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: s3-csi-sc
      resources:
        requests:
          storage: 10Gi
  3. Использование MinIO как внутреннего S3-совместимого хранилища: MinIO можно развернуть внутри кластера как StatefulSet, что даёт полностью контролируемое объектное хранилище.

    # Пример установки через Helm: helm install minio minio/minio

Практический пример из опыта: Мы использовали S3 (через CSI-драйвер) для хранения обучающих данных ML-моделей в Kubernetes. Это позволило отделить данные от вычислительных подов, сделав их доступными для чтения множеству параллельных тренировочных джобов, и упростило управление версиями данных.