Сетевые диски удобны для хранения данных, которые нужно сохранять между запусками подов или использовать на разных узлах. Они подходят для баз данных, резервного копирования, масштабирования хранилища по мере необходимости и изоляции данных между приложениями.
CSI-драйвер сетевых дисков предназначен для интеграции сетевых дисков с кластером Kubernetes. Этот драйвер состоит из двух ключевых компонентов:
- Контроллер: Отвечает за взаимодействие с API. Его задачи включают создание, удаление и изменение размера сетевых дисков.
- Node-агент: Работает на каждом узле кластера и выполняет задачи, связанные с монтированием и управлением дисками на уровне операционной системы. Это включает запросы к API для монтирования или отмонтирования дисков, их форматирование в файловую систему
ext4и, при необходимости, изменение размеров.
Основные особенности драйвера:
- Диски автоматически форматируются в
ext4. - Драйвер поддерживает только режим
ReadWriteOnce. Это означает, что один диск может быть подключен к одной ноде. При этом все поды на ноде будут иметь доступ к диску.
Чтобы использовать сетевые диски в кластере, необходимо установить CSI-драйвер. Рассмотрим, как это сделать.
Установка драйвера CSI
Установить CSI-драйвер можно через панель управления кластером в разделе «Дополнения» или вручную — с помощью Helm. Рассмотрим оба варианта установки.
Для работы драйвера требуется 250 миллиядер и 250 МБ ОЗУ на каждой воркер-ноде. Кроме того, на одной из нод должно быть доступно еще 450 миллиядер и 626 МБ ОЗУ.
В панели управления перейдите в раздел «Дополнения» и нажмите на дополнение «CSI-driver».

В открывшемся окне нажмите кнопку «Установить».

Дождитесь завершения установки.
После установки убедитесь, что все поды в неймспейсе csi-driver-timeweb-cloud работают:
Проверьте, что драйвер зарегистрирован:
Вывод должен быть примерно таким:
Обновление драйвера
Способ актуален как при установке драйвера через Helm, так и при установке через панель управления кластером. Для обновления необходимо удалить текущий CSI-драйвер и установить его заново.
После обновления подключенные сетевые диски продолжат работать в штатном режиме — повторное подключение не требуется.
Если драйвер устанавливался при помощи Helm, выполните удаление с помощью kubectl:
Если драйвер устанавливался через панель управления, перейдите в раздел «Дополнения» и кликните по карточке «CSI-driver». После этого нажмите кнопку «Удалить».

После удаления драйвера установите его заново. Рекомендуем использовать установку через панель управления.
Создание диска при помощи манифеста
Создание диска с использованием CSI-драйвера в Kubernetes начинается с создания PersistentVolumeClaim (PVC). Это запрос на предоставление тома с заданными параметрами, такими как размер, режим доступа и класс хранилища.
Для начала создайте файл pvc.yaml, в котором нужно указать параметры PVC. Пример содержимого файла:
В параметрах PersistentVolumeClaim указываются следующие значения:
-
name— имя вашего PVC. -
namespace— пространство имен, где будет создан запрос. -
storage— размер диска (минимальный размер — 1 ГБ). -
storageClassName— класс хранилища: -
nvme.network-drives.csi.timeweb.cloud— для NVMe-дисков, -
hdd.network-drives.csi.timeweb.cloud— для HDD.
О различиях между типами сетевых дисков вы можете прочитать в этой статье.
После того, как манифест подготовлен, примените его с помощью команды:
Чтобы расширить диск, измените значение параметра storage и повторно примените манифест. Это можно сделать в любой момент.
Стоит учесть, что сам диск на этом этапе еще не будет создан. Он будет создан только тогда, когда PVC будет связан с работающим подом.
Теперь создадим под, который будет использовать созданный PVC. Рассмотрим пример пода с Nginx, подключающим диск в качестве тома. Для этого создайте файл nginx-pod.yaml:
В этом файле описывается под, в котором Nginx использует том для хранения данных:
-
volumes— задается подключение тома через PVC, который был создан ранее. -
claimName— должно совпадать с именем PVC. -
volumeMounts— указывается, куда именно в файловой системе контейнера будет подключен том (в данном случае —/usr/share/nginx/html).
Примените манифест с помощью команды:
Убедитесь, что PVC создан и находится в статусе Bound:
Вы должны увидеть подобный вывод:
Проверьте состояние пода:
Пример вывода:
Если под или PVC не создаются, проверьте ошибки в Events:
Для PVC:
Для пода:
Обратите внимание, что при удалении PVC диск будет удален из панели управления. Если вы хотите предотвратить это, необходимо создать сетевой диск в панели управления и подключить его по инструкции ниже.
Увеличение объема диска
Для увеличения объема существующего диска необходимо обновить манифест PersistentVolumeClaim.
В нашем примере откройте файл pvc.yaml и измените значение в поле spec.resources.requests.storage. Например, чтобы указать 3 ГБ, манифест должен выглядеть так:
Сохраните изменения и примените обновленный манифест командой:
Подключение существующего диска к кластеру
Если у вас уже есть сетевой диск, который нужно подключить к Kubernetes, вам потребуется описать PersistentVolume (PV). Это действие связывает диск с кластером и позволяет использовать его в подах. Однако важно учитывать, что если на диске ранее были созданы разделы, они будут удалены. Kubernetes не работает с разделами и использует диск как единое пространство.
Создайте файл pv-existing-disk.yaml с описанием PV:
Что здесь важно:
-
storageClassName— выберите класс хранения, соответствующий типу вашего диска. Для NVMe-дисков используйтеnvme.network-drives.csi.timeweb.cloud, для HDD —hdd.network-drives.csi.timeweb.cloud. -
persistentVolumeReclaimPolicy: Retain— предотвращает удаление диска, если PVC будет удален. -
fsType— файловая система, которая будет использоваться. -
volumeHandle— это идентификатор диска. Чтобы его узнать, откройте раздел «Сетевые диски» в панели управления, выберите нужный диск и скопируйтеUUIDиз URL страницы.

После описания PV нужно создать PVC, чтобы связать этот диск с подами. Создайте файл pvc-existing-disk.yaml:
В этом манифесте обратите внимание на следующие поля:
-
volumeName— должно точно совпадать с именем PV, созданного ранее. -
storageClassName— должно соответствовать значению, указанному в PV. -
resources.requests.storage— укажите размер диска, равный значению, указанному в PV.
Примените манифесты с помощью команд:
Теперь PVC готов к использованию. Чтобы проверить, что диск подключен корректно, создайте тестовый под, который запишет файл на диск. Для этого подготовьте файл write-file-pod.yaml:
Примените манифест пода:
Когда под запустится, проверьте содержимое файла, записанного на диск. Для этого выполните команду:
В выводе вы должны увидеть:
Если вы хотите проверить содержимое диска вне Kubernetes, отключите его от кластера через панель управления, подключите к серверу и примонтируйте диск. Убедитесь, что монтируете весь диск, а не его разделы, так как они не создаются при использовании Kubernetes. После монтирования в корне диска вы найдете файл hello.txt.