# Инструкция: Анализ хранилища Kubernetes и настройка NFS ## Цель Проанализировать текущую конфигурацию хранилища Kubernetes и подготовить план внедрения NFS StorageClass для сохранения данных при удалении namespace. ## 1. Собрать информацию о кластере ### 1.1. Версия Kubernetes и тип дистрибутива ```bash kubectl version --short # или kubectl version ``` Определить, используется ли k3s, k8s, microk8s и т.д.: ```bash # Проверить наличие k3s which k3s # Проверить процесс ps aux | grep -E 'kube|k3s' ``` ### 1.2. StorageClass ```bash kubectl get storageclass -o wide ``` Запомнить: - `PROVISIONER` — какой драйвер используется - `RECLAIMPOLICY` — Delete или Retain - Какой StorageClass помечен как `(default)` ### 1.3. Существующие PV и PVC ```bash kubectl get pv -o wide kubectl get pvc --all-namespaces ``` Посмотреть, какие PVC привязаны к каким PV, и какой reclaimPolicy у PV. ### 1.4. Нода и диски ```bash # Список нод kubectl get nodes -o wide # На каждой ноде (через ssh или локально): lsblk df -h cat /etc/fstab ``` Определить: - Есть ли отдельный раздел/диск для данных - Куда смонтированы разделы - Сколько свободного места - Есть ли монтирование NTFS-разделов (как `/media/forust/Programs`) ### 1.5. Где local-path хранит данные (для k3s) ```bash ls -la /var/lib/rancher/k3s/storage/ 2>/dev/null # или для microk8s ls -la /var/snap/microk8s/common/ 2>/dev/null ``` ## 2. Анализ: сохраняются ли данные при удалении namespace? | Сценарий | Результат | |---|---| | `kubectl delete ns ` | Все PVC в namespace удаляются | | PVC → PV c `reclaimPolicy: Delete` | PV и данные удалены | | PVC → PV c `reclaimPolicy: Retain` | PV остаётся (статус Released), данные целы | **Вывод:** Если reclaimPolicy в StorageClass = `Delete`, то данные **пропадут**. Если `Retain` — сохранятся. ## 3. План внедрения NFS ### 3.1. Проверить, установлен ли NFS ```bash which nfsstat exportfs mount.nfs systemctl status nfs-server 2>/dev/null || systemctl status nfs-kernel-server 2>/dev/null ``` ### 3.2. Выбрать директорию для NFS-экспорта Варианты (выбрать подходящий): - `/var/lib/k8s-nfs/` — на корневом разделе - `<путь к отдельному разделу>/k8s-nfs/` — если есть отдельный диск/раздел - Не рекомендуется использовать NTFS-раздел (проблемы с правами и производительностью) Требования: - Файловая система: ext4 или xfs (не ntfs!) - Достаточно свободного места - Права: `755`, владелец root ### 3.3. Установить NFS-сервер ```bash # Debian/Ubuntu apt update && apt install -y nfs-kernel-server # RHEL/Fedora dnf install -y nfs-utils ``` ### 3.4. Настроить экспорт Создать директорию: ```bash mkdir -p /var/lib/k8s-nfs chmod 755 /var/lib/k8s-nfs ``` Добавить в `/etc/exports`: ``` /var/lib/k8s-nfs *(rw,sync,no_subtree_check,no_root_squash) ``` Применить: ```bash exportfs -rav ``` Проверить: ```bash showmount -e localhost ``` ### 3.5. Выбрать способ интеграции с Kubernetes #### Вариант A: nfs-subdir-external-provisioner (проще) ```bash helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/ helm install nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \ --namespace kube-system \ --set nfs.server=127.0.0.1 \ --set nfs.path=/var/lib/k8s-nfs \ --set storageClass.name=nfs \ --set storageClass.defaultClass=false \ --set storageClass.reclaimPolicy=Retain ``` #### Вариант B: NFS CSI Driver ```bash helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs --namespace kube-system ``` После установки CSI драйвера создать StorageClass: ```yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs provisioner: nfs.csi.k8s.io parameters: server: 127.0.0.1 share: /var/lib/k8s-nfs reclaimPolicy: Retain volumeBindingMode: Immediate ``` ### 3.6. Проверить результат ```bash kubectl get storageclass kubectl get pods -n kube-system | grep -E 'nfs|provisioner' ``` ## 4. Итоговая конфигурация После внедрения в кластере будет два StorageClass: | Имя | Provisioner | ReclaimPolicy | Назначение | |---|---|---|---| | `local-path` (default) | rancher.io/local-path | Delete | Временные данные, stateless | | `nfs` | nfs-subdir-external-provisioner или nfs.csi.k8s.io | Retain | Данные, которые нужно сохранять | **Главное преимущество:** PVC c `storageClassName: nfs` при удалении namespace сохраняют данные на диске, так как NFS-провизор использует `reclaimPolicy: Retain` или файлы физически остаются в NFS-экспорте. ## 5. Ответы на частые вопросы **В:** Не упадёт ли local-path при установке NFS? **О:** Нет, они независимы. local-path продолжает работать как обычно. **В:** Данные NFS и local-path будут на одном диске? **О:** Да, можно настроить оба на одном разделе, в разных каталогах. **В:** Что если у меня несколько нод? **О:** NFS сервер нужно поднять на одной ноде, а с других нод должна быть доступна шари. Для multi-node лучше использовать отдельный сервер или distributed storage (Longhorn, Rook/Ceph). **В:** Можно ли использовать существующий NTFS-раздел для NFS? **О:** Не рекомендуется — NTFS не поддерживает права Linux (no_root_squash не сработает корректно), возможны проблемы с блокировками и производительностью.