一、NFS 服務端安裝(主節點 10.60.0.20)
1. 安裝 NFS 服務端
sudo apt update
sudo apt install -y nfs-kernel-server
2. 創建共享目錄并配置權限
sudo mkdir -p /data/k8s sudo chown nobody:nogroup /data/k8s
# 允許匿名訪問
sudo chmod 777 /data/k8s
3. 配置 NFS 導出規則
編輯 /etc/exports
文件:
sudo nano /etc/exports
添加以下內容(允許從節點讀寫):
/data/k8s *(rw,sync,no_subtree_check,no_root_squash)
4. 啟動并驗證 NFS 服務
sudo systemctl restart nfs-kernel-server
sudo systemctl enable nfs-kernel-server
# 檢查導出列表
sudo exportfs -v
二、NFS 客戶端安裝(所有節點)
1. 所有節點安裝 NFS 客戶端
sudo apt update sudo apt install -y nfs-common
2. 手動掛載測試(可選)
# 在從節點測試掛載
sudo mkdir -p /mnt/nfs
sudo mount 10.60.0.20:/data/k8s /mnt/nfs
# 驗證掛載
df -h | grep nfs
3. 配置持久化掛載(所有節點)
sudo nano /etc/fstab
添加:
10.60.0.20:/data/k8s /mnt/nfs nfs defaults 0 0
執行掛載:
sudo mount -a
三、Kubernetes 配置 NFS 存儲類
1. 創建 ServiceAccount 和 RBAC 權限
# nfs-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-provisioner
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: nfs-provisioner-binding
subjects:- kind: ServiceAccountname: nfs-provisionernamespace: default
roleRef:kind: ClusterRolename: cluster-adminapiGroup: rbac.authorization.k8s.io
應用配置:
kubectl apply -f nfs-rbac.yaml
2. 部署 NFS Provisioner
# nfs-provisioner.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisioner
spec:replicas: 1selector:matchLabels:app: nfs-provisionertemplate:metadata:labels:app: nfs-provisionerspec:serviceAccountName: nfs-provisionercontainers:- name: nfs-clientimage: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0env:- name: PROVISIONER_NAMEvalue: fuseim.pri/ifs- name: NFS_SERVERvalue: 10.60.0.20 # 主節點 IP- name: NFS_PATHvalue: /data/k8s # 共享目錄路徑volumeMounts:- name: nfs-rootmountPath: /persistentvolumesvolumes:- name: nfs-rootnfs:server: 10.60.0.20path: /data/k8s
應用配置:
kubectl apply -f nfs-provisioner.yaml
3. 創建默認 StorageClass
# nfs-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-storageannotations:storageclass.kubernetes.io/is-default-class: "true"
provisioner: fuseim.pri/ifs
parameters:archiveOnDelete: "false"
應用配置:
kubectl apply -f nfs-storageclass.yaml
四、驗證存儲類
檢查存儲類狀態:
kubectl get sc
# 輸出應顯示 nfs-storage 為 DEFAULT
測試 PVC 創建:
# test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: test-pvc
spec:accessModes:- ReadWriteManystorageClassName: nfs-storageresources:requests:storage: 1Gi
應用并驗證:
kubectl apply -f test-pvc.yaml
kubectl get pvc test-pvc # 狀態應為 Bound
常見問題處理
- 掛載失敗:檢查主節點防火墻是否開放?
2049
(NFS)、111
(RPC)端口?
? - PVC 未綁定:檢查?
nfs-provisioner
?Pod 日志:kubectl logs -l app=nfs-provisioner
- 權限拒絕:確保共享目錄權限為?
777
,且?/etc/exports
?中配置了?no_root_squash
?通過以上步驟,可為 Kubernetes 集群提供基于 NFS 的持久化存儲支持,解決 "沒有存儲類" 的問題。