Как стать автором
Поиск
Написать публикацию
Обновить
533.17
YADRO
Тут про железо и инженерную культуру

Как разработать CSI-драйвер с поддержкой Swordfish API и запустить его без железа

Уровень сложностиСредний
Время на прочтение17 мин
Количество просмотров407

Контейнерные приложения все чаще требуют постоянного хранилища, будь то базы данных, кэш или файловые серверы. Но Kubernetes по умолчанию не «умеет» работать напрямую с системами хранения данных, в этом ему помогает CSI (Container Storage Interface). А если хочется управлять хранилищем через единый стандарт и без привязки к конкретному вендору, на помощь приходит спецификация Swordfish.

В статье расскажем, как мы в лаборатории реализовали CSI-драйвер, поддерживающий спецификацию Swordfish и создали сервер-эмулятор, позволяющий тестировать и разворачивать такую систему без физического оборудования — и поделимся этим эмулятором, чтобы вы могли попробовать сами. 

Kubernetes — наиболее популярная платформа оркестрации контейнеров, которую можно использовать для развертывания приложений, требующих постоянного хранилища данных (например, базы данных, файловые серверы, кэширование и т. д.). Однако Kubernetes изначально был ориентирован на управление контейнерами, а не на управление хранилищем. Поэтому для того, чтобы контейнеры могли подключаться к хранилищам, было разработано решение — CSI.

В предыдущих статьях мы написали Ansible-модули для управления разными системами хранения данных через Swordfish и объяснили проблемы mock-сервера Swordfish API Emulator.

Что такое Swordfish и для чего нужен

Swordfish — это спецификация, разработанная организацией SNIA (Storage Networking Industry Association), которая нацелена на создание стандартов для управления системами хранения данных (СХД) в дата-центрах и облачных инфраструктурах. Она расширяет возможности Redfish API, предоставляя единый интерфейс для управления разными типами хранилищ:

  • блочными (Block Storage),

  • файловыми (File Storage, например NFS), 

  • объектными (Object Storag2e).

Swordfish нужен для автоматизации управления хранилищами, унификации API и упрощения работы с различными типами СХД.

Единый стандарт для СХД: почему мы выбрали Swordfish

Swordfish нам понадобился по нескольким причинам. 

Необходимость унификации. В современных IT-инфраструктурах у заказчика часто используется множество СХД от разных производителей. Каждая из этих систем хранения данных имеет собственный API и интерфейс управления, что делает их администрирование сложным и неудобным. Задача Swordfish — создать единый стандарт для этого процесса, Swordfish предоставляет единых подход к управлению СХД различных вендоров. 

Интеграция с облачными и гиперконвергентными системами. СХД интегрируются с облачными платформами и гиперконвергентными системами. Это программно-определяемые системы, которые объединяют вычислительные ресурсы (CPU, RAM), сетевые компоненты и хранилище в единую платформу. Swordfish предоставляет стандарты, которые упрощают работу с такими архитектурами.

Управление через API. Swordfish разрабатывался с акцентом на использование RESTful API для взаимодействия. Это облегчает автоматизацию процессов, таких как развертывание новых ресурсов, мониторинг состояния системы и оптимизация хранения.

Почему до сих пор нет CSI-драйвера, поддерживающего спецификацию Swordfish

В настоящее время не существует CSI-драйвера, поддерживающего спецификацию Swordfish, поскольку большинство существующих CSI-драйверов разработали вендоры СХД под свои решения. Разработка CSI-драйвера для Kubernetes — это непростая задача, особенно если один из пунктов — поддержка спецификации Swordfish. Интеграция с Kubernetes API, поддержка всех функций Swordfish, таких как управление различными типами хранилищ, — все это требует значительных усилий. 

Наша команда решила взяться за это непростое задание и реализовать драйвер CSI, поддерживающий спецификацию Swordfish. Установить его можно по ссылке

Эмулятор вместо оборудования

Эмулятор Swordfish API нужен для тестирования и разработки решений, работающих с СХД, без необходимости подключения к реальному оборудованию. Это полезно, так как СХД дорогие и сложные в настройке. Помимо этого, благодаря эмулятору разработчики и тестировщики могут проверять работу API без риска повредить реальные данные. Более подробно про особенности и проблемы mock-сервера Swordfish API мы уже писали

Swordfish API — это стандарт управления СХД, но разные вендоры реализуют его по-своему, а эмулятор помогает протестировать базовый функционал.

