<div><img src="https://top-fwz1.mail.ru/counter?id=3548135;js=na" style="position:absolute;left:-9999px;" alt="Top.Mail.Ru" /></div>
Бесплатный перенос IT-инфраструктуры в облако
На главную
25eb9e0a-a5a8-472a-ace7-940b8bd2adf0
Облачные сервисы

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

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

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

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

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

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

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

Установка драйвера 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 страницы с информацией о вашем кластере в панели управления.

Selection 141

Чтобы изолировать ресурсы 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

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

Создание диска с использованием 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 страницы. 

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.

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