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 处于 PendingContainerCreating,请按此清单排查:

  • PVC 找不到 (Not Found)
    • 现象:Describe Pod 提示 pvc "..." not found
    • 排查:确认 PVC 和 Pod 是否在同一个 namespace
    • 修复kubectl get pvc -A 检查名称和空间。
  • 无法绑定 (Pending)
    • 现象:PVC 始终 Pending。
    • 原因:PV 和 PVC 的 accessModesstorageClassName 不匹配。
    • 修复:修改 YAML 使其完全一致。
  • 挂载超时 (Mount Failed)
    • 原因:通常是 Worker Node 没装 nfs-utils 或防火墙拦截。
    • 修复:在 Node 节点执行 mount -t nfs 192.168.10.152:/data/k8s_nfs /mnt 手动测试网络连通性。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