Требования к эмулятору:

  • Имитация API-запросов и ответов согласно спецификации Swordfish.

  • Поддержка основных операций с хранилищами: создание томов, управление атрибутами томов (размер, доступность, свободная память и т. д.) и удаление томов.

  • Возможность тестирования разных типов хранилищ (блоковое, файловое, объектное).

Use-case использования CSI-драйвера

CSI-драйвер, взаимодействующий со Swordfish API, позволяет Kubernetes-кластеру автоматически создавать, подключать и управлять томами на системах хранения. Это важно в enterprise-средах, где нужно обеспечивать стандартизированный доступ к различным типам СХД без привязки к конкретному вендору. 

Автоматизированное создание и управление томами в Kubernetes через CSI-драйвер и Swordfish API
Автоматизированное создание и управление томами в Kubernetes через CSI-драйвер и Swordfish API

Когда приложение в кластере Kubernetes запрашивает постоянное хранилище (например, для хранения данных в общих папках), оркестратор отправляет запрос через PersistentVolumeClaim (PVC) с необходимыми характеристиками тома.

Что происходит, когда нужно создать том:

  1. Kubernetes получает PVC с характеристиками тома (размер, тип хранилища и т. д.). 

  2. Находит соответствующий StorageClass, который указывает, что том должен создаваться через CSI-драйвер.

  3. CSI-драйвер взаимодействует с эмулятором Swordfish API, который создает том с требуемыми параметрами. 

  4. Для файловых систем (например, NFS) Swordfish API конфигурирует подключение к серверу NFS и возвращает информацию о созданном томе обратно CSI-драйверу.

Когда том успешно создан, Kubernetes автоматически подключает его к нужному контейнеру или поду. Как это происходит:

  1. Эмулятор Swordfish API извлекает путь из ресурса FileShare к директории и добавляет путь в конфигурацию сервера NFS в /etc/exports. Это позволяет клиентам подключаться к этой директории и использовать ее в качестве сетевого хранилища. Происходит на этапе создания ресурса.

  2. Kubernetes связывает созданный том PersistentVolume (PV) с PVC, который был запрошен приложением. Контейнер или под, требующий доступ к данным, получает информацию о PV, который необходимо примонтировать.

  3. Kubernetes вызывает метод NodePublishVolume в CSI-драйвере. Он отвечает за монтирование тома в файловую систему узла (worker node), на котором запущен под.

При ненадобности хранилища инициируем удаление PVC в Kubernetes. Он включает в себя два этапа: размонтирование тома с узла и полное удаление тома из системы хранения. Kubernetes вызывает NodeUnpublishVolume в CSI-драйвере, чтобы отмонтировать том с узла. CSI-драйвер отправляет команду в эмулятор Swordfish API. Эмулятор Swordfish API устраняет том и освобождает ресурсы: в случае использования файловой системы NFS удаляется запись из /etc/exports и сам каталог на сервере. После этого Kubernetes снимает объект PV, завершая процесс.

Из чего состоит архитектура CSI-драйвера 

Архитектура CSI-драйвера состоит из следующих компонентов:

Config-модуль

Конфигурационный модуль отвечает за корректное чтение и обработку YAML-файла. Для работы необходим конфигурационный файл config.yaml. Чтение и обработка производятся с помощью библиотеки viper. Содержимое config.yaml:

server:

  • network_type — тип сетевого взаимодействия (unix или tcp), используемый gRPC-сервером. 

  • socket — путь к Unix-сокету или адрес TCP-соединения для запуска CSI-драйвера.

swordfish:

  • base_url — базовый URL, по которому драйвер обращается к Swordfish API.

logging:

  • level — уровень логирования (debug, info, warn, error), определяет, какие сообщения будут выводиться.

  • format — формат логов (json или logfmt), влияет на читаемость и совместимость с системами мониторинга.

Identity-сервис

Identity выполняет роль идентификатора для драйвера — он сообщает Kubernetes и другим внешним системам базовую информацию о плагине, а также подтверждает, что он готов к работе:

GetPluginInfo:

  • Отвечает за передачу имени драйвера и его версии.

GetPluginCapabilities:

  • Возвращает список возможностей плагина (например, поддержка Controller Service, Volume Expansion и т. д.).

Probe:

  • Служит для проверки готовности драйвера. Kubernetes регулярно вызывает этот метод, чтобы убедиться, что компонент живой и исправно работает.

