Истории успеха наших клиентов — лучшие проекты
Вход/ Регистрация
На главную
25eb9e0a-a5a8-472a-ace7-940b8bd2adf0
Облачные сервисы

Подключение сетевых дисков

Сетевые диски удобны для хранения данных, которые нужно сохранять между запусками подов или использовать на разных узлах. Они подходят для баз данных, резервного копирования, масштабирования хранилища по мере необходимости и изоляции данных между приложениями.

При использовании сетевых дисков в кластере действуют те же ограничения, что и при использовании дисков с облачными серверами. Для подключения сетевого диска кластер должен располагаться в Санкт-Петербурге.

CSI-драйвер сетевых дисков предназначен для интеграции сетевых дисков с кластером Kubernetes. Этот драйвер состоит из двух ключевых компонентов:

  1. Контроллер: Отвечает за взаимодействие с API. Его задачи включают создание, удаление и изменение размера сетевых дисков.
  2. Node-агент: Работает на каждом узле кластера и выполняет задачи, связанные с монтированием и управлением дисками на уровне операционной системы. Это включает запросы к API для монтирования или отмонтирования дисков, их форматирование в файловую систему ext4 и, при необходимости, изменение размеров.

Основные особенности драйвера:

  1. Диски автоматически форматируются в ext4.
  2. Драйвер поддерживает только режим ReadWriteOnce. Это означает, что один диск может быть подключен к одной ноде. При этом все поды на ноде будут иметь доступ к диску.

Чтобы использовать сетевые диски в кластере, необходимо установить CSI-драйвер. Рассмотрим, как это сделать.

Установка драйвера CSI

Установить CSI-драйвер можно через панель управления кластером в разделе «Дополнения» или вручную — с помощью Helm. Рассмотрим оба варианта установки.

Для работы драйвера требуется 250 миллиядер и 250 МБ ОЗУ на каждой воркер-ноде. Кроме того, на одной из нод должно быть доступно еще 450 миллиядер и 626 МБ ОЗУ.

В панели управления перейдите в раздел «Дополнения» и нажмите на дополнение «CSI-driver».

Scr 20250818 Lolf

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

Scr 20250818 Lpck

Дождитесь завершения установки.

После установки убедитесь, что все поды в неймспейсе csi-driver-timeweb-cloud работают:

    
kubectl get pods -n csi-driver-timeweb-cloud

Проверьте, что драйвер зарегистрирован:

    
kubectl get csidrivers

Вывод должен быть примерно таким:

    
NAME ATTACHREQUIRED PODINFOONMOUNT STORAGECAPACITY TOKENREQUESTS REQUIRESREPUBLISH MODES AGE network-drives.csi.timeweb.cloud false true true <unset> false Persistent 22h

Обновление драйвера

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

Если драйвер устанавливался при помощи Helm, выполните удаление с помощью kubectl:

    
kubectl delete -n csi-driver-timeweb-cloud csidriver network-drives.csi.timeweb.cloud

Если драйвер устанавливался через панель управления, перейдите в раздел «Дополнения» и кликните по карточке «CSI-driver». После этого нажмите кнопку «Удалить».

Scr 20250922 Mzuv

После удаления драйвера установите его заново. Рекомендуем использовать установку через панель управления.

Создание диска при помощи манифеста

Создание диска с использованием CSI-драйвера в Kubernetes начинается с создания PersistentVolumeClaim (PVC). Это запрос на предоставление тома с заданными параметрами, такими как размер, режим доступа и класс хранилища.

Для начала создайте файл pvc.yaml, в котором нужно указать параметры PVC. Пример содержимого файла:

    
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nvme namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: nvme.network-drives.csi.timeweb.cloud

В параметрах PersistentVolumeClaim указываются следующие значения:

  • name — имя вашего PVC.

  • namespace — пространство имен, где будет создан запрос.

  • storage — размер диска (минимальный размер — 1 ГБ).

  • storageClassName — класс хранилища:

    • nvme.network-drives.csi.timeweb.cloud — для NVMe-дисков,

    • hdd.network-drives.csi.timeweb.cloud — для HDD.

О различиях между типами сетевых дисков вы можете прочитать в этой статье.

После того, как манифест подготовлен, примените его с помощью команды:

    
kubectl apply -f pvc.yaml

Чтобы расширить диск, измените значение параметра storage и повторно примените манифест. Это можно сделать в любой момент.

Стоит учесть, что сам диск на этом этапе еще не будет создан. Он будет создан только тогда, когда PVC будет связан с работающим подом.

Теперь создадим под, который будет использовать созданный PVC. Рассмотрим пример пода с Nginx, подключающим диск в качестве тома. Для этого создайте файл nginx-pod.yaml:

    
apiVersion: v1 kind: Pod metadata: name: nginx-pvc namespace: default spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80 volumeMounts: - name: nginx-storage mountPath: /usr/share/nginx/html volumes: - name: nginx-storage persistentVolumeClaim: claimName: pvc-nvme

В этом файле описывается под, в котором Nginx использует том для хранения данных:

  • volumes — задается подключение тома через PVC, который был создан ранее.

  • claimName — должно совпадать с именем PVC.

  • volumeMounts — указывается, куда именно в файловой системе контейнера будет подключен том (в данном случае — /usr/share/nginx/html).

