← Назад к вопросам

Что такое Container Storage Interface?

3.0 Senior🔥 101 комментариев
#Kubernetes

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Container Storage Interface (CSI)?

Container Storage Interface (CSI) — это открытый стандартный API, который определяет интерфейс между системой оркестрации контейнеров (например, Kubernetes, Mesos, Docker Swarm) и внешними системами хранения данных (такими как облачные диски, сети хранения данных SAN/NAS, программно-определяемые решения SDS). Его основная цель — декларативное и унифицированное управление жизненным циклом томов (volumes) для контейнерных рабочих нагрузок.

До появления CSI (до ~2018 года) поддержка хранилищ в Kubernetes была встроенной (in-tree): код драйверов хранилищ (например, для AWS EBS, Google Persistent Disk, Ceph RBD) поставлялся в составе ядра Kubernetes. Это создавало серьёзные ограничения:

  • Для добавления поддержки нового хранилища или обновления существующего драйвера требовалось изменять код самого Kubernetes и выпускать новую версию.
  • Драйверы работали в пространстве ядра kube-controller-manager и kubelet, что повышало риск сбоев и усложняло отладку.
  • Вендоры хранилищ были вынуждены синхронизировать свои релизы с графиком Kubernetes.

CSI решает эти проблемы, предоставляя стандартизированный, плагино-ориентированный механизм, который отделяет логику оркестратора от логики управления хранилищем.

Архитектура и ключевые компоненты CSI

Реализация CSI в Kubernetes (как наиболее распространённом оркестраторе) включает несколько компонентов:

1. Sidecar-контейнеры (внешние контроллеры)

Это вспомогательные контейнеры, которые работают в Pod'е вместе с CSI-драйвером (который поставляется вендором хранилища) и расширяют его функциональность, взаимодействуя с API Kubernetes. Основные sidecar-контейнеры:

  • external-provisioner — отслеживает создание/удаление объектов PersistentVolumeClaim (PVC) и вызывает метод CreateVolume/DeleteVolume CSI-драйвера.
  • external-attacher — отслеживает объекты VolumeAttachment и вызывает метод ControllerPublishVolume/ControllerUnpublishVolume для привязки тома к узлу.
  • external-snapshotter — управляет созданием снапшотов томов через CSI-драйвер.
  • external-resizer — обрабатывает запросы на изменение размера тома.
  • node-driver-registrar — регистрирует драйвер в kubelet на каждом узле.

2. CSI-драйвер

Это основной компонент, предоставляемый вендором хранилища. Он состоит из двух логических частей:

  • Controller Plugin — работает в Pod'е с правами cluster-admin и реализует операции управления томами на уровне кластера (создание, удаление, привязка, снапшоты). Вызывается через sidecar-контейнеры.
  • Node Plugin — работает в DaemonSet на каждом узле кластера и реализует операции на уровне узла: монтирование/размонтирование тома (NodeStageVolume, NodePublishVolume) в конкретный Pod. Взаимодействует напрямую с kubelet.

3. Взаимодействие с Kubelet

Kubelet использует стандартный Unix Domain Socket (обычно /var/lib/kubelet/plugins_registry/<driver-name>.sock) для прямого взаимодействия с Node Plugin CSI-драйвера, минуя API-сервер Kubernetes. Это обеспечивает высокую производительность и надёжность операций монтирования.

Практический пример: Создание тома через CSI в Kubernetes

Рассмотрим типичный поток запроса на выделение хранилища (динамическое провижионирование):

  1. Пользователь создаёт манифест PersistentVolumeClaim (PVC).
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-pvc-example
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: csi-ssd  # Используется StorageClass с CSI-драйвером
  resources:
    requests:
      storage: 10Gi
  1. Kubernetes создаёт объект PVC. external-provisioner sidecar-контейнер (подписанный на события PVC) обнаруживает новый запрос.

  2. external-provisioner вызывает метод CreateVolume CSI-драйвера (Controller Plugin), передавая параметры из StorageClass.

  3. CSI-драйвер взаимодействует с API бэкенд-хранилища (например, облачного провайдера) и создаёт физический том. Информация о нём возвращается как PersistentVolume (PV).

  4. Когда Pod, использующий этот PVC, планируется на узел, external-attacher вызывает метод ControllerPublishVolume драйвера, чтобы "прикрепить" том к целевому узлу.

  5. На целевом узле kubelet через сокет вызывает метод NodeStageVolume (если требуется) и NodePublishVolume у Node Plugin CSI-драйвера, который монтирует том в директорию Pod'а (например, /var/lib/kubelet/pods/<pod-id>/volumes/kubernetes.io~csi/<volume-name>/mount).

Преимущества использования CSI

  • Стандартизация: Единый интерфейс для любых систем хранения.
  • Безопасность и изоляция: Драйверы работают как пользовательские Pod'ы, а не в составе системных компонентов Kubernetes.
  • Независимость жизненного цикла: Вендоры могут обновлять и расширять свои драйверы без изменений в коде Kubernetes.
  • Расширенная функциональность: Поддержка современных функций хранилищ: снапшоты, клонирование, изменение размера "на лету", топологии (привязка к зонам доступности), групповое управление томами.
  • Упрощение разработки: Вендорам достаточно реализовать gRPC-сервер, соответствующий спецификации CSI.

Заключение

Container Storage Interface — это фундаментальный стандарт в экосистеме контейнеризации, который превратил управление хранилищем из монолитной, сложно расширяемой подсистемы в модульную, гибкую и мощную платформу. Для инженеров DevOps и SRE понимание CSI критически важно для проектирования отказоустойчивых, производительных и переносимых stateful-приложений в Kubernetes, а также для эффективной работы с гибридными и мульти-облачными средами хранения данных.