Node-сервис

Сервис отвечает за монтирование и демонтаж томов на уровне узлов Kubernetes. 

Controller-сервис

Controller отвечает за управление жизненным циклом томов на уровне кластера.

Что умеет CSI-драйвер

Создание и удаление томов (Volume Provisioning)

Для достижения корректного Volume Provisioning CSI-драйвер обрабатывает запросы Kubernetes на создание и удаление хранилищ через Controller Service. Метод CreateVolume отправляет HTTP POST-запрос к эмулятору Swordfish:

POST /redfish/v1/Storage/<drive_id>/Volumes

с телом:

{
    "Name": "volume_name",
    "CapacityBytes": 1073741824
}

Метод DeleteVolume удаляет том через HTTP DELETE:

DELETE /redfish/v1/Storage/<drive_id>/Volumes/<volume_id>

Монтирование и размонтирование (Attach/Detach)

Монтирование и размонтирование томов производится так: на этапе запуска пода CSI-драйвер монтирует NFS-директорию в файловую систему узла. При завершении работы Pod-а размонтирует ресурс.

Эта функция реализована так. Метод NodePublishVolume получает из VolumeContext:

  • StorageService,

  • FileSystem,

  • Share.

NodePublishVolume обращается к API:

GET /redfish/v1/StorageServices/FileService/FileSystems/FS1/ExportedFileShares/Share
GET /redfish/v1/Systems/.../EthernetInterfaces/<id>

И получает ответ:

  • FileSharePath,

  • NFS-server IP.

Далее выполняется команда mount по этим данным:

mount -t nfs <IP>:<path> <target_path>

Для размонтирования NodeUnpublishVolume выполняет команду:

umount <target_path>

Как CSI-драйвер взаимодействует с эмулятором

Для взаимодействия с эмулятором SwordFish используется структура SwordfishClient, где происходит инкапсуляция всех HTTP-запросов к Swordfish Emulator. API вызывается через net/http, структура запроса строится вручную, а тело сериализуется через encoding/json.

Как это можно использовать:

url := fmt.Sprintf("%s/redfish/v1/Storage/%s/Volumes", baseURL, driveID)

В будущем вместо эмулятора будет использоваться настоящее оборудование СХД от вендора (например YADRO, Аквариус, DELL, EMC). Главное условие работы — поддержка Redfish/Swordfish API со стороны хранилища.

CSI-драйвер уже реализует стандартные HTTP-запросы. Благодаря этому можно использовать те же функции: CreateVolume, DeleteVolume,GetFileShare и прочие. Также для работы необходимо заменить base_url в config.yaml.

При переходе с эмулятора на реальное оборудование: не требуется изменений кода (при соблюдений стандарта API) и возможна проверка доступности и аутентификации через TLS или Token.

Реализация драйвера

Логирование и обработка ошибок

Для записи сбоев и отслеживания логов используется библиотека go-kit/log, которая:

  • подстраивается под формат (logfmt, json),

  • поддерживает уровни логов (debug, info, error),

  • выводит время и файл вызова через log.DefaultCaller.

Для обработки ошибок все внешние вызовы (http, exec) обернуты в проверки и сообщения. В случае возникновения ошибки CSI возвращает status.Errorf(...), лог сохраняется с полным сообщением и stack trace.

Автоматизированное тестирование с использованием csi-sanity

После запуска драйвера на unix socket можно выполнить команду csi-sanity:

csi-sanity -csi.endpoint=<путь к сокету>

csi-sanity проверяет обязательные методы: GetPluginInfo, NodePublishVolume, ControllerCreateVolume и т. д.

Тесты подтверждают корректность реализации CSI-спецификации, и их можно использовать в CI/CD-пайплайне для регресс-тестов. 

Сборка CSI-драйвера

Для простоты развертывания и независимости от среды выполнения мы подготовили минимальный Docker-образ для CSI-драйвера. Используется alpine:3.18, который занимает мало места, но при этом предоставляет все необходимые утилиты.

Основные этапы:

  • добавление необходимых инструментов (например, ca-certificates для работы с HTTPS),

  • копирование готового бинарного файла драйвера (swordfish-csi),

  • добавление конфигурационного файла (config.yaml),

  • настройка прав на выполнение и установка рабочей директории,

  • определение точки входа, которая запускает драйвер с указанной конфигурацией.