Примените манифест с помощью команды:

    
kubectl apply -f nginx-pod.yaml

Убедитесь, что PVC создан и находится в статусе Bound:

    
kubectl get pvc pvc-nvme

Вы должны увидеть подобный вывод:

    
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE pvc-nvme Bound pvc-a3a43b9e-6a1a-43e6-b218-3ff7d49b97b5 1Gi RWO nvme.network-drives.csi.timeweb.cloud <unset> 11s

Проверьте состояние пода:

    
kubectl get pods nginx-pvc

Пример вывода:

    
NAME READY STATUS RESTARTS AGE nginx-pvc 1/1 Running 0 2m17s

Если под или PVC не создаются, проверьте ошибки в Events:

Для PVC:

    
kubectl describe pvc pvc-nvme

Для пода:

    
kubectl describe pod nginx-pvc

Обратите внимание, что при удалении PVC диск будет удален из панели управления. Если вы хотите предотвратить это, необходимо создать сетевой диск в панели управления и подключить его по инструкции ниже.

Увеличение объема диска

Для увеличения объема существующего диска необходимо обновить манифест PersistentVolumeClaim.

В нашем примере откройте файл pvc.yaml и измените значение в поле spec.resources.requests.storage. Например, чтобы указать 3 ГБ, манифест должен выглядеть так:

    
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nvme namespace: default spec: accessModes: - ReadWriteOnce resources: requests: storage: 3Gi storageClassName: nvme.network-drives.csi.timeweb.cloud

Сохраните изменения и примените обновленный манифест командой:

    
kubectl apply -f pvc.yaml

Подключение существующего диска к кластеру

Если у вас уже есть сетевой диск, который нужно подключить к Kubernetes, вам потребуется описать PersistentVolume (PV). Это действие связывает диск с кластером и позволяет использовать его в подах. Однако важно учитывать, что если на диске ранее были созданы разделы, они будут удалены. Kubernetes не работает с разделами и использует диск как единое пространство.

Создайте файл pv-existing-disk.yaml с описанием PV:

    
apiVersion: v1 kind: PersistentVolume metadata: name: existing-disk-pv spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain csi: driver: network-drives.csi.timeweb.cloud volumeHandle: 0df2e9fc-ad17-414b-9e4c-373bbd0479cb fsType: ext4 storageClassName: nvme.network-drives.csi.timeweb.cloud

Что здесь важно:

  • storageClassName — выберите класс хранения, соответствующий типу вашего диска. Для NVMe-дисков используйте nvme.network-drives.csi.timeweb.cloud, для HDD — hdd.network-drives.csi.timeweb.cloud.

  • persistentVolumeReclaimPolicy: Retain — предотвращает удаление диска, если PVC будет удален.

  • fsType — файловая система, которая будет использоваться.

  • volumeHandle — это идентификатор диска. Чтобы его узнать, откройте раздел «Сетевые диски» в панели управления, выберите нужный диск и скопируйте UUID из URL страницы. 

Selection 142

После описания PV нужно создать PVC, чтобы связать этот диск с подами. Создайте файл pvc-existing-disk.yaml:

    
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: existing-disk-pvc spec: volumeMode: Filesystem accessModes: - ReadWriteOnce resources: requests: storage: 10Gi volumeName: existing-disk-pv storageClassName: nvme.network-drives.csi.timeweb.cloud

В этом манифесте обратите внимание на следующие поля:

  • volumeName — должно точно совпадать с именем PV, созданного ранее.

  • storageClassName — должно соответствовать значению, указанному в PV.

  • resources.requests.storage — укажите размер диска, равный значению, указанному в PV.

Примените манифесты с помощью команд:

    
kubectl apply -f pv-existing-disk.yaml kubectl apply -f pvc-existing-disk.yaml

Теперь PVC готов к использованию. Чтобы проверить, что диск подключен корректно, создайте тестовый под, который запишет файл на диск. Для этого подготовьте файл write-file-pod.yaml:

    
apiVersion: v1 kind: Pod metadata: name: write-to-existing-disk spec: containers: - name: writer image: busybox command: ["/bin/sh", "-c"] args: ["echo 'Hello, Timeweb Cloud!' > /mnt/data/hello.txt && sleep 3600"] volumeMounts: - name: existing-disk-storage mountPath: /mnt/data volumes: - name: existing-disk-storage persistentVolumeClaim: claimName: existing-disk-pvc

Примените манифест пода:

    
kubectl apply -f write-file-pod.yaml

Когда под запустится, проверьте содержимое файла, записанного на диск. Для этого выполните команду:

    
kubectl exec -it write-to-existing-disk -- cat /mnt/data/hello.txt

В выводе вы должны увидеть:

    
Hello, Timeweb Cloud!

Если вы хотите проверить содержимое диска вне Kubernetes, отключите его от кластера через панель управления, подключите к серверу и примонтируйте диск. Убедитесь, что монтируете весь диск, а не его разделы, так как они не создаются при использовании Kubernetes. После монтирования в корне диска вы найдете файл hello.txt.

Была ли статья полезна?
Ваша оценка очень важна
Пока нет комментариев