Kubernetes v1.35 实战:在 CentOS 10 集群中部署 NFS 持久化存储
·
title: Kubernetes v1.35 实战:在 CentOS 10 集群中部署 NFS 持久化存储
date: 2026-03-05
categories:
- K8s
tags:
- 实验
cover:
环境说明
- 操作系统:CentOS 10 (Stream/Linux)
- K8s 版本:v1.35 (最新特性支持)
- 节点信息:
- Master (NFS Server) | k8s-master-1 | 192.168.10.152
- Worker Node | k8s-node-1 | 192.168.10.153
- Worker Node | k8s-node-2 | 192.168.10.154
- 镜像来源:由于网络限制,统一从“渡渡鸟”镜像站拉取。
部署流程
基础设施层:安装nfs服务端
在 Master 节点上执行,用于提供物理存储空间
# 安装并启动
sudo yum install -y nfs-utils
#创建&授权共享目录
mkdir -p /data/k8s_nfs && chmod 777 /data/k8s_nfs
#编辑配置文件,允许node节点网段访问
echo "/data/k8s_nfs 192.168.10.0/24(rw,sync,no_root_squash)" >> /etc/exports
#启动服务&设置自启动
systemctl enable --now rpcbind nfs-server
#检查导出状态
exportfs -v
集群准备:安装nfs客户端
所有 Node 节点必须安装 nfs-utils,否则 Kubelet 无法挂载卷
# 在所有 Node 节点执行
sudo yum install -y nfs-utils
#验证是否能发现master挂载点
showmount -e 192.168.10.152
K8s资源层:PV与PVC的申领
- PV (PersistentVolume):由运维人员定义,描述真实的存储后端。
- PVC (PersistentVolumeClaim):由开发/应用定义,描述对存储的需求。
graph TD
A[用户/开发者层: Pod] -- 引用 --> B[需求层: PVC]
B -- 查找匹配 --> C[资源层: PV]
C -- 物理映射 --> D[物理层: NFS Server]
# 创建&编辑nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-static-pv
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany # 支持多个 Pod 同时读写
persistentVolumeReclaimPolicy: Retain # 删除 PVC 时保留数据
storageClassName: nfs-manual # 存储类标识
nfs:
path: /data/k8s_nfs # Master 上的物理路径
server: 192.168.10.152 # Master IP
# 船舰&编辑nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc-usage
namespace: default
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-manual # 必须与 PV 一致
resources:
requests:
storage: 5Gi
部署PV/PVC,验证
kubectl apply -f nfs-pv.yaml
kubectl apply -f nfs-pvc.yaml
#验证启动状态,应为Available
kubectl get pv
kubectl get pvc
应用层:pod挂载
在 containers.volumeMounts 中定义容器内挂载点 mountPath
# 创建&编辑nfs-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nfs-web-test
namespace: default
spec:
containers:
- name: web-container
# 按照实际环境从渡渡鸟镜像站拉取
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: html-storage
mountPath: /usr/share/nginx/html # 容器内部挂载地址
volumes:
- name: html-storage
persistentVolumeClaim:
claimName: nfs-pvc-usage # 引用上面创建的 PVC 名称
部署
kubectl apply -f nfs-pod.yaml
#查看pod状态&所在节点
kubectl get pods -o wide
验证
# 1. 在容器内创建文件
kubectl exec -it nfs-web-test -- sh -c "echo 'Hello NFS' > /usr/share/nginx/html/index.html"
# 2. 在 Master 节点物理路径查看
cat /data/k8s_nfs/index.html
# 3. 删除 Pod 后数据依然存在
kubectl delete pod nfs-web-test
ls /data/k8s_nfs/index.html
错误排查
在部署过程中,如果 Pod 处于 Pending 或 ContainerCreating,请按此清单排查:
- PVC 找不到 (Not Found):
- 现象:Describe Pod 提示
pvc "..." not found。 - 排查:确认 PVC 和 Pod 是否在同一个
namespace。 - 修复:
kubectl get pvc -A检查名称和空间。
- 现象:Describe Pod 提示
- 无法绑定 (Pending):
- 现象:PVC 始终 Pending。
- 原因:PV 和 PVC 的
accessModes或storageClassName不匹配。 - 修复:修改 YAML 使其完全一致。
- 挂载超时 (Mount Failed):
- 原因:通常是 Worker Node 没装
nfs-utils或防火墙拦截。 - 修复:在 Node 节点执行
mount -t nfs 192.168.10.152:/data/k8s_nfs /mnt手动测试网络连通性。
- 原因:通常是 Worker Node 没装
更多推荐





所有评论(0)