Этот Docker-образ позволяет запускать swordfish-csi как отдельный контейнер в Kubernetes.

Чтобы упростить процесс сборки и развертывания драйвера в Kubernetes, мы подготовили автоматизированный скрипт.

Что делает этот скрирт:

  • собирает Docker-образ с CSI-драйвером,

  • запускает контейнер с драйвером.

  • применяет все необходимые манифесты для настройки Kubernetes-окружения,

  • выводит статусы компонентов.

Этот скрипт позволяет полностью развернуть CSI-драйвер и проверить его работоспособность в кластере.

Улучшение эмулятора: логика, логи и файловые шары

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

Валидация

В старой версии эмулятора не было никаких проверок на наличие ресурса, на который ссылается другой ресурс, — из-за этого ошибка 404 была не редкостью. Чтобы решить проблему, мы добавили проверку ресурсов перед их сохранением в базу. Во время проверки с помощью рефлексии определяется корректность типов данных полей ресурса и наличие всех связанных ресурсов.

Логи

Кроме того, мы переработали систему логирования: появилась возможность конфигурации вывода логов, включая источник (консоль и/или файл) и формат (JSON или текстовый). Также можно настроить ротацию логов, то есть указать максимальный размер файла с логом, их максимальное количество и период, после которого лог будет удален.

Ротация логов предотвращает переполнение диска, а поддержка формата JSON упрощает интеграцию с инструментами мониторинга, например с Grafana. Для реализации логирования использовались slog для вывода логов и lumberjack для ротации:

logger:
  stdout: true
  file: true
  format: "json"
logger-rotation:
  file-name: "./logs/log.log"
  max-size: 10
  max-backups: 5
  max-age: 28
  local-time: true
  compress: true

Ресурсы

Чтобы реализовать создание файловой шары (shares) сервером-эмулятором, нужно было также добавить некоторые ресурсы и их обработчики в соответствии со спецификацией Swordfish:

  • StorageService — связывает физические ресурсы (диски, контроллеры) с логическими (тома, файловые системы), агрегирует все компоненты системы хранения (пулы, диски, файловые системы, LUN) в единую логическую единицу и предоставляет API для централизованного управления (например, создание томов, мониторинг).

  • FileShare — описывает общий доступ к файловому хранилищу (NFS, SMB/CIFS, S3-совместимые объектные хранилища), включает настройки доступа, квоты и политики безопасности.

  • FileSystem — ресурс, представляющий логическую файловую систему (например, NTFS, ext4, XFS), служит прослойкой между физическим хранилищем (дисками, пулами) и точками доступа (FileShare), обеспечивая стандартизированное управление файловыми данными.

  • EthernetInterface — ресурс, представляющий физические или виртуальные Ethernet-интерфейсы (NIC, vNIC) систем хранения. Обеспечивает управление сетевыми параметрами, например IP-адресацией (IPv4/IPv6, DHCP/статический), VLAN, MTU, скоростью соединения.

Для создания файловой шары мы остановились на протоколе NFS, для этого нам был нужен NFS-сервер. Чтобы не усложнять проект, использовали nfs-kernel-server и запускали его на одной машине с сервером-эмулятором.

Для работы с NFS-сервером необходимо предоставить клиенту информацию о его IP-адресе. В терминах Swordfish это можно сделать с помощью определенного ранее ресурса EthernetInterface, на который ссылается файловая шара.

Для удобства развертывания сервера-эмулятора мы добавили возможность автоматической инициализации сетевых интерфейсов во время запуска эмулятора. В ходе инициализации создаются экземпляры ресурса EthernetInterface. Это позволяет запускать сервер-эмулятор и сразу создавать экземпляры EthernetInterface, без необходимости что-либо настраивать, а это значительно облегчает развертывание.

После запуска сервера-эмулятора мы получили инициализированные ресурсы EthernetInterface, на которые мы будем ссылаться при создании файловой шары. 

Запрос на создание файловой шары будет выглядеть так:

 POST /redfish/v1/StorageServices/FileService/FileSystems/FS1/ExportedFileShares
{
     "Description": "My File Share.",
     "FileSharePath": "/srv5/nfs_share",
     "FileSharingProtocols": [
          "NFSv4_0"
     ],
     "Name": "MyShare",
     "EthernetInterfaces": {
         "@odata.id": "/redfish/v1/Systems/FileServer/EthernetInterfaces/enp0s3"
       }
 }

