Skip to main content

Как работает CSI драйвер?

Объекты: CSIDriver, volumeattachment, pvc, pv

losted in ~ λ kubectl api-resources | grep stora                                                                                                                            CHG:98% 00:20:11
csidrivers                                       storage.k8s.io/v1                 false        CSIDriver
csinodes                                         storage.k8s.io/v1                 false        CSINode
csistoragecapacities                             storage.k8s.io/v1                 true         CSIStorageCapacity
storageclasses                      sc           storage.k8s.io/v1                 false        StorageClass
volumeattachments                                storage.k8s.io/v1                 false        VolumeAttachment

Все мы когда-то сталкивались с дилеммой - где хранить данные в кубернетисе. На помощь обычно приходит csi драйвер, но как он работает? Эта статья должна помочь разработчикам и разъяснить некоторые моменты пользователям.

CSI (Container Storage Interface) это довольно гибкий интерфейс для предоставления хранилища, в официальной документация подробно расписаны все возможности и архитектура работы. Зачастую интерес пользователя останавливается на нескольких свойствах драйверов - хранилище блочное или файловое, RWX (ReadWriteMany - когда можно подключать один том к нескольким подам) или RWO (ReadWriteOnce - один том на один под).

На самом деле CSI дает заметно больше возможностей чем только это.

С чего все начинается

Вот вы поставили свой любимый CSI драйвер, например https://github.com/kubernetes-csi/csi-driver-nfs , он поставился и вы побежали создавать PVC. Но что под капотом?

Все начинается с объекта csidrivers (apiversion буду пропускать - он везде "storage.k8s.io/v1"). Без него приложение в поде не сможет зарегистрироваться в кубернетисе. Какие интересные поля в нем есть? Выведем только spec, так как в блоке metadata интересных полей нет.

~ kubectl explain csidrivers.spec --recursive
GROUP:      storage.k8s.io
KIND:       CSIDriver
VERSION:    v1

FIELD: spec <CSIDriverSpec>


DESCRIPTION:
    spec represents the specification of the CSI Driver.
    CSIDriverSpec is the specification of a CSIDriver.
    
FIELDS:
  attachRequired        <boolean>
  fsGroupPolicy <string>
  podInfoOnMount        <boolean>
  requiresRepublish     <boolean>
  seLinuxMount  <boolean>
  storageCapacity       <boolean>
  tokenRequests <[]TokenRequest>
    audience    <string> -required-
    expirationSeconds   <integer>
  volumeLifecycleModes  <[]string>

 

 

Устройство самого драйвера

Сам драйвер это grpc демон