Если вы развернули Kubernetes-кластер и хотите хранить данные подов вне контейнеров, один из самых простых способов — настроить NFS-сервер. С его помощью можно организовать общий доступ к данным между всеми нодами кластера. В этой инструкции я покажу, как быстро установить NFS на Ubuntu 24.04, правильно настроить права и безопасность, а затем подключить его к Kubernetes через PersistentVolume и PersistentVolumeClaim.
Установка NFS-сервера (на сервере NFS)
sudo apt update
sudo apt install -y nfs-kernel-server
Создание директории для общего доступа
sudo mkdir -p /srv/nfs/kubedata
sudo chown nobody:nogroup /srv/nfs/kubedata
sudo chmod 777 /srv/nfs/kubedata
Настройка экспорта (доступа)
Открой /etc/exports и добавь строки только для worker-нoд:
/srv/nfs/kubedata 192.168.0.104(rw,sync,no_subtree_check,no_root_squash)
/srv/nfs/kubedata 192.168.0.105(rw,sync,no_subtree_check,no_root_squash)
/srv/nfs/kubedata 192.168.0.106(rw,sync,no_subtree_check,no_root_squash)
Описание:
Даём доступ только воркерам (безопаснее).
rw — чтение и запись.
sync — запись синхронно (надёжнее).
no_subtree_check — отключаем проверку подкаталогов (ускоряет работу).
no_root_squash — разрешаем root-доступ (нужно для Kubernetes, иначе могут быть ошибки монтирования).
Применение настроек
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
sudo exportfs -v # Проверка конфигурации
Проверка на клиенте (воркер-нoда)
sudo apt install -y nfs-common #Устанавливаем клиент
sudo mount -t nfs4 192.168.0.110:/srv/nfs/kubedata /mnt #Монтируем
df -h | grep nfs #Проверяем
Тестируем подключение:
sudo mount -t nfs4 192.168.0.110:/srv/nfs/kubedata /mnt #Монтируем
df -h | grep nfs #Проверяем
sudo umount /mnt #Отмонтируем
Использование в Kubernetes
Создаём PersistentVolume (PV):
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: /srv/nfs/kubedata
server: 192.168.0.110
PersistentVolumeClaim (PVC):
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
Пример Pod:
apiVersion: v1
kind: Pod
metadata:
name: nfs-test-pod
spec:
containers:
- name: test-container
image: busybox
command: [ "sleep", "3600" ]
volumeMounts:
- name: nfs-volume
mountPath: /mnt/nfs
volumes:
- name: nfs-volume
persistentVolumeClaim:
claimName: nfs-pvc