Таким образом, мы указываем, что создаваемая шара будет доступна по указанному EthernetInterface. Эту информацию мы используем на стороне клиента при монтировании шары:

mount -t nfs <IP-адрес, полученный от ресурса EthernetInterface>:/data/nfs /mnt

Дополнительно мы реализовали автоматическое размонтирование директории от NFS-сервера при удалении файловой шары. Выполним следующий запрос на заранее созданную файловую шару MyFileShare12:

DELETE /redfish/v1/StorageServices/FileService/FileSystems/FS1/ExportedFileShares/MyFileShare12

Теперь директория удалена из конфигурационного файла /etc/exports и больше не экспортируется NFS-сервером, а ресурс FileShare не существует.

Гибкий доступ: динамическая ролевая модель для сервера Swordfish

Современные системы хранения данных требуют гибких механизмов управления доступом. Мы построили систему на основе RBAC (Role-Based Access Control) с использованием PostgreSQL и JWT — теперь роли и права можно гибко настраивать без перекомпиляции или перезапуска приложения.

Спецификация Swordfish определяет стандартные роли (Administrator, Operator, DevOps, StorageAdmin, CloudAdmin и ReadOnly), но существующие эмуляторы не поддерживают полноценную динамическую модель.

Основные проблемы статического подхода:

  • необходимость перезапуска сервера для изменения прав,

  • ограниченная масштабируемость (до 100 пользователей),

  • отсутствие API для управления пользователями и ролями,

  • жесткая привязка прав доступа к коду приложения.

Наш проект решает эти проблемы, предоставляя:

  • динамическое управление через REST API,

  • поддержку 1000+ пользователей,

  • соответствие спецификации Swordfish,

  • гибкую систему привилегий с поддержкой OEM-расширений.

Архитектура решения

Система построена по трехуровневой схеме:

  1. Транспортный уровень — REST API на Go с использованием Gorilla Mux.

  2. Бизнес-логика — сервисы аутентификации и авторизации.

  3. Уровень данных — PostgreSQL для хранения информации о пользователях и правах.

Процесс аутентификации и авторизации с использованием JWT и RBAC в системе
Процесс аутентификации и авторизации с использованием JWT и RBAC в системе

Рассмотрим подробнее каждый из компонентов. 

Модуль аутентификации

Реализован на основе JWT (JSON Web Tokens) и обеспечивает:

  • Безопасную идентификацию пользователей.

  • Ограничение времени жизни токенов (24 часа).

  • Защиту паролей с помощью bcrypt.

  • Автоматическую очистку устаревших сессий.

Как работает процесс аутентификации:

  • Пользователь отправляет POST /redfish/v1/SessionService/Sessions.

  • Сервер проверяет учетные данные.

  • Создается JWT-токен с claims (ID пользователя, роль, срок действия).

Последовательность аутентификации: процесс получения JWT-токена клиентом через API, обработчик сессий и сервис аутентификации
Последовательность аутентификации: процесс получения JWT-токена клиентом через API, обработчик сессий и сервис аутентификации

Ролевая модель (RBAC)

Полностью соответствует спецификациям Swordfish и Redfish, поддерживая:

  • Стандартные роли (Administrator, Operator, StorageAdmin, CloudAdmin, DevOps, ReadOnly).

  • OEM-привилегии производителей.

  • Динамическое управление правами через REST API.

  • Переопределения прав для отдельных свойств ресурсов.

База данных

Мы разработали схему БД PostgreSQL, включающую следующие ключевые таблицы:

  • role — хранит информацию о ролях,

  • privilege — определяет привилегии,

  • role_privilege — связывает роли с привилегиями,

  • operation_privilege — определяет привилегии для операций,

  • user_account — содержит данные пользователей,

  • session — хранит активные сессии.

Схема базы данных PostgreSQL для управления пользователями, ролями и привилегиями
Схема базы данных PostgreSQL для управления пользователями, ролями и привилегиями

Проверка прав

Процесс проверки прав состоит из следующих шагов:

  1. Middleware извлекает JWT и проверяет подпись.

  2. Определяет требуемые привилегии для запрашиваемого ресурса.

  3. Проверяет права пользователя через БД.

Пример корректного ответа сервера-эмулятора при наличии прав доступа у пользователя к хранилищу
Пример корректного ответа сервера-эмулятора при наличии прав доступа у пользователя к хранилищу

