Deckhouse Kubernetes Platform (DKP) поддерживает интеграцию с Network File System (NFS), обеспечивая возможность использования сетевых файловых хранилищ в качестве томов Kubernetes. Модуль csi-nfs
предоставляет CSI-драйвер для подключения NFS-серверов и создания PersistentVolume на их основе.
На этой странице представлены инструкции по настройке NFS-хранилища в DKP, включая подключение к NFS-серверу, создание StorageClass, настройку безопасности RPC-with-TLS, а также проверку работоспособности системы.
Системные требования
Минимальные требования
Для работы модуля csi-nfs
необходимо выполнение следующих условий:
- Поддерживаемые дистрибутивы Linux с соответствующими ядрами;
- Настроенный и доступный NFS-сервер;
- Для поддержки RPC-with-TLS: ядро Linux с включенными опциями
CONFIG_TLS
иCONFIG_NET_HANDSHAKE
.
Рекомендации по настройке
Для оптимальной работы модуля рекомендуется:
- Для автоматического перезапуска подов при изменении параметров TLS включите модуль
pod-reloader
(включен по умолчанию). - Используйте стабильные версии NFS-сервера с поддержкой необходимых протоколов.
Для работы NFS как хранилища виртуальных дисков в Deckhouse Virtualization Platform настройте NFS-сервер с опцией no_root_squash
.
Ограничения
Общие ограничения
При работе с модулем csi-nfs
действуют следующие ограничения:
- Создание StorageClass для CSI-драйвера
nfs.csi.k8s.io
вручную запрещено — используйте ресурс NFSStorageClass. - PersistentVolume создаются только через NFSStorageClass ресурсы.
- Изменение параметров NFS-сервера в уже созданных PV невозможно.
Ограничения снимков томов
Для работы со снимками требуется подключенный модуль snapshot-controller
.
Создание снимков NFS-томов имеет существенные ограничения, связанные с архитектурой NFS и способом их реализации в csi-nfs
. По возможности избегайте использования снимков в модуле.
Принцип работы снимков:
- CSI-драйвер создает снимок на уровне NFS-сервера
- Для архивирования используется утилита
tar
, что накладывает определенные ограничения - Архив сохраняется в корневой папке NFS-сервера, указанной в параметре
spec.connection.share
.
- Перед созданием снимка обязательно остановите рабочую нагрузку (поды), использующую NFS-том.
- NFS не обеспечивает атомарность операций на уровне файловой системы при создании снимка.
Ограничения режима RPC-with-TLS
Функциональные ограничения
При использовании RPC-with-TLS действуют следующие ограничения:
- Для политики безопасности
mtls
поддерживается только один сертификат клиента. - Один NFS-сервер не может одновременно работать в разных режимах безопасности:
tls
,mtls
и стандартный режим (без TLS). - На узлах кластера не должен быть запущен демон
tlshd
, иначе он будет конфликтовать с демоном модуля. Для предотвращения конфликтов при включении TLS на узлах автоматически останавливается стороннийtlshd
и отключается его автозапуск.
Требования к системе
Для работы RPC-with-TLS необходимо выполнение следующих системных требований:
- Ядро Linux должно быть собрано с включенными параметрами
CONFIG_TLS
иCONFIG_NET_HANDSHAKE
. - Пакет
nfs-utils
(в дистрибутивах на основе Debian —nfs-common
) версии >= 2.6.3.
Настройка
Все команды должны выполняться на машине с административными правами в Kubernetes API.
Для настройки NFS-хранилища необходимо выполнить следующие шаги:
- Включение модуля;
- Создание NFSStorageClass.
Включение модуля
Для поддержки работы с NFS-хранилищем включите модуль csi-nfs
, который позволяет создавать StorageClass в Kubernetes с помощью пользовательских ресурсов NFSStorageClass. После включения модуля на узлах кластера произойдёт:
- Регистрация CSI-драйвера;
- Запуск сервисных подов
csi-nfs
и создание необходимых компонентов.
d8 k apply -f - <<EOF
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: csi-nfs
spec:
enabled: true
version: 1
EOF
Дождитесь, пока модуль перейдет в состояние Ready
:
d8 k get module csi-nfs -w
Проверьте состояние подов в пространстве имён d8-csi-nfs
. Все поды должны быть в состоянии Running
или Completed
, и запущены на всех узлах:
d8 k -n d8-csi-nfs get pod -owide -w
Создание StorageClass
Для создания StorageClass необходимо использовать ресурс NFSStorageClass. Пример создания ресурса:
d8 k apply -f - <<EOF
apiVersion: storage.deckhouse.io/v1alpha1
kind: NFSStorageClass
metadata:
name: nfs-storage-class
spec:
connection:
host: 10.223.187.3
share: /
nfsVersion: "4.1"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
EOF
Для каждого PV будет создаваться каталог <директория из share>/<имя PV>
.
Настройка очистки томов
При удалении PersistentVolume на томе могут остаться файлы с пользовательскими данными. Для обеспечения безопасности данных можно настроить метод очистки тома перед удалением с помощью параметра volumeCleanup
.
Важные замечания по очистке томов:
- Опция очистки не влияет на файлы, уже удаленные клиентским приложением.
- Очистка выполняется только через протокол NFS и зависит от:
- Сервиса NFS-сервера;
- Файловой системы;
- Уровня блочных устройств и их виртуализации (например, LVM);
- Физических устройств.
- Убедитесь в доверенности NFS-сервера перед отправкой чувствительных данных.
Параметр RandomFillSinglePass
Содержимое файлов переписывается случайной последовательностью перед удалением. Случайная последовательность передается по сети.
Параметр RandomFillThreePass
Содержимое файлов трижды переписывается случайной последовательностью перед удалением. Три случайных последовательности передаются по сети.
Использование данного метода имеет смысл только в том случае, если сервер хранит данные на жестком диске, и есть риск физического доступа злоумышленника к устройству.
Параметр Discard
Оптимизированный метод очистки, использующий возможности файловых систем для работы с твердотельными накопителями. Содержимое файлов помечается как свободное через системный вызов falloc
с флагом FALLOC_FL_PUNCH_HOLE
. Файловая система освободит полностью используемые файлом блоки через вызов blkdiscard
, а остальное место будет перезаписано нулями.
Преимущества метода Discard
:
- Объём трафика не зависит от размера файлов, а только от их количества;
- Может обеспечить недоступность старых данных при некоторых конфигурациях сервера;
- Работает как для жестких дисков, так и для твердотельных накопителей;
- Позволяет увеличить время жизни твердотельного накопителя.
Изменение параметров NFS-сервера для созданных PersistentVolume
Изменение параметров NFS-сервера для созданных PersistentVolume невозможно, так как данные для подключения к NFS-серверу сохраняются непосредственно в манифесте PersistentVolume и не подлежат изменению. Изменение NFSStorageClass также не повлечет изменений настроек подключения в уже существующих PV.
Создание снимков томов
В csi-nfs
снимки создаются путем архивирования папки тома. Архив сохраняется в корне папки NFS-сервера, указанной в параметре spec.connection.share
. При создании снимка томов важно учитывать требования и ограничения, перечисленные выше.
Чтобы создать снимок, выполните следующие действия:
-
Включите модуль
snapshot-controller
:d8 k apply -f - <<EOF apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: snapshot-controller spec: enabled: true version: 1 EOF
-
Создайте снимок тома, указав нужные параметры:
d8 k apply -f - <<EOF apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: my-snapshot namespace: <имя namespace, в котором находится PVC> spec: volumeSnapshotClassName: csi-nfs-snapshot-class source: persistentVolumeClaimName: <имя PVC, для которого необходимо создать снимок> EOF
-
Проверьте состояние созданного снимка:
d8 k get volumesnapshot
Проблемы с удалением PV с поддержкой RPC-with-TLS
Если ресурс NFSStorageClass был настроен с поддержкой RPC-with-TLS, может возникнуть ситуация, когда PersistentVolume не удастся удалить. Это происходит из-за удаления секрета (например, после удаления NFSStorageClass, который хранит параметры монтирования. В результате контроллер не может смонтировать NFS-папку для удаления папки <имя PV>
.
Добавление нескольких CA в параметр tlsParameters.ca
Для добавления нескольких сертификатов CA в параметр tlsParameters.ca
используйте следующие команды:
Для двух CA:
cat CA1.crt CA2.crt | base64 -w0
Для трех CA:
cat CA1.crt CA2.crt CA3.crt | base64 -w0
Для большего количества CA:
cat CA1.crt CA2.crt CA3.crt ... CAN.crt | base64 -w0