在Kubernetes的MySQL Pod内执行mysql客户端命令报错排查
问题描述
在K3S集群中部署了MySQL的StatefulSet,清单配置如下:
apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql namespace: dev labels: app: myapp spec: selector: matchLabels: app: myapp serviceName: database-svc replicas: 1 template: metadata: labels: app: myapp spec: containers: - name: mysql-db image: mysql:8.0.30-debian ports: - name: tcp protocol: TCP containerPort: 3306 env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-secret key: ROOT_PASSWORD volumeMounts: - name: mysql-data mountPath: /var/lib/mysql volumeClaimTemplates: - metadata: name: mysql-data spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
相关Service和Secret已创建,Pod正常启动,但执行以下命令并输入正确密码后报错:
kubectl exec -n dev -it mysql-0 -- mysql -u root -p
错误信息:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) command terminated with exit code 1
进入容器后通过echo $MYSQL_ROOT_PASSWORD确认环境变量密码与输入一致。
问题分析与解决方法
核心原因:持久化存储中存在旧MySQL数据
MySQL官方镜像的初始化逻辑仅在首次启动且/var/lib/mysql目录为空时执行,会使用MYSQL_ROOT_PASSWORD设置初始密码。如果你的PVC之前已经存储过MySQL数据(比如之前部署过MySQL并删除了Pod但保留了PVC),则后续启动会直接加载旧数据,此时MYSQL_ROOT_PASSWORD环境变量不会生效,旧密码会被保留。
解决方法1:重置持久化存储(推荐,适用于无重要数据场景)
- 删除StatefulSet:
kubectl delete statefulset mysql -n dev
- 删除对应的PVC:
kubectl delete pvc mysql-data-mysql-0 -n dev
- 重新部署StatefulSet,此时PVC会重新创建,MySQL会重新初始化并使用Secret中的密码。
解决方法2:手动重置root密码(适用于需要保留现有数据的场景)
- 进入MySQL容器:
kubectl exec -n dev -it mysql-0 -- bash
- 停止MySQL服务:
service mysql stop
- 以跳过权限验证的方式启动MySQL:
mysqld_safe --skip-grant-tables &
- 无密码登录MySQL:
mysql -u root
- 更新root用户密码(替换为你的Secret中的密码):
USE mysql; ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的ROOT_PASSWORD值'; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的ROOT_PASSWORD值'; -- 可选,允许远程连接 FLUSH PRIVILEGES; EXIT;
- 重启MySQL服务:
service mysql restart
- 退出容器后重新尝试连接:
kubectl exec -n dev -it mysql-0 -- mysql -u root -p
正确的命令行连接方式
如果是全新初始化的MySQL,直接使用以下命令即可连接:
kubectl exec -n dev -it mysql-0 -- mysql -u root -p
若需要强制使用TCP连接(避免socket权限问题),可以指定-h 127.0.0.1:
kubectl exec -n dev -it mysql-0 -- mysql -u root -p -h 127.0.0.1
内容的提问来源于stack exchange,提问作者Essay97
相关产品推荐
相关产品推荐

