Kubernetes中MySQL Pod启动失败(CrashLoopBackOff)求助
MySQL K8s持久化部署启动失败排查解决
问题现象
在单Master+单Worker的K8s集群中部署带PV/PVC的MySQL时,每次重启Pod都会触发以下错误:
/usr/sbin/mysqld (mysqld 8.0.33) initializing of server in progress as process 10 2023-06-29T16:30:30.612865Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting. 2023-06-29T16:30:30.612875Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it. 2023-06-29T16:30:30.614055Z 0 [ERROR] [MY-010119] [Server] Aborting
即使手动删除容器内/var/lib/mysql目录及文件,重启后仍会检测到目录存在并报错。已尝试设置--ignore-db-dir=lost+found和调整fsGroup:1000,均无效。
当前YAML配置
apiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: securityContext: fsGroup: 10000 tolerations: - key: "app" operator: "Equal" value: "mysql" effect: "NoSchedule" containers: - name: mysql image: mysql:latest env: - name: MYSQL_ROOT_PASSWORD value: mypassword ports: - containerPort: 3306 volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql args: - --datadir=/var/lib/mysql - "--ignore-db-dir=lost+found" - --initialize volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pv - name: mysql-data emptyDir: {}
解决方案
1. 移除--initialize启动参数
MySQL官方镜像会自动检测数据目录状态:
- 如果目录为空,自动执行初始化流程(创建系统库、设置密码等)
- 如果手动指定
--initialize,镜像会强制要求数据目录完全为空,哪怕存在lost+found或其他残留文件都会报错。你的PV已有历史数据残留,因此无需手动指定该参数。
2. 彻底清理PV中的残留数据
PV是持久化存储,删除容器内的文件不会影响PV后端存储的数据,必须直接清理存储后端:
- 执行
kubectl describe pv mysql-pv查看PV的存储类型和路径(比如Node本地路径、NFS地址) - 如果是Node本地存储:登录对应的Worker节点,找到存储路径,删除所有文件(包括
ibdata1、ib_logfile*等MySQL生成的文件,lost+found可以保留) - 如果是云存储/NFS:直接在存储后端清理对应目录下的所有MySQL相关文件
3. 修正YAML配置中的冗余与权限问题
- 移除未被使用的
mysql-dataemptyDir卷,减少无效配置 - 将
fsGroup改为999:MySQL容器内的mysql用户UID为999,设置fsGroup为999可确保容器对挂载目录拥有正确的读写权限
修正后的YAML示例
apiVersion: apps/v1 kind: Deployment metadata: name: mysql spec: replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: securityContext: fsGroup: 999 tolerations: - key: "app" operator: "Equal" value: "mysql" effect: "NoSchedule" containers: - name: mysql image: mysql:latest env: - name: MYSQL_ROOT_PASSWORD value: mypassword ports: - containerPort: 3306 volumeMounts: - name: mysql-persistent-storage mountPath: /var/lib/mysql args: - --datadir=/var/lib/mysql - "--ignore-db-dir=lost+found" volumes: - name: mysql-persistent-storage persistentVolumeClaim: claimName: mysql-pv
内容的提问来源于stack exchange,提问作者herlit
相关产品推荐
相关产品推荐

