当在 Kubernetes 中部署 MySQL 5.7 时遇到 CrashLoopBackOff
错误,并且日志显示 mysqld failed while attempting to check config
,这表明 MySQL 服务器在启动时无法通过配置检查阶段。
可能原因:MySQL 配置文件(my.cnf)存在语法错误或无效配置。
排查步骤:
# 查看 Pod 日志
kubectl logs <pod-name> -p # 查看前一个容器的日志(因为当前容器启动失败)
# 如果使用 ConfigMap 提供配置,检查 ConfigMap
kubectl describe configmap <mysql-configmap-name>
解决方案: - 确保 my.cnf 文件语法正确 - 检查是否有重复的配置项 - 验证配置参数是否与 MySQL 5.7 兼容
可能原因:MySQL 数据目录权限不正确。
排查步骤:
# 检查持久化卷的权限
kubectl describe pvc <mysql-pvc-name>
# 如果使用 hostPath,检查节点上的目录权限
解决方案: - 确保数据目录对 MySQL 用户(通常是 999:999)可写 - 在 Pod 规范中添加 initContainer 修复权限:
initContainers:
- name: fix-permissions
image: busybox
command: ["sh", "-c", "chown -R 999:999 /var/lib/mysql"]
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
可能原因:持久化卷(PV)未正确挂载或为空。
排查步骤:
# 检查 PVC 状态
kubectl get pvc
kubectl describe pvc <mysql-pvc-name>
# 检查 PV 状态
kubectl get pv
解决方案: - 确保 PVC 已正确绑定到 PV - 如果是新部署,可以删除 PVC 让 Kubernetes 重新创建 - 检查存储类(StorageClass)配置是否正确
可能原因:环境变量与配置文件冲突。
排查步骤:
# 检查 Pod 的环境变量
kubectl describe pod <pod-name> | grep -A 10 "Environment"
解决方案: - 确保没有冲突的环境变量(如同时使用 MYSQL_ROOT_PASSWORD 和配置文件中的 root 密码) - 统一配置来源,建议使用 Kubernetes Secret 管理密码
检查 Pod 状态:
kubectl get pods -o wide
kubectl describe pod <mysql-pod-name>
查看详细日志:
kubectl logs <mysql-pod-name> --previous
验证配置文件:
kubectl get configmap <mysql-configmap-name> -o yaml
检查持久化存储:
kubectl get pvc
kubectl describe pvc <mysql-pvc-name>
尝试临时调试:
kubectl run -it --rm --image=mysql:5.7 --restart=Never mysql-debug -- bash
在调试容器中手动运行 mysqld 查看具体错误
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
initContainers:
- name: fix-permissions
image: busybox
command: ["sh", "-c", "chown -R 999:999 /var/lib/mysql"]
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: root-password
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
- name: mysql-config
mountPath: /etc/mysql/conf.d
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-pvc
- name: mysql-config
configMap:
name: mysql-configmap
通过以上步骤,您应该能够定位并解决 MySQL 5.7 在 Kubernetes 中的启动配置问题。