Подключение объектного хранилища к Kubernetes: CSI-драйвер или S3 API — что выбрать? | AdminWiki

Подключение объектного хранилища к Kubernetes: CSI-драйвер или S3 API — что выбрать?

10 августа 2026 12 мин. чтения

Если приложению нужна обычная файловая система, директории и POSIX-совместимый доступ, выбирайте CSI-драйвер, например JuiceFS. Если приложение уже работает с объектами через SDK, важны минимальные latency и высокая производительность, используйте S3 API напрямую. CSI-драйвер удобен для файловых и read-heavy нагрузок, а прямой S3 API лучше подходит для бэкапов Kubernetes, логов, data lake и приложений с большим количеством параллельных PUT/GET-запросов.

СценарийРекомендуемый подходПричинаОсновной риск
Приложению нужны файлы, директории и POSIX-доступCSI-драйвер, например JuiceFSМожно подключить бакет как файловую систему без изменения кодаДополнительные latency и зависимость от кэша и метаданных
Приложение нативно работает с объектамиS3 API через SDKМинимум промежуточных компонентов и прямой контроль запросовКод должен поддерживать модель объектов и ограничения API
Бэкап Kubernetes в S3S3 API через VeleroVelero рассчитан на объектное хранилищеНужно заранее проверить IAM-права, endpoint и восстановление
Read-heavy нагрузка с крупными файламиCSI-драйвер с кэшем или S3 APIJuiceFS может ускорить повторные чтения за счет локального кэшаРезультат зависит от размера кэша, сети и S3-провайдера
Write-heavy нагрузка с мелкими файламиS3 API напрямуюМеньше трансляций файловых операций и сетевых обращенийНужно учитывать rate limits и корректно настроить параллелизм

Как выбрать способ подключения S3-совместимого хранилища к Kubernetes

Объектные хранилища S3 предлагают практически неограниченную емкость, низкую стоимость гигабайта и высокую доступность. Kubernetes из коробки не умеет работать с S3 как с файловой системой. Стандартные механизмы PersistentVolume ориентированы на блочные устройства и сетевые файловые системы вроде NFS. Поэтому для интеграции S3-совместимого хранилища с Kubernetes применяют две стратегии: монтирование бакета через CSI-драйвер или прямой доступ приложения через S3 API.

CSI-драйвер транслирует файловые операции в S3 API-запросы. Контейнер видит обычную директорию, а под капотом драйвер читает и пишет объекты в бакет. При прямом доступе приложение самостоятельно формирует PUT/GET-запросы через SDK и обращается к endpoint объектного хранилища без файловой прослойки.

Что важно знать перед выбором

  • Модель доступа. CSI-драйвер предоставляет файловую модель, а S3 API работает с объектами, ключами и метаданными.
  • latency и IOPS. Файловая операция через CSI может порождать несколько S3 API-вызовов. Для мелких операций это обычно заметнее, чем для крупных последовательных чтений и записей.
  • Кэш. Локальный кэш JuiceFS снижает latency повторных чтений, но требует места на узле, контроля заполнения и учета согласованности данных.
  • throughput. На крупных файлах накладные расходы CSI-драйвера могут быть относительно небольшими. На результат влияют сеть, настройки multipart uploads и возможности конкретного S3-провайдера.
  • Ограничения API. S3 не является полноценной POSIX-файловой системой: операции переименования, блокировки, атомарность и работа с большим числом мелких объектов могут отличаться от ожиданий приложения.
  • Совместимость приложений. Если приложение уже использует AWS SDK, boto3 или другой S3 SDK, прямой API обычно требует меньше инфраструктурных компонентов.
  • Эксплуатационная сложность. CSI добавляет драйвер, FUSE, кэш и хранилище метаданных. S3 API упрощает инфраструктуру, но переносит ответственность за обработку ошибок, повторные запросы и multipart uploads в приложение.

CSI-драйвер для S3 в Kubernetes: монтирование бакета как файловой системы

