为什么MySQL在Kubernetes集群中部署后无法正常分配持久化卷?

夏伟同学_3185

夏伟同学_3185

2026-07-08

483人浏览

原创

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

为什么mysql在kubernetes集群中部署后无法正常分配持久化卷?

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 创建后无法被正确标记或清理,最终挂载时找不到后端卷。

Kubernetes Network Policy Generator
Kubernetes Network Policy Generator

使用加权评分卡在12项标准上评估和比较隐私解决方案供应商。适用于选择隐私管理软件、比较数据保护方案等场景。

下载

例如你部署的是 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。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql kubernetes

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2253

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1379

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

815

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3092

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5248

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1159

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5511

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4822

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6394

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 188人学习