第一部分:NFS 服务器部署
1.1 安装 NFS 服务器
# Ubuntu/Debian
sudo apt update && sudo apt install -y nfs-kernel-server
# CentOS/RHEL
sudo yum install -y nfs-utils
1.2 配置共享目录
sudo mkdir -p /data/nfs
sudo chown nobody:nogroup /data/nfs
sudo chmod 755 /data/nfs # 生产环境建议使用更严格的权限
1.3 设置 exports 配置
sudo tee /etc/exports <<EOF
/data/nfs *(rw,sync,no_subtree_check,no_root_squash)
EOF
# 更安全的配置示例(限制访问IP):
# /data/nfs 192.168.1.0/24(rw,sync,no_subtree_check,root_squash)
1.4 启动服务
# Ubuntu/Debian
sudo systemctl enable --now nfs-kernel-server
# CentOS/RHEL
sudo systemctl enable --now nfs-server
# 应用配置
sudo exportfs -rav
1.5 防火墙配置
# Ubuntu UFW
sudo ufw allow 111/tcp
sudo ufw allow 2049/tcp
sudo ufw allow 20048/tcp
sudo ufw allow 111/udp
sudo ufw allow 2049/udp
sudo ufw allow 20048/udp
# CentOS/RHEL
sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --reload
第二部分:Kubernetes 端配置
2.1 所有节点安装 NFS 客户端
# Ubuntu/Debian
sudo apt install -y nfs-common
# CentOS/RHEL
sudo yum install -y nfs-utils
2.2 安装 NFS Subdir External Provisioner
# 添加 Helm 仓库
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm repo update
# 安装 Provisioner
helm install nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=<NFS_SERVER_IP> \
--set nfs.path=/data/nfs \
--set storageClass.name=nfs-sc \
--set storageClass.defaultClass=true \
--set storageClass.reclaimPolicy=Retain \
--set storageClass.archiveOnDelete=false \
--namespace kube-system \
--create-namespace
2.3 验证安装
# 检查 StorageClass
kubectl get storageclass
# 检查 Provisioner Pod
kubectl get pods -n kube-system -l app.kubernetes.io/name=nfs-subdir-external-provisioner
# 检查日志(如有问题)
kubectl logs -n kube-system -l app.kubernetes.io/name=nfs-subdir-external-provisioner
第三部分:测试验证
3.1 创建测试 PVC
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-nfs-pvc
spec:
storageClassName: nfs-sc
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
EOF
3.2 创建测试 Pod
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: test-nfs-pod
spec:
containers:
- name: test-container
image: busybox
command: ["/bin/sh", "-c", "while true; do date >> /mnt/data/date.log; sleep 5; done"]
volumeMounts:
- name: nfs-volume
mountPath: /mnt/data
volumes:
- name: nfs-volume
persistentVolumeClaim:
claimName: test-nfs-pvc
EOF
3.3 验证数据持久化
# 检查文件写入
kubectl exec -it test-nfs-pod -- cat /mnt/data/date.log
# 删除 Pod 后重新创建,验证数据持久性
kubectl delete pod test-nfs-pod
kubectl apply -f test-pod.yaml
kubectl exec -it test-nfs-pod -- cat /mnt/data/date.log
第四部分:生产环境建议
4.1 推荐的 StorageClass 参数
helm upgrade nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--reuse-values \
--set storageClass.mountOptions="{nfsvers=4.1,hard,timeo=600,retrans=2}"
4.2 资源限制设置
--set resources.requests.cpu="100m" \
--set resources.requests.memory="128Mi" \
--set resources.limits.cpu="500m" \
--set resources.limits.memory="512Mi"
4.3 高可用建议
-
使用独立的 NFS 服务器集群
-
考虑使用 DRBD 或 GlusterFS 作为后端存储
-
为重要数据配置定期备份
第五部分:故障排查
5.1 常见问题解决
问题1:PVC 处于 Pending 状态
kubectl describe pvc test-nfs-pvc
检查事件日志中的错误信息
问题2:挂载失败
kubectl describe pod test-nfs-pod
检查 MountVolume 相关错误
问题3:NFS 连接问题
# 从 Kubernetes 节点测试连接
showmount -e <NFS_SERVER_IP>
5.2 日志收集
# Provisioner 日志
kubectl logs -n kube-system -l app.kubernetes.io/name=nfs-subdir-external-provisioner
# Kubelet 日志
journalctl -u kubelet -f
第六部分:卸载清理
# 删除测试资源
kubectl delete pod test-nfs-pod
kubectl delete pvc test-nfs-pvc
# 卸载 Provisioner
helm uninstall nfs-provisioner -n kube-system
# 清理 NFS 服务器数据(如需)
# ssh 到 NFS 服务器执行:
sudo rm -rf /data/nfs/*
本指南已在以下环境验证通过:
-
Kubernetes 1.24+
-
Helm 3.10+
-
Ubuntu 20.04/CentOS 8
-
NFSv4.1/v4.2
第七部分:在线测试环境
Killercoda Interactive Environments
每次使用1个小时,可供大家直接验证安装,提供了2核2G和1核4G服务器,可以免费使用。
还可以端口映射访问,点击access,可访安装的服务端口