在Minikube中创建MySQL Deployment时遭遇CrashLoopBackOff错误求助
MySQL Pod在Minikube中出现CrashLoopBackOff错误的解决建议
我是Kubernetes新手,尝试在Minikube上通过Deployment.yaml文件创建MySQL Pod,但持续遇到CrashLoopBackOff错误。我计划将该Pod作为已运行的Flask应用的数据库,恳请各位提供解决建议。
相关配置文件
secret.yaml
apiVersion: v1 kind: Secret metadata: name: mysql-secret type: Opaque data: mysql-root-password: bXlzcWw=
persistent-volume.yaml
apiVersion: v1 kind: PersistentVolume metadata: name: mysql-pv labels: type: local spec: capacity: storage: 2Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: manual hostPath: path: "/mnt/data"
persistent-volume-claim.yaml
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-pvc spec: storageClassName: manual resources: requests: storage: 2Gi accessModes: - ReadWriteOnce
deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: mysql-deployment labels: app: mysql-db spec: replicas: 1 selector: matchLabels: app: mysql-db strategy: type: Recreate template: metadata: labels: app: mysql-db spec: containers: - name: mysql image: mysql:latest imagePullPolicy: IfNotPresent resources: limits: memory: "512Mi" cpu: "1500m" ports: - containerPort: 3306 name: mysql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: mysql-root-password volumeMounts: - name: mysql-persistant-storage mountPath: /var/lib/mysql volumes: - name: mysql-persistant-storage persistentVolumeClaim: claimName: mysql-pvc
service.yaml
apiVersion: v1 kind: Service metadata: name: mysql-service labels: app: mysql-db spec: selector: app: mysql-db ports: - port: 3306 protocol: TCP targetPort: 3306 type: LoadBalancer
kubectl describe pod <pod-name> 输出
Name: mysql-deployment-744d6df885-lm2nw Namespace: default Priority: 0 Service Account: default Node: minikube/192.168.49.2 Start Time: Wed, 26 Oct 2022 22:36:27 +0600 Labels: app=mysql-db pod-template-hash=744d6df885 Annotations: <none> Status: Running IP: 172.17.0.4 IPs: IP: 172.17.0.4 Controlled By: ReplicaSet/mysql-deployment-744d6df885 Containers: mysql: Container ID: docker://d7ccb5efac0051851a54eb8bc8147be2271f213136fe2a20460243d0e4674035 Image: mysql:latest Image ID: docker-pullable://mysql@sha256:06314a7a220f6043436cfd72fd9c7f174fd58ef69fe4b788625fa53be4ab66aa Port: 3306/TCP Host Port: 0/TCP State: Running Started: Wed, 26 Oct 2022 22:37:13 +0600 Last State: Terminated Reason: Error Exit Code: 1 Started: Wed, 26 Oct 2022 22:36:44 +0600 Finished: Wed, 26 Oct 2022 22:36:46 +0600 Ready: True Restart Count: 3 Limits: cpu: 1500m memory: 512Mi Requests: cpu: 1500m memory: 512Mi Environment: MYSQL_ROOT_PASSWORD: <set to the key 'mysql-root-password' in secret 'mysql-secret'> Optional: false Mounts: /var/lib/mysql from mysql-persistant-storage (rw) /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-h44lh (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: mysql-persistant-storage: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: mysql-pvc ReadOnly: false kube-api-access-h44lh: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true QoS Class: Guaranteed Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 47s default-scheduler Successfully assigned default/mysql-deployment-744d6df885-lm2nw to minikube Warning BackOff 15s (x4 over 43s) kubelet Back-off restarting failed container Normal Pulled 2s (x4 over 47s) kubelet Container image "mysql:latest" already present on machine Normal Created 2s (x4 over 47s) kubelet Created container mysql Normal Started 2s (x4 over 47s) kubelet Started container mysql
日志信息
2022-10-26 17:22:14+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started. 2022-10-26 17:22:14+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql' 2022-10-26 17:22:14+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started. '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock' 2022-10-26T17:22:14.726596Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead. 2022-10-26T17:22:14.727697Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.31) starting as process 1 2022-10-26T17:22:14.732426Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2022-10-26T17:22:14.761436Z 1 [ERROR] [MY-012960] [InnoDB] Cannot create redo log files because data files are corrupt or the database was not shut down cleanly after creating the data files. 2022-10-26T17:22:15.248917Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine 2022-10-26T17:22:15.249090Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed. 2022-10-26T17:22:15.249122Z 0 [ERROR] [MY-010119] [Server] Aborting 2022-10-26T17:22:15.249437Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.31) MySQL Community Server - GPL.
解决建议
从日志错误Cannot create redo log files because data files are corrupt or the database was not shut down cleanly after creating the data files可知,核心问题是持久化存储中的MySQL数据文件损坏或未正常关闭导致的,按以下步骤修复:
1. 清理损坏的持久化数据
- 进入Minikube节点:
minikube ssh - 删除PV对应hostPath目录下的所有数据:
sudo rm -rf /mnt/data/* - 退出Minikube:
exit - 删除现有资源并重新创建:
kubectl delete pod mysql-deployment-744d6df885-lm2nw kubectl delete pvc mysql-pvc kubectl delete pv mysql-pv kubectl apply -f persistent-volume.yaml kubectl apply -f persistent-volume-claim.yaml kubectl apply -f deployment.yaml
2. 修复存储目录权限(可选)
MySQL容器使用mysql用户运行,hostPath目录权限可能不匹配,提前设置权限:
minikube ssh sudo mkdir -p /mnt/data sudo chown -R 999:999 /mnt/data # MySQL镜像中mysql用户的UID为999 exit
3. 指定具体MySQL镜像版本(可选)
mysql:latest会自动拉取最新版本,易引发兼容性问题,建议指定稳定版本,比如mysql:8.0.31,修改Deployment.yaml中的image字段即可。
4. 验证Secret密码正确性
解码Secret中的密码确认是否正确:echo "bXlzcWw=" | base64 --decode,正常应输出mysql。
内容的提问来源于stack exchange,提问作者Neha
相关产品推荐
相关产品推荐