Для обеспечения высокой производительности мы реализовали кэширование решений о доступе. Для потокобезопасного хранения используется sync.Map, где ключом служит комбинация ID пользователя и списка привилегий. При изменении прав кэш автоматически очищается. 

Реализованная динамическая ролевая модель расширяет возможности сервера-эмулятора Swordfish, делая его более удобным инструментом для тестирования Ansible-модулей и других клиентов СХД.

Пример работы
Пример работы

В планах развития внедрение двухфакторной аутентификации, добавление OEM-привилегий для специфических СХД и интеграция с внешними системами аутентификации (LDAP, OAuth2).

Где и как использовать это решение

Чтобы воспользоваться Swordfish‑CSI, необходимо собрать проект, подготовить окружение с Kubernetes (Minikube), Docker и NFS‑сервером, а затем задеплоить эмулятор и CSI‑драйвер.

Требования: 

  • kubectl: Client Version v1.28.2.

  • Minikube: v1.35.0.

  • Docker: Version 28.0.4 (API version 1.48).

  • NFS‑сервер (для хранения PV/PVC).

  • Git (для клонирования репозиториев).

Проверка инструментов

Необходимо выполнить команды kubectl version --client, minikube version, docker version.

Настройка NFS

Скрипт setup_nfs.sh

  • Настройка статического IP на интерфейсе хоста.

  • Установка и запуск NFS‑сервера.

  • Настройка экспорта папки /srv/nfs_share для указанной подсети.

  • Конфигурация фаервола (UFW) для доступа по NFS.

Сценарий сборки и запуска

Клонировать репозитории:

git clone git@gitlab.com:IgorNikiforov/swordfish-emulator-go.git
git clone https://gitlab.com/swordfish-csi-dev-team/swordfish-csi.git
  • Эмулятор Swordfish: swordfish-emulator-go. 

  • CSI‑драйвер Swordfish: swordfish-csi.

Перейти в директорию swordfish-csi и запустить скрипт сборки и развертывания:

cd swordfish-csi
chmod +x deploy/deploy_csi_driver_from_rep.sh
 ./deploy/deploy_csi_driver_from_rep.sh

Убедиться, что создан config.yaml в корне или скопировать его из образца:

server:

network_type: "unix"
socket: "/var/lib/kubelet/plugins/swordfish-csi/csi.sock"

swordfish:

base_url: "http://localhost:8080"

logging:

level: "info"
format: "json"

Настроить и запустить NFS-сервер (если требуется вручную):

chmod +x setup_nfs.sh
sudo ./setup_nfs.sh

Запустить эмулятора Swordfish:

cd swordfish-emulator-go
make start

Проверить статус ресурсов:

kubectl get pods -n kube-system
kubectl get pv
kubectl get pvc

При необходимости задеплоить тестовый под:

kubectl apply -f examples/pod.yaml

Тестовый под должен создать тестовое окружение, в котором можно будет провести сценарий работы драйвера и эмулятора как СХД. На хостовой машине в файловой шаре должны будут добавляться файлы, которые мы прокидываем в поде.

Описание YAML‑манифестов
  • rbac.yaml
    Настраивает сервисный аккаунт, ClusterRole с правами управления PV, PVC, nodes, secrets и ресурсами storage.k8s.io, а также ClusterRoleBinding.

  • swordfish.yaml
    Деплой CSI‑драйвера в namespace kube-system:

    — контейнер swordfish-csi (основной), csi-provisioner, csi-attacher, csi-resizer, liveness-probe,

    — монтирование каталога плагина и конфигурации через ConfigMap.

  • pv.yaml и pvc.yaml
    Создают PersistentVolume объемом 1 Gi и PersistentVolumeClaim, запрашивающий этот объем из storageClass: swordfish-csi.

  • pod.yaml
    Тестовый под с контейнером Nginx, монтирующий PVC в /usr/share/nginx/html.

  • storage_class.yaml
    Определяет StorageClass swordfish-csi с provisioner swordfish-csi, политикой Retain и Immediate binding.

Скрипты

  • setup_nfs.sh
    Скрипт для настройки статического IP, установки и конфигурации NFS‑сервера и фаервола.

  • deploy_csi_driver_from_rep.sh

    Автоматизация:

  1. Клонирование CSI‑репозитория и чек-аут нужной ветки.

  2. Сборка и запуск Docker‑образа драйвера.

  3.  Применение YAML‑манифестов (rbac, deployment, PV/PVC).

  4. Создание ConfigMap из config.yaml.

  5. Проверка статуса Pod, PV и PVC.

