Kubernetes v1.15.2中启动MySQL 5.7 Pod时chown权限报错求助
先看你遇到的错误:
chown: changing ownership of '/var/lib/mysql/': Operation not permitted
这个坑我之前也踩过,核心原因是MySQL容器的启动脚本要修改挂载的NFS卷所有权,但权限不够——哪怕你已经给NFS目录开了777、加了no_root_squash,还是会栽在Kubernetes的Pod安全上下文配置上,再加上MySQL镜像本身的运行机制,就出了这个权限错误。
为啥会这样?
官方的mysql:5.7镜像,启动脚本(Entrypoint)会自动执行chown -R mysql:mysql /var/lib/mysql,因为容器里真正跑mysqld进程的是mysql用户(UID=999,GID=999),不是root。但你的Pod没配置对应的安全上下文,导致容器里的进程没法修改NFS挂载目录的所有权——就算目录权限是777,chown操作还是需要特定权限支持,Kubernetes默认的安全策略会卡这个操作。
怎么修复?
第一步:给Deployment加安全上下文配置
你需要在Deployment的spec.template.spec下面加securityContext,指定fsGroup为999(对应容器里的mysql用户组),还可以加上runAsUser让容器直接以mysql用户运行,这样挂载的卷会自动适配正确的组权限,启动脚本的chown操作就能正常执行了。
修改后的Deployment关键部分是这样的:
spec: template: metadata: labels: app: apollo-mysql spec: # 新增安全上下文配置 securityContext: runAsUser: 999 fsGroup: 999 containers: - image: mysql:5.7 name: mysql # 其他原有配置不动...
第二步:(可选)提前给NFS目录设对UID/GID
为了更稳,你可以在NFS服务器上把目标目录的所有者改成UID=999、GID=999(和容器里的mysql用户对应):
sudo chown -R 999:999 /mnt/data/apollodb/apollopv
这一步能跳过容器里的chown操作,直接让目录权限匹配容器用户,启动速度也会快一点。
第三步:重新部署验证
把修改后的YAML应用到集群:
kubectl apply -f 你的mysql-deployment.yaml -n sre
然后看Pod日志,确认错误没了:
kubectl logs -f apollo-mysql-xxxxxx-xxxxx -n sre
验证修复效果
Pod启动成功后,你可以进容器看/var/lib/mysql的权限:
kubectl exec -it apollo-mysql-xxxxxx-xxxxx -n sre -- ls -ld /var/lib/mysql
正常情况下会显示所有者是mysql:mysql(对应UID=999,GID=999)。
内容的提问来源于stack exchange,提问作者Dolphin

