Подключение NFS-хранилища к Kubernetes через dynamic provisioner
В этой заметке показан простой способ подключить NFS-хранилище к кластеру Kubernetes и включить динамическое создание PersistentVolume с помощью провиженера nfs-subdir-external-provisioner. Более подробная информация о том, что такое PVC, PV и архитектуре хранения данных в кластере kubernetes, вы можете прочитать в этой статье.
Такой подход позволяет приложениям автоматически получать хранилище через PVC, без ручного создания PV. Для дальнейшей настройки у вас уже должен быть развернут кластер k8s и добавлен еще один хост с диском большого объема для организации на нем NFS.
Архитектура
Application Pod
│
PersistentVolumeClaim
│
StorageClass
│
nfs-subdir-external-provisioner
│
NFS Server
Когда приложение создаёт PVC, provisioner автоматически создаёт каталог на NFS и привязывает его к Pod.
1. Подготовка NFS сервера
Установить NFS сервер:
sudo apt update
sudo apt install -y nfs-kernel-server
Создать директорию для Kubernetes:
sudo mkdir -p /srv/nfs/k8s
sudo chmod 777 /srv/nfs/k8s
Добавить экспорт в /etc/exports:
/srv/nfs/k8s *(rw,sync,no_subtree_check,no_root_squash)
Применить конфигурацию:
sudo exportfs -rav
sudo systemctl restart nfs-kernel-server
Проверить:
showmount -e <NFS_IP>

2. Установка NFS клиента на ноды Kubernetes
Каждая worker-нода должна иметь NFS клиент, иначе kubelet не сможет смонтировать volume.
Ubuntu / Debian:
sudo apt install -y nfs-common
RHEL / CentOS:
sudo yum install -y nfs-utils
3. Установка provisioner через Helm
Для установки используется пакетный менеджер Helm.
Добавить репозиторий:
helm repo add nfs-subdir-external-provisioner \
https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner
helm repo update
Установить provisioner:
helm install nfs-provisioner \
nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=<NFS_IP> \
--set nfs.path=/srv/nfs/k8s \
--set storageClass.name=nfs-storage
Проверить pod:
kubectl get pods

4. Проверка StorageClass
После установки появится StorageClass:
kubectl get storageclass
Пример:

При необходимости сделать его default:
kubectl patch storageclass nfs-storage \
-p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
5. Проверка через PVC
Создать файл pvc.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvcspec:
accessModes:
- ReadWriteManystorageClassName: nfs-storage
resources:
requests:
storage: 1Gi
Применить:
kubectl apply -f pvc.yaml
Проверить статус:
kubectl get pvc
Результат:

На NFS сервере появится директория:
/srv/nfs/k8s/pvc-xxxxxxx

Итог
После установки:
- приложения создают PVC
- Kubernetes автоматически выделяет PersistentVolume
- provisioner создаёт каталог на NFS
- Pod монтирует storage как обычный volume
Это позволяет централизованно использовать сетевое хранилище и упростить управление данными в кластере Kubernetes.