Dockerfile и конфигурация

  • Dockerfile
    Двухэтапная сборка: компиляция Go‑бинаря и финальный Alpine‑образ с конфигом.

  • config.yaml
    Параметры:

    • тип сети и путь к CSI‑сокету,

    • URL эмулятора Swordfish,

    • уровень и формат логирования.

Эмулятор

nfs_setup.sh

Скрипт проверяет root‑привилегии, устанавливает nfs-kernel-server, задает права на экспорт и добавляет пользователя в группу sudo.

После выполнения всех шагов окружение будет готово: развернут NFS‑сервер, запущен эмулятор и CSI‑драйвер Swordfish, а также созданы PV, PVC и тестовый под с монтированным хранилищем.

Собираем в контейнер emulator и driver, загружаем в Minicube.

minikube image load swordfish-emulator:latest
minikube image load swordfish-csi:latest

bash ./deploy_csi_driver.sh

Далее для ручного тестирования драйвера заходим в него:

kubectl exec -it swordfish-csi-6bcd8867b5-7lbqj -n kube-system -- sh
/etc/swordfish # apk add curl

/etc/swordfish # curl -sSL "https://github.com/fullstorydev/grpcurl/releases/download/v1.8.9/grpcurl_1.8.9_linux_x86_64.tar.gz" | tar -xz -C /usr/local/bin

Вызов CreateVolume:

grpcurl -d '{"name":"demo-vol","capacityRange":{"requiredBytes":1073741824},"parameters":{"drive_id":"IPAttachedDrive1"},"volumeCapabilities":[{"accessMode":{"mode":"SINGLE_NODE_WRITER"},"mount":{"fsType":"ext4"}}]}' -plaintext -unix /var/lib/kubelet/plugins/swordfish-csi/csi.sock csi.v1.Controller/CreateVolume

Вызов ControllerPublishVolume:

/etc/swordfish # grpcurl -plaintext -unix -d '{"volume_id":"hFBQva", "node_id":"hFBQva"}' /var/lib/kubelet/plugins/swordfish-csi/csi.sock csi.v1.Controller/ControllerPublishVolume

# {}

Вызов ControllerUnpublishVolume:

/etc/swordfish # grpcurl -plaintext -unix -d '{"volume_id":"hFBQva", "node_id":"hFBQva"}' /var/lib/kubelet/plugins/swordfish-csi/csi.sock csi.v1.Controller/ControllerUnpublishVolume

# {}

Вместо заключения

Итак, мы разработали полноценную связку:

  • CSI-драйвер для Kubernetes, поддерживающий спецификацию Swordfish API.

  • Сервер-эмулятор Swordfish, позволяющий тестировать работу с СХД без реального оборудования.

CSI-драйвер поддерживает все базовые операции с томами, включая их создание, удаление, монтирование и размонтирование. Благодаря интеграции со Swordfish API управление хранилищем осуществляется через единый стандартизированный интерфейс. Поддержка NFS позволяет удобно подключать сетевое хранилище к Kubernetes-приложениям. Кроме того, мы реализовали систему логирования и обработки ошибок, что значительно повышает стабильность работы и облегчает отладку.

Для проверки работоспособности решения мы проведены тесты с использованием утилиты csi-sanity, которые подтвердили соответствие CSI-драйвера официальной спецификации. Также развернули полноценное Kubernetes-окружение для демонстрации и отладки, что позволило на практике оценить интеграцию с эмулятором Swordfish. Кроме того, подготовили Docker-образы и скрипты, обеспечивающие быстрое развертывание и запуск системы в тестовой среде.

В планах — еще больше возможностей: добавить динамическое управление доступом (RBAC) для авторизации в СХД, реализовать эту модель прямо в эмуляторе — с полноценной валидацией прав и расширить поддержку новых типов хранилищ в рамках спецификации Swordfish. Кроме того, мы адаптируем CSI-драйвер под разные протоколы подключения и проверим совместимость с реальными СХД от разных вендоров.

С исходным кодом проектов можно ознакомиться по ссылкам: Swordfish Emulator Go и Swordfish CSI

Теги:
Хабы:
+16
Комментарии0

Публикации

Информация

Сайт
yadro.com
Дата регистрации
Дата основания
Численность
5 001–10 000 человек
Местоположение
Россия
Представитель
Ульяна Соловьева