CSI (Container Storage Interface) - стандартный интерфейс Kubernetes для подключения внешних хранилищ. CSI-драйвер для S3 реализует POSIX-подобную файловую систему поверх объектного хранилища. Под получает PVC, драйвер создает файловую систему в бакете и монтирует её. Все операции с файлами - создание, чтение, запись, удаление - драйвер преобразует в S3 API-запросы.

Главное преимущество подхода - совместимость с приложениями, которые ожидают файловую систему. Логи, конфигурационные файлы, медиа-ассеты и архивы можно хранить в S3 без изменения кода. Плата за удобство - дополнительные задержки: каждая файловая операция превращается в сетевой запрос к S3 API, а метаданные файловой системы требуют отдельных вызовов.

Когда CSI-драйвер не нужен

CSI-драйвер не нужен, если приложение уже нативно работает с S3 API и не требует POSIX-совместимого доступа. В этом случае монтирование бакета добавляет FUSE, CSI-поды, базу метаданных и дополнительные точки отказа. Для бэкапов Kubernetes через Velero также достаточно прямого доступа к S3 API.

Обзор CSI-драйверов для S3: JuiceFS, Ceph CSI, MinIO CSI

На рынке три основных CSI-драйвера для S3-совместимых хранилищ. JuiceFS - наиболее универсальный вариант. Он работает с любым S3-провайдером, поддерживает кэширование на локальном диске и распределенный режим. Метаданные хранятся в отдельной базе данных (Redis, TiKV, PostgreSQL), что ускоряет навигацию по файловой системе. JuiceFS показывает высокую производительность на операциях с крупными файлами и стабильную работу при смешанных нагрузках.

Ceph CSI интегрируется с Ceph RGW (RADOS Gateway). Если у вас уже развернут Ceph-кластер, этот драйвер обеспечивает нативную интеграцию без дополнительных прослоек. MinIO CSI заточен под MinIO-кластеры и поддерживает прямое монтирование бакетов MinIO. Оба решения хороши в своих экосистемах, но привязаны к конкретному бэкенду. Для гетерогенных сред и мультиоблачных сценариев JuiceFS остается оптимальным выбором.

Пошаговая настройка JuiceFS CSI Driver в Kubernetes

Установка JuiceFS CSI Driver выполняется через Helm. Добавляем репозиторий и разворачиваем драйвер в кластере:

helm repo add juicefs https://juicedata.github.io/charts/
helm repo update
helm install juicefs-csi-driver juicefs/juicefs-csi-driver \
  --namespace kube-system \
  --set controller.replicas=2

После установки создаем Secret с учетными данными S3. В этом примере используется S3-совместимое хранилище с эндпоинтом, ключом доступа и секретным ключом:

apiVersion: v1
kind: Secret
metadata:
  name: juicefs-secret
  namespace: default
type: Opaque
stringData:
  name: mybucket
  metaurl: redis://:password@redis-service:6379/0
  storage: s3
  bucket: https://s3.example.com/mybucket
  access-key: YOUR_ACCESS_KEY
  secret-key: YOUR_SECRET_KEY

Параметр metaurl указывает базу данных для метаданных. Redis - простой вариант для начала, для production-нагрузок рассмотрите TiKV или PostgreSQL. Параметр storage определяет тип бэкенда - s3, gcs, oss и другие.

Следующий шаг - определение StorageClass. Указываем параметры кэширования и формат файловой системы:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: juicefs-sc
provisioner: csi.juicefs.com
parameters:
  juicefs/format-in-pod: "true"
  juicefs/cache-size: "10240"
  juicefs/cache-dir: "/var/jfs-cache"
reclaimPolicy: Retain
volumeBindingMode: Immediate
allowVolumeExpansion: true

Параметр cache-size задает размер локального кэша в мегабайтах. Кэш хранит горячие данные на локальном диске узла и снижает задержки при повторных чтениях. Для рабочих нагрузок с интенсивным чтением выделяйте от 10 ГБ на узел.

Создаем PVC и монтируем в под:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: juicefs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: juicefs-sc
  resources:
    requests:
      storage: 100Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: app-with-juicefs
spec:
  containers:
  - name: app
    image: nginx:latest
    volumeMounts:
    - name: data
      mountPath: /data
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: juicefs-pvc

