一、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 权限
bash
# 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: ServiceAccount
name: nfs-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
应用配置:
bash
kubectl apply -f nfs-rbac.yaml
2. 部署 NFS Provisioner
bash
# nfs-provisioner.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
selector:
matchLabels:
app: nfs-provisioner
template:
metadata:
labels:
app: nfs-provisioner
spec:
serviceAccountName: nfs-provisioner
containers:
- name: nfs-client
image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: 10.60.0.20 # 主节点 IP
- name: NFS_PATH
value: /data/k8s # 共享目录路径
volumeMounts:
- name: nfs-root
mountPath: /persistentvolumes
volumes:
- name: nfs-root
nfs:
server: 10.60.0.20
path: /data/k8s
应用配置:
bash
kubectl apply -f nfs-provisioner.yaml
3. 创建默认 StorageClass
bash
# nfs-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: fuseim.pri/ifs
parameters:
archiveOnDelete: "false"
应用配置:
bash
kubectl apply -f nfs-storageclass.yaml
四、验证存储类
检查存储类状态:
bash
kubectl get sc
# 输出应显示 nfs-storage 为 DEFAULT
测试 PVC 创建:
bash
# test-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-storage
resources:
requests:
storage: 1Gi
应用并验证:
bash
kubectl apply -f test-pvc.yaml
kubectl get pvc test-pvc # 状态应为 Bound
常见问题处理
-
挂载失败 :检查主节点防火墙是否开放
2049
(NFS)、111
(RPC)端口 -
PVC 未绑定 :检查
nfs-provisioner
Pod 日志:bashkubectl logs -l app=nfs-provisioner
-
权限拒绝 :确保共享目录权限为
777
,且/etc/exports
中配置了no_root_squash
通过以上步骤,可为 Kubernetes 集群提供基于 NFS 的持久化存储支持,解决 "没有存储类" 的问题。