Сетевые диски удобны для хранения данных, которые нужно сохранять между запусками подов или использовать на разных узлах. Они подходят для баз данных, резервного копирования, масштабирования хранилища по мере необходимости и изоляции данных между приложениями.
CSI-драйвер сетевых дисков предназначен для интеграции сетевых дисков с кластером Kubernetes. Этот драйвер состоит из двух ключевых компонентов:
ext4
и, при необходимости, изменение размеров.Основные особенности драйвера:
ext4
.ReadWriteOnce
. Это означает, что один диск может быть подключен к одному контейнеру в рамках одного пода. Чтобы использовать сетевые диски в кластере, необходимо установить CSI-драйвер. Рассмотрим, как это сделать.
Создайте файл values.yaml
и добавьте следующие параметры:
# Токен с доступом к сетевым дискам + кластерам k8s
TW_API_SECRET: "токен"
# ID из панели
TW_CLUSTER_ID: "1000000"
provisionerName: network-drives.csi.timeweb.cloud
# plugin container image options
image:
# image name
repository: registry-tw-csi.twc1.net/csi-driver/driver
# image tag
tag: latest
# 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».
TW_CLUSTER_ID
— ID Kubernetes-кластера. Это значение можно найти в URL страницы с информацией о вашем кластере в панели управления.
Чтобы изолировать ресурсы CSI-драйвера, создайте отдельный namespace
:
kubectl create namespace csi-driver
Установите CSI-драйвер:
helm install csi-tw-helm oci://registry-tw-csi.twc1.net/csi-driver/csi-driver-timeweb-cloud -f values.yaml --namespace csi-driver
После установки убедитесь, что все поды в namespace
csi-driver
работают:
kubectl get pods -n csi-driver
Проверьте, что драйвер зарегистрирован:
kubectl get csidrivers
Вывод должен быть примерно таким:
NAME ATTACHREQUIRED PODINFOONMOUNT STORAGECAPACITY TOKENREQUESTS REQUIRESREPUBLISH MODES AGE
network-drives.csi.timeweb.cloud false true true <unset> false Persistent 22h
Создание диска с использованием 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 диск будет удален из панели управления. Если вы хотите предотвратить это, необходимо создать сетевой диск в панели управления и подключить его по инструкции ниже.
Если у вас уже есть сетевой диск, который нужно подключить к 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 страницы.
После описания 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
.