CSI драйверы
Тема дорожной карты · Kubernetes
Container Storage Interface (CSI) — стандартизированный gRPC API, позволяющий внешним поставщикам хранилищ предоставлять блочное и файловое хранилище рабочим нагрузкам Kubernetes без изменений в ядре K8s. CSI-драйвер состоит из контроллерного плагина (развёртывается как Deployment), обрабатывающего операции CreateVolume, DeleteVolume и CreateSnapshot, и нодового плагина (развёртывается как DaemonSet), обрабатывающего NodeStageVolume и NodePublishVolume для подключения и монтирования томов в файловые системы Pod'ов. StorageClass ссылаются на CSI-драйверы через поле provisioner — например ebs.csi.aws.com или pd.csi.storage.gke.io — и Kubernetes динамически выделяет PersistentVolume при создании PersistentVolumeClaim, соответствующего данному классу. CSI заменил все встроенные плагины томов Kubernetes (NFS, Ceph RBD, AWS EBS, GCE PD) и является единственным поддерживаемым путём расширения хранилища в современных K8s-кластерах, позволяя операторам управлять жизненным циклом PersistentVolume через kubectl get csidriver и kubectl describe storageclass.
Как это работает
CSI драйверы в Kubernetes соединяет pods с долговременным хранилищем через три слоя: PersistentVolumeClaim (PVC), декларируемый пользователем, PersistentVolume (PV), стоящий за claim (pre-provisioned или динамически создаваемый через StorageClass) и underlying storage (cloud block storage, NFS, Ceph и т.д.). При старте pod с PVC volume монтируется; при перемещении pod volume следует за ним.
Когда применять
Используйте CSI драйверы для stateful-нагрузок: БД, очереди сообщений, кэши с persistence, загрузки файлов. Подбирайте тип под нагрузку — block storage (EBS, GCE PD) для одно-pod БД; ReadWriteMany (NFS, EFS, CephFS) когда несколько pods делят данные; ephemeral emptyDir для scratch space, которое может исчезнуть. Не используйте один PVC для несвязанных нагрузок — coupling усложняет upgrade.
Типичные ошибки
Storage-ловушки: неверный access mode (ReadWriteOnce на Deployment с replicas > 1 — pods deadlock на attach); не установили volumeBindingMode: WaitForFirstConsumer (volume провижится в не той AZ); забыли, что StatefulSet PVC НЕ удаляются при удалении StatefulSet (данные и счёт продолжают идти). Backup-стратегия важна: Velero или CSI-snapshot pipeline до production.