Как работает 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 демон
