必须用 NAS 动态存储卷(StorageClass + PVC),不能用静态 PV;MySQL 8.0 需要至少 4 个独立 PVC 分别挂载 /var/lib/mysql、/var/log/mysql、/etc/mysql/conf.d、/docker-entrypoint-initdb.d,否则启动失败或数据错乱。

直接结论:必须用 NAS 动态存储卷(StorageClass + PVC),不能用静态 PV;MySQL 8.0 需要至少 4 个独立 PVC 分别挂载 /var/lib/mysql、/var/log/mysql、/etc/mysql/conf.d、/docker-entrypoint-initdb.d,否则启动失败或数据错乱。
为什么不能用静态 PV 挂载 NAS?
阿里云 NAS 不支持 Flexvolume 驱动的静态挂载方式。你如果照搬云盘静态 PV 的写法(比如 flexVolume: { driver: "alicloud/nas" }),kubectl 会报 FailedMount,事件里显示 mount failed: exit status 32 或 Operation not supported。这是因为 NAS 必须通过 CSI 插件 + StorageClass 才能正确处理多 Pod 并发读写、子目录隔离和自动挂载参数(如 nfsvers=4.0、noac)。
创建 StorageClass 要注意三个关键字段
动态挂载依赖 StorageClass 定义挂载行为,以下参数缺一不可:
-
parameters.mountOptions必须包含nfsvers=4.0和noac(禁用客户端缓存,避免 MySQL 文件锁异常) -
parameters.path必须以/开头,且对应 NAS 控制台中「挂载点」的「文件系统路径」,例如/mysql-data(不是nas-xxx.cn-hangzhou.nas.aliyuncs.com:/mysql-data) -
parameters.server必须是 NAS 挂载点地址,格式为nas-xxx.cn-hangzhou.nas.aliyuncs.com,不能带协议或路径
示例片段:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nas-mysql-sc provisioner: diskplugin.csi.alibabacloud.com parameters: server: "nas-abc123.cn-hangzhou.nas.aliyuncs.com" path: "/mysql-data" mountOptions: "nfsvers=4.0,noac"
PVC 必须按 MySQL 目录结构拆分申请
MySQL 8.0 容器镜像(官方或阿里云 registry)默认将数据、日志、配置、初始化脚本分散在不同路径,且部分路径有硬编码权限或初始化逻辑。若只用一个 PVC 挂载根目录,会导致:
-
/var/lib/mysql权限被覆盖,容器启动卡在mysqld: Can't create/write to file -
/etc/mysql/conf.d下的自定义配置不生效(因为挂载后原目录被遮蔽) -
/docker-entrypoint-initdb.d初始化 SQL 不执行(目录为空或只读)
所以你要创建 4 个 PVC,分别绑定到对应路径,例如:
volumeMounts: - name: mysql-data mountPath: /var/lib/mysql - name: mysql-log mountPath: /var/log/mysql - name: mysql-conf mountPath: /etc/mysql/conf.d - name: mysql-init mountPath: /docker-entrypoint-initdb.d
挂载后必须验证子路径隔离与写入权限
即使 PVC 绑定成功,MySQL 仍可能因 NAS 子目录权限问题启动失败。常见现象是 Pod 处于 CrashLoopBackOff,日志里出现 chown: changing ownership of '/var/lib/mysql/': Permission denied。这是因为 NAS 默认挂载为 root:root,而 MySQL 容器以非 root 用户(如 mysql UID 999)运行。
解决方法只有两个:
- 在 Deployment 中显式设置
securityContext.runAsUser: 999和fsGroup: 999,确保挂载后目录属组可写 - 或者,在 NAS 控制台提前为对应子目录(如
/mysql-data)执行chmod 775和chown -R 999:999(需先挂载到一台 ECS 上操作)
这一步容易被跳过,但恰恰是 MySQL 在 ACK 上跑通最关键的实操细节。


















