当在Kubernetes中部署MySQL 5.7遇到"CrashLoopBackOff"错误时,表示容器反复启动失败。以下是系统化的排查和解决方法:
首先获取详细的错误日志:
kubectl logs <pod-name> -n <namespace> --previous
症状:日志中出现"Can't create/write to file"或权限拒绝错误
解决方案: - 确保挂载的持久卷有正确权限 - 在Deployment中添加initContainer修复权限:
initContainers:
- name: fix-permissions
image: busybox
command: ["chown", "-R", "999:999", "/var/lib/mysql"]
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
症状:无法写入数据目录或磁盘空间不足
解决方案: - 检查PVC/PV是否正常绑定 - 确保有足够的存储空间 - 如果是首次部署,可尝试删除PVC重新创建
症状:MySQL配置参数错误或环境变量设置不当
解决方案: - 检查MySQL的ConfigMap或环境变量配置 - 确保必需的变量已设置(如MYSQL_ROOT_PASSWORD) - 示例正确配置:
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secrets
key: root-password
症状:端口已被占用或服务类型冲突
解决方案: - 检查Service定义是否与Pod端口匹配 - 确保没有其他服务使用相同端口
症状:OOMKilled或CPU限制过紧
解决方案: - 增加资源限制:
resources:
requests:
memory: "1Gi"
cpu: "500m"
limits:
memory: "2Gi"
cpu: "1"
kubectl exec -it <pod-name> -n <namespace> -- /bin/bash
cat /var/log/mysql/error.log
kubectl run -it --rm --image=busybox test-pod --restart=Never -- /bin/sh
kubectl describe pod <pod-name> -n <namespace>
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
selector:
matchLabels:
app: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql
spec:
containers:
- image: mysql:5.7
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secrets
key: root-password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
initContainers:
- name: fix-permissions
image: busybox
command: ["chown", "-R", "999:999", "/var/lib/mysql"]
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
通过以上步骤系统排查,大多数MySQL CrashLoopBackOff问题都能得到解决。如果问题依旧,建议检查Kubernetes集群和Docker环境的基础健康状况。