Важный момент: CSI-под должен иметь достаточно ресурсов. Для production-среды задайте requests и limits на уровне 500m CPU и 1Gi памяти минимум. При интенсивной нагрузке увеличивайте пропорционально количеству операций в секунду. Подробнее о настройке хранилищ для stateful-приложений читайте в руководстве по CSI-драйверам TrueNAS и Ceph.

S3 API в Kubernetes: прямой доступ без файловой прослойки

Многие современные приложения изначально поддерживают S3 API. Python-приложения используют boto3, Go-сервисы - AWS SDK, Node.js - @aws-sdk/client-s3. Если код уже работает с объектами через S3 API, монтирование бакета как файловой системы только добавит задержки и точки отказа.

Прямой доступ через S3 API дает три ключевых преимущества. Первое - минимальные задержки: приложение отправляет запрос напрямую к эндпоинту S3 без трансляции через FUSE и CSI-драйвер. Второе - отсутствие дополнительных компонентов: не нужны CSI-поды, потребляющие CPU и память, и база метаданных для обслуживания. Третье - лучшая масштабируемость. S3 API рассчитан на параллельные запросы, а приложение может использовать multipart uploads, range requests и pre-signed URLs.

Когда S3 API не подходит

S3 API не подходит, если приложение жестко ожидает локальный путь, файловые блокировки, атомарные операции файловой системы или полноценную POSIX-семантику. В таких случаях прямой API потребует изменения кода или отдельного адаптера. Также следует учитывать, что конкретный S3-провайдер может иметь собственные ограничения совместимости, rate limits и особенности endpoint.

Учетные данные передаются через Kubernetes Secrets и переменные окружения. Создаем Secret:

apiVersion: v1
kind: Secret
metadata:
  name: s3-credentials
type: Opaque
stringData:
  AWS_ACCESS_KEY_ID: YOUR_ACCESS_KEY
  AWS_SECRET_ACCESS_KEY: YOUR_SECRET_KEY
  AWS_ENDPOINT_URL: https://s3.example.com
  AWS_REGION: us-east-1

Используем Secret в деплойменте:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: s3-native-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: s3-native
  template:
    metadata:
      labels:
        app: s3-native
    spec:
      containers:
      - name: app
        image: myapp:latest
        envFrom:
        - secretRef:
            name: s3-credentials

Этот подход подходит для хранения статических ассетов, логов в виде объектов, data lake и резервных копий. Приложение полностью контролирует взаимодействие с хранилищем и может оптимизировать запросы под свою нагрузку. Для управления секретами в production-среде рекомендуем изучить сравнение HashiCorp Vault, AWS Secrets Manager и Azure Key Vault.

Сравнение производительности CSI-драйвера и S3 API

Тестирование проводилось на кластере Kubernetes 1.30 с узлами на базе AMD EPYC 7502P и 64 ГБ RAM. S3-хранилище - выделенный кластер MinIO на SSD-дисках с подключением по 10GbE. JuiceFS CSI Driver версии 0.25 с Redis для метаданных. Прямой доступ - через minio-py SDK.

Эти цифры применимы прежде всего для сравнения относительных накладных расходов в похожей среде: на одном типе сети, с тем же S3-бэкендом и сопоставимым уровнем параллелизма. Они не являются универсальной гарантией для любого провайдера. Реальные latency, IOPS и throughput могут отличаться из-за расстояния до S3, качества сети, реализации API, настроек multipart uploads, лимитов запросов и размера локального кэша.

Результаты для операций с мелкими файлами (4 КБ):

МетрикаCSI-драйвер (JuiceFS)S3 API напрямуюРазница
Latency записи12-18 мс4-6 мсв 3 раза выше
Latency чтения (холодный кэш)10-15 мс3-5 мсв 3 раза выше
Latency чтения (горячий кэш)0.3-0.8 мс3-5 мсв 6 раз ниже
IOPS запись (один поток)~80~250в 3 раза ниже
IOPS чтение (один поток, горячий кэш)~3000~250в 12 раз выше

