如何连接OpenShift中崩溃的MySQL容器/Pod并解决启动登录故障
嘿,我之前在OpenShift上也碰到过一模一样的MySQL容器循环启动、密码验证失败的问题,给你几个不用正常启动容器就能搞定的办法:
方法一:挂载持久化存储卷直接修改配置
OpenShift的MySQL容器一般会把数据目录挂在PVC上,咱们可以把这个PVC挂载到临时容器里,直接改配置跳过密码验证:
先找到你的MySQL对应的PVC名称:
oc get pvc找和你的MySQL服务绑定的那个,比如叫
mysql-data-pvc。启动一个临时busybox容器,挂载这个PVC:
oc run -it --rm busybox --image=busybox --restart=Never --volume=claimName=mysql-data-pvc,path=/var/lib/mysql -- sh这里的
path要对应MySQL容器里的数据目录,通常是/var/lib/mysql,如果你的镜像路径不一样,得调整下。进入临时容器后,找到MySQL的配置文件(比如
/var/lib/mysql/my.cnf或者/etc/my.cnf,看镜像版本),在[mysqld]段加一行:skip-grant-tables退出临时容器,删掉原来的MySQL Pod让它重启:
oc delete pod <你的mysql-pod名称>这次启动就会跳过密码验证,直接能登root了。
登录容器重置密码:
oc rsh <新启动的mysql-pod名称> mysql -u root执行SQL重置密码(MySQL 5.7用
authentication_string,老版本用password):UPDATE mysql.user SET authentication_string=PASSWORD('你的新密码') WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES;最后别忘了把
skip-grant-tables从配置文件里删掉,再重启Pod,确保密码验证正常生效。
方法二:修改Deployment启动参数跳过验证
如果挂载PVC麻烦,直接改Deployment的启动参数也行:
编辑Deployment配置:
oc edit deployment <你的mysql-deployment名称>在
spec.template.spec.containers[0].args里加--skip-grant-tables,比如原来的args是:args: - "--datadir=/var/lib/mysql/data"修改后变成:
args: - "--datadir=/var/lib/mysql/data" - "--skip-grant-tables"保存退出后,OpenShift会自动重启Pod,之后你就能无密码登root,按方法一的步骤5重置密码。
密码改完后,记得把
--skip-grant-tables从Deployment里删掉,再重启Pod。
方法三:通过初始化脚本重置密码
如果你的MySQL用了初始化脚本(比如init.sql),可以修改脚本重新部署:
找到对应的ConfigMap(如果脚本存在ConfigMap里):
oc get configmap编辑ConfigMap,在
init.sql里加重置密码的SQL:oc edit configmap <你的mysql-init-config名称>添加内容:
UPDATE mysql.user SET authentication_string=PASSWORD('你的新密码') WHERE User='root' AND Host='localhost'; FLUSH PRIVILEGES;重启Deployment让脚本重新执行:
oc rollout restart deployment <你的mysql-deployment名称>注意:这个方法可能会覆盖其他初始化配置,用之前确认下脚本内容不会影响现有数据。
额外提醒
- 密码重置后,记得把新密码存到Secret里,然后在Deployment里引用作为
MYSQL_ROOT_PASSWORD环境变量:oc create secret generic mysql-root-pass --from-literal=password='你的新密码' - 如果碰到权限问题,比如不能操作PVC或者Deployment,找集群管理员帮忙开权限就行。
内容的提问来源于stack exchange,提问作者user3316274

