NFS-сервер для k8s

Если вы развернули 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
Прокрутить вверх