CSI-драйвер csi-huawei — это реализация стандарта Container Storage Interface (CSI) для работы с томами на СХД Huawei в Deckhouse Kubernetes Platform (DKP).
Архитектура драйвера
Для упрощения схемы приняты следующие допущения:
- На схеме показано, что контейнеры разных подов взаимодействуют друг с другом напрямую. Фактически они взаимодействуют через соответствующие сервисы Kubernetes (внутренние балансировщики). Названия сервисов не указываются, если они очевидны из контекста. В остальных случаях название сервиса указано над стрелкой.
- Поды могут быть запущены в нескольких репликах, однако на схеме все поды изображены в одной реплике.
Архитектура CSI-драйвера csi-huawei на уровне 2 модели C4 и его взаимодействия с другими компонентами DKP изображены на следующей диаграмме:

Компоненты драйвера
CSI-драйвер csi-huawei состоит из следующих компонентов:
-
Csi-controller (Deployment) — Controller Plugin, отвечающий за глобальные операции с томами: создание и удаление, подключение и отключение от узлов.
Состоит из следующих контейнеров:
-
controller — основной контейнер, реализующий функциональность CSI-драйвера (capabilities) в виде gRPC-сервисов Identity Service и Controller Service согласно спецификации CSI;
-
сайдкар-контейнеры контроллера — поддерживаемые сообществом Kubernetes внешние контроллеры (external controllers).
Они необходимы, поскольку persistent volume controller, запущенный в kube-controller-manager (компонент control plane кластера DKP), не имеет интерфейса взаимодействия с CSI-драйверами. Внешние контроллеры следят за ресурсами PersistentVolumeClaim и вызывают соответствующие функции CSI-драйвера в контейнере controller. Они также выполняют служебные функции, такие как получение информации о плагине и его capabilities или проверка состояния драйвера (liveness probe).
Внешние контроллеры взаимодействуют c контейнером controller по gRPC через Unix-сокеты.
В csi-controller входят следующие внешние контроллеры:
-
provisioner (external-provisioner) — отслеживает ресурсы PersistentVolumeClaim и вызывает RPC
CreateVolumeилиDeleteVolume. Также использует RPCValidateVolumeCapabilitiesдля проверки совместимости; -
attacher (external-attacher) — отслеживает ресурсы VolumeAttachment после того, как под запланирован на узел, а также подключает и отключает тома через RPC
ControllerPublishVolumeиControllerUnpublishVolume; -
resizer (external-resizer) — отслеживает обновления ресурсов PersistentVolumeClaim, расширяет тома с помощью RPC
ControllerExpandVolume, если пользователь запросил больше дискового пространства для PVC и драйвер поддерживает capabilityEXPAND_VOLUME; -
snapshotter (external-snapshotter) — работает совместно с модулем
snapshot-controller, следит за ресурсами VolumeSnapshotContent, а также управляет снимками томов через RPCCreateSnapshot,DeleteSnapshotиListSnapshots; -
livenessprobe — отслеживает состояние CSI-драйвера через RPC
Probeиз Identity Service и предоставляет HTTP-эндпоинт/healthz, за которым следит kubelet. При неуспешной livenessProbe kubelet перезапускает под csi-controller.
-
-
storage-backend-controller — дополнительный контроллер, обеспечивающий работу со следующими кастомными ресурсами:
- StorageBackendClaim — запрос на подключение к СХД Huawei;
- StorageBackendContent — описание фактического подключения к СХД Huawei.
-
storage-backend-sidecar — сайдкар-контейнер, обеспечивающий работу с СХД Huawei через вызовы RPC
AddStorageBackend,UpdateStorageBackend,RemoveStorageBackend,GetBackendStats.
-
-
Csi-node (DaemonSet) — Node Plugin, работающий на всех узлах кластера и отвечающий за локальное монтирование и размонтирование томов.
У плагина есть привилегированный доступ к файловой системе каждого узла. В Linux для этого требуется capability
CAP_SYS_ADMIN. Это необходимо для выполнения операций монтирования и работы с блочными устройствами.Состоит из следующих контейнеров:
-
node — основной контейнер, реализующий функции CSI-драйвера в виде gRPC-сервисов Identity Service и Node Service согласно спецификации CSI;
-
node-driver-registrar — сайдкар-контейнер, регистрирующий Node Plugin в kubelet. Вызывает в контейнере node RPC
GetPluginInfoиNodeGetInfo, чтобы получить информацию о плагине и узле. Взаимодействует c контейнером node по gRPC через Unix-сокет.
-
Взаимодействия драйвера
Драйвер взаимодействует со следующими компонентами:
-
Kube-apiserver:
- мониторинг ресурсов PersistentVolumeClaim, VolumeAttachment;
- работа с кастомными ресурсами StorageBackendClaim, StorageBackendContent.
-
СХД Huawei — создание и удаление томов, подключение и отключение томов от узлов.
С драйвером взаимодействуют следующие внешние компоненты:
-
Kube-apiserver — валидация кастомных ресурсов StorageBackendClaim;
-
- проверяет livenessProbe CSI-драйвера;
- регистрирует Node Plugin;
- вызывает RPC
NodeStageVolume,NodeUnstageVolume,NodePublishVolumeиNodeUnpublishVolumeв Node Plugin.
Kubelet взаимодействует с Node Plugin по gRPC через Unix-сокет.