根本原因是kube-apiserver在v1.20.2+默认禁用selfLink(--feature-gates=RemoveSelfLink=true),导致依赖该字段的旧版provisioner(如fuseim.pri/ifs)无法构造PV引用,PVC卡在Pending。

PVC 一直 Pending,根本原因是 apiserver 禁用了 selfLink
在 v1.20.2 及更高版本的 kube-apiserver 中,--feature-gates=RemoveSelfLink=true 是默认启用的。而很多旧版 StorageClass 或 NFS provisioner 的实现(尤其是基于 selfLink 构造 PV 名称或绑定逻辑的)会因此失败,导致 PVC 卡在 Pending 状态,后续 Pod 也就无法调度。
这不是 StorageClass 配置错误,也不是 NFS 服务没启,而是 apiserver 主动拒绝返回 selfLink 字段,触发了下游 provisioner 的空指针或路径构造异常。
- 临时修复:编辑
/etc/kubernetes/manifests/kube-apiserver.yaml,在spec.containers[0].command下添加一行:- --feature-gates=RemoveSelfLink=false - 重启 kubelet:
systemctl restart kubelet(master 节点上) - 验证是否生效:
kubectl get pod mysql-0 -o json | grep selfLink—— 如果输出非空,说明已恢复
StatefulSet 使用 NFS 时,PVC 绑定成功但 Pod 挂载失败
常见现象是 Pod 处于 ContainerCreating,kubectl describe pod 显示类似错误:mount.nfs: mounting 192.168.89.66:/home/data/mysql-data-mysql-0-pvc-... failed, reason given by server: No such file or directory。
这不代表 NFS 服务没起来,而是 NFS Server 端缺少对应子目录 —— Kubernetes 的 dynamic provisioner(如 nfs-subdir-external-provisioner)只创建 PV 和更新 etcd,**不会自动在 NFS 服务器上 mkdir 实际路径**。
- 手动创建缺失路径:
mkdir -p /home/data/mysql-data-mysql-0-pvc-73d8ba2c-5c4e-44bf-9550-39e00451c020 - 确保 NFS 导出配置包含该路径,且权限开放:
/home/data *(rw,sync,no_root_squash) - 重载 NFS 配置:
exportfs -ra,再重启nfs-server和rpcbind
StorageClass 配置与实际 provisioner 不匹配
即使 PVC 看似 Bound,也可能因 StorageClass 的 provisioner 字段和集群中运行的 external-provisioner Deployment 名称不一致,导致 PV 创建后无法被正确标记或清理,最终挂载时找不到后端卷。
例如你部署的是 nfs-subdir-external-provisioner,但 StorageClass 写成了 cluster.local/nfs-provisioner,而实际 provisioner 的 ServiceAccount 名为 nfs-client-provisioner,其监听的 provisioner 名是 k8s-sigs.io/nfs-subdir-external-provisioner。
- 查当前 provisioner 实际监听名:
kubectl get deployment -n default nfs-client-provisioner -o yaml | grep -A1 "args:",关注-provisioner=参数值 - 确认 StorageClass 的
provisioner:字段必须完全一致(包括大小写和斜杠) - 不要复用别人 YAML 里的 StorageClass 名称,优先用
kubectl get sc看真实存在的名字
MySQL 容器内数据目录权限不对,挂载后启动失败
PVC 挂载成功、Pod 进入 Running,但容器立刻 Crash,日志里出现 mysqld: Can't change dir to '/var/lib/mysql/' (Errcode: 13 - Permission denied) 或类似错误。
这是因为 MySQL 官方镜像(如 mysql:5.7)默认以用户 mysql(UID 999)运行,而 NFS 或 hostPath 卷的目录在服务端是 root 创建的,属主属组为 root:root,容器内无法写入。
- 在 NFS Server 上,对挂载根目录执行:
chown -R 999:999 /home/data - 或改用 initContainer 在 Pod 启动前修正权限:
chmod 777 /var/lib/mysql或chown -R 999:999 /var/lib/mysql - 更稳妥的做法是在 ConfigMap 中提供
my.cnf,把datadir改为/data/mysql/data,并在 initContainer 中统一初始化该路径并设权
真正卡住的人,往往不是没配 StorageClass,而是没意识到 selfLink 被关、NFS 路径要手建、provisioner 名字要一字不差、UID 权限要提前对齐 —— 四个环节任意一个断掉,PVC 就停在 Pending 或 Pod 就卡在 ContainerCreating。


