Для крупных файлов (1 ГБ) картина меняется:

МетрикаCSI-драйвер (JuiceFS)S3 API напрямуюРазница
Throughput записи420 МБ/с450 МБ/ссопоставимо
Throughput чтения (холодный кэш)380 МБ/с440 МБ/сна 14% ниже
Throughput чтения (горячий кэш)1100 МБ/с440 МБ/св 2.5 раза выше

Для мелких файлов CSI-драйвер добавляет 6-12 мс задержки на операцию из-за трансляции вызовов и сетевых хопов. Для высоконагруженных баз данных или систем с интенсивной записью мелких объектов это критично - используйте S3 API напрямую. Локальный кэш JuiceFS ускоряет повторные чтения, поэтому CSI-драйвер подходит для read-heavy нагрузок: веб-серверов с медиа-контентом, аналитических пайплайнов и CI/CD-артефактов.

На крупных файлах разница в throughput минимальна: накладные расходы CSI-драйвера нивелируются за счет большого размера блока. Для стриминга видео, хранения резервных копий или датасетов машинного обучения оба подхода могут показывать сопоставимую производительность, но перед production-внедрением результаты нужно проверить в своей сети и на своем S3-провайдере.

Velero: бэкапы Kubernetes в S3-совместимое хранилище

S3-совместимое хранилище - стандартный выбор для резервного копирования Kubernetes. Причины: низкая стоимость хранения, автоматическая репликация, версионирование объектов и возможность задавать политики жизненного цикла. Инструмент Velero предназначен для бэкапа и восстановления ресурсов кластера и не требует монтирования S3-бакета как файловой системы.

Минимальный чек-лист prerequisites для Velero

  • Создайте отдельный бакет для бэкапов Kubernetes и проверьте доступность S3 endpoint из кластера.
  • Подготовьте IAM-пользователя или сервисные учетные данные с минимальными правами на нужный бакет.
  • Проверьте совместимость S3 API, включая path-style или virtual-hosted-style запросы.
  • Определите способ сохранения данных PersistentVolume: Restic или CSI-снапшоты.
  • После настройки выполните тестовый backup и restore, а не ограничивайтесь проверкой статуса задания.

Установка Velero с S3-бэкендом:

velero install \
  --provider aws \
  --plugins velero/velero-plugin-for-aws:v1.9 \
  --bucket k8s-backups \
  --secret-file ./credentials-velero \
  --use-volume-snapshots=false \
  --backup-location-config \
    region=us-east-1,s3ForcePathStyle="true",s3Url=https://s3.example.com

Файл credentials-velero содержит access key и secret key для доступа к бакету. Параметр s3ForcePathStyle необходим для S3-совместимых хранилищ, которые не поддерживают virtual-hosted-style запросы.

Создание бэкапа всего кластера:

velero backup create full-cluster-backup --include-namespaces '*'

Бэкап конкретного неймспейса с данными томов:

velero backup create prod-backup \
  --include-namespaces production \
  --default-volumes-to-fs-backup

Флаг --default-volumes-to-fs-backup включает резервное копирование данных PersistentVolume через Restic. Это работает для любых типов томов, даже без поддержки CSI-снапшотов.

Настройка расписания автоматических бэкапов:

velero schedule create daily-backup \
  --schedule="0 2 * * *" \
  --include-namespaces production \
  --default-volumes-to-fs-backup \
  --ttl 720h0m0s

Этот пример создает ежедневный бэкап в 2 часа ночи и хранит его 30 дней. Параметр ttl задает время жизни бэкапа, после которого Velero автоматически удалит данные из S3.

Восстановление кластера из бэкапа:

velero restore create --from-backup prod-backup

Velero восстанавливает ресурсы в том же порядке, в котором они были забэкаплены: сначала CRD, затем деплойменты, потом PVC и данные томов. Для диагностики проблем с восстановлением пригодятся метрики мониторинга - мы разбирали их в руководстве по диагностике подов и узлов Kubernetes.

Типичные ошибки при подключении S3 к Kubernetes

