---
title: "Подключение сетевых дисков к кластеру Kubernetes"
description: "Подключение сетевых дисков к кластеру Kubernetes. Документация и инструкции по работе с IT-инфраструктурой в Timeweb Cloud."
---

> Полный индекс документации для ИИ-агентов: [llms.txt](https://timeweb.cloud/llms.txt).

[Сетевые диски](https://timeweb.cloud/docs/network-drives) удобны для размещения данных, которые должны быть доступны между запусками подов или использовать на разных узлах. Они подходят для баз данных, резервного копирования, масштабирования хранилища по мере необходимости и изоляции данных между приложениями.

> [!NOTE]
> При использовании сетевых дисков в кластере действуют [те же ограничения](https://timeweb.cloud/docs/network-drives#ogranicheniya-setevyh-diskov), что и при использовании дисков с облачными серверами. Доступность сетевых дисков зависит от региона кластера: в Санкт-Петербурге доступны NVMe- и HDD-диски, в Москве — только NVMe-диски.

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

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

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

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

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

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

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

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

Через панель управления

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

![Scr 20250818 Lolf](https://content.timeweb.com/assets/7182bc53-b204-45bf-ab07-8f1a42a79f59.png?width=1982&height=1436)

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

![Scr 20250818 Lpck](https://content.timeweb.com/assets/57c915e6-ff05-4775-8f23-da0329457a7a.png?width=2006&height=1098)

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

Через Helm

Создайте файл `values.yaml` и добавьте следующие параметры:

```yml
# Токен с доступом к сетевым дискам + кластерам k8s
TW_API_SECRET: "токен"
# ID из панели
TW_CLUSTER_ID: "1000000"

provisionerName: network-drives.csi.timeweb.cloud
# plugin container image options
image:
  # image name
  repository: cr-internal.twcstorage.ru/network-drives-csi/driver
  # image tag
  tag: 2
  # image pull policy
  pullPolicy: Always

# Node service options
node:
  # node service log level
  logLevel: debug
  # force logs as json
  logJson: true

# Controller service options
controller:
  # controller replica count
  replicas: 1

  # controller node selector
  nodeSelector: {}

  # controller toleration options
  tolerations: []

# RBAC options
rbac:
  createRoles: true
  createServiceAccounts: true

# metrics options
metrics:
  podMonitor:
    enabled: false
    port: metrics
    path: /metrics
    interval: 60s
```

-   `TW_API_SECRET` — токен доступа к API Timeweb Cloud. Получить токен можно в панели управления на странице «[API и Terraform](https://timeweb.cloud/my/api-keys)».
    
-   `TW_CLUSTER_ID` — ID Kubernetes-кластера. Это значение можно найти в URL страницы с информацией о вашем кластере в панели управления.
    

![Selection 141](https://content.timeweb.com/assets/235e7faf-4ff8-49b7-94e8-3f7e0d41d2ba.png?width=1354&height=615)

Установите CSI-драйвер при помощи Helm:

```shell
helm install csi-tw-helm oci://cr-internal.twcstorage.ru/network-drives-csi/csi-driver-timeweb-cloud \
  -f values.yaml \
  --namespace csi-driver-timeweb-cloud \
  --create-namespace
```

Если необходимо установить конкретную версию драйвера, добавьте параметр `--version`:

```shell
helm install csi-tw-helm oci://cr-internal.twcstorage.ru/network-drives-csi/csi-driver-timeweb-cloud \
  -f values.yaml \
  --namespace csi-driver-timeweb-cloud \
  --create-namespace \
  --version 1.0.0
```

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

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

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

```shell
kubectl get csidrivers
```

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

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

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

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

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

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

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

![Scr 20250922 Mzuv](https://content.timeweb.com/assets/b40fc15e-b3dc-41fc-a6a3-a593ca32d116.png?width=2000&height=1402)

После удаления драйвера [установите его](https://timeweb.cloud/docs/k8s/network-drives-connection#ustanovka-drajvera-csi) заново. Рекомендуем использовать установку через панель управления.

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

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

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

```yml
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.
    

О различиях между типами сетевых дисков вы можете прочитать в [этой статье](https://timeweb.cloud/docs/network-drives#tipy-setevyh-diskov).

Учитывайте регион кластера: в Санкт-Петербурге доступны NVMe- и HDD-диски, в Москве — только NVMe-диски.

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

```shell
kubectl apply -f pvc.yaml
```

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

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

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

```yml
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`).
    

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

```shell
kubectl apply -f nginx-pod.yaml
```

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

```shell
kubectl get pvc pvc-nvme
```

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

```shell
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
```

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

```shell
kubectl get pods nginx-pvc
```

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

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

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

Для PVC:

```shell
kubectl describe pvc pvc-nvme
```

Для пода:

```shell
kubectl describe pod nginx-pvc
```

Обратите внимание, что при удалении PVC диск будет удален из панели управления. Если вы хотите предотвратить это, необходимо [создать сетевой диск](https://timeweb.cloud/docs/network-drives#sozdanie-setevogo-diska) в панели управления и подключить его по инструкции ниже.

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

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

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

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

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

```shell
kubectl apply -f pvc.yaml
```

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

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

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

```yml
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` — это идентификатор диска. Чтобы его узнать, откройте раздел «[Сетевые диски](https://timeweb.cloud/my/network-drives)» в панели управления, выберите нужный диск и скопируйте `UUID` из URL страницы. 
    

![Selection 142](https://content.timeweb.com/assets/7c9c5a50-4bef-4f9c-ba36-b716ad445b8b.png?width=1311&height=688)

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

```yml
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.
    

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

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

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

```yml
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
```

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

```shell
kubectl apply -f write-file-pod.yaml
```

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

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

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

```shell
Hello, Timeweb Cloud!
```

Если вы хотите проверить содержимое диска вне Kubernetes, отключите его от кластера через панель управления, подключите к серверу и [примонтируйте диск](https://timeweb.cloud/docs/unix-guides/adding-removing-disk#montirovanie-diska). Убедитесь, что монтируете весь диск, а не его разделы, так как они не создаются при использовании Kubernetes. После монтирования в корне диска вы найдете файл `hello.txt`.
