You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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:重置持久化存储(推荐,适用于无重要数据场景)

  1. 删除StatefulSet:
kubectl delete statefulset mysql -n dev
  1. 删除对应的PVC:
kubectl delete pvc mysql-data-mysql-0 -n dev
  1. 重新部署StatefulSet,此时PVC会重新创建,MySQL会重新初始化并使用Secret中的密码。

解决方法2:手动重置root密码(适用于需要保留现有数据的场景)

  1. 进入MySQL容器:
kubectl exec -n dev -it mysql-0 -- bash
  1. 停止MySQL服务:
service mysql stop
  1. 以跳过权限验证的方式启动MySQL:
mysqld_safe --skip-grant-tables &
  1. 无密码登录MySQL:
mysql -u root
  1. 更新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;
  1. 重启MySQL服务:
service mysql restart
  1. 退出容器后重新尝试连接:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 07:05:18