Неправильные IAM-политики и права доступа. Самая частая ошибка - использование root-ключей от всего S3-аккаунта для подключения из Kubernetes. Создайте отдельного пользователя с минимальными правами: доступ только к конкретному бакету, разрешены только необходимые операции (GetObject, PutObject, ListBucket, DeleteObject). Для Velero добавьте права на CreateBucket и DeleteObject. Регулярно ротируйте ключи доступа.

Игнорирование лимитов S3 на количество запросов. S3-провайдеры устанавливают rate limits - от 3500 PUT/COPY/POST/DELETE запросов в секунду для AWS S3 до более скромных лимитов у небольших провайдеров. CSI-драйвер может генерировать кратно больше запросов: одна файловая операция транслируется в несколько S3 API-вызовов. Мониторьте метрики S3 и настраивайте кэширование в JuiceFS.

Использование CSI-драйвера для высоконагруженных баз данных. PostgreSQL, MySQL, MongoDB требуют низких задержек и высоких IOPS на мелких операциях. CSI-драйвер добавляет latency, что делает его неподходящим для production-баз данных. Для stateful-приложений с базами данных используйте блочные хранилища через CSI-драйверы для блочных устройств или локальные тома.

Отсутствие мониторинга использования S3. Без мониторинга легко превысить лимиты по трафику или количеству запросов и получить неожиданный счет. Настройте алерты на количество S3-запросов, объем хранимых данных и исходящий трафик.

Хранение секретов в открытом виде в манифестах. Никогда не коммитьте Secret-манифесты с реальными ключами в Git. Используйте Sealed Secrets, External Secrets Operator или интеграцию с HashiCorp Vault.

Чек-лист выбора CSI-драйвера и S3 API

  • Нужен файловый доступ с чтением и записью файлов, директорий и POSIX-атрибутов - выбирайте CSI-драйвер. JuiceFS с кэшированием даст дополнительный эффект на повторных чтениях.
  • Приложение нативно работает с S3 API через AWS SDK, boto3 или minio-py - используйте S3 API напрямую, особенно если критичны latency и IOPS.
  • Нужен бэкап Kubernetes - используйте S3 API через Velero. Не монтируйте бэкапный бакет как файловую систему.
  • Read-heavy нагрузка с крупными файлами - CSI-драйвер с кэшированием может показать производительность выше прямого S3 API.
  • Write-heavy нагрузка с мелкими файлами - предпочтителен S3 API напрямую, поскольку CSI-драйвер добавляет файловую трансляцию и дополнительные запросы.

Комбинированный подход часто оправдан: статические ассеты и медиа-файлы монтируются через CSI-драйвер, высоконагруженные сервисы работают с S3 API напрямую, а бэкапы отправляются в отдельный бакет через Velero. Перед внедрением в production проведите нагрузочное тестирование в своей среде: сетевые задержки и производительность конкретного S3-провайдера могут существенно повлиять на результаты. Для управления инфраструктурой как кодом, включая конфигурацию хранилищ, изучите практическое сравнение kubectl, Helm, Terraform и Crossplane.

FAQ: подключение S3-совместимого хранилища к Kubernetes

Что выбрать для Kubernetes: CSI-драйвер или S3 API?

Выбирайте CSI-драйвер, если приложению нужен файловый интерфейс и монтирование бакета как persistent volume. Выбирайте S3 API, если приложение работает с объектами напрямую, нужны меньшие latency и IOPS, а изменение кода допустимо.

Можно ли монтировать S3-бакет в Kubernetes через CSI-драйвер?

Да. CSI-драйвер, например JuiceFS, предоставляет приложению файловую систему поверх S3-совместимого хранилища. При этом необходимо учитывать дополнительные сетевые запросы, работу FUSE, хранилище метаданных и требования к локальному кэшу.

Как сделать бэкап Kubernetes в S3?

Для бэкапа Kubernetes в S3 используйте Velero. Настройте S3 endpoint и IAM-права, установите плагин для S3-совместимого хранилища, создайте backup и обязательно проверьте восстановление ресурсов и данных PersistentVolume.

Поделиться:
Сохранить гайд? В закладки браузера