Kubernetes集群内Job无法连接MySQL服务执行EF数据库迁移
问题排查与解决方案
1. 修复MySQL连接串格式错误
C# MySQL驱动(MySql.Data/MySqlConnector)不支持在server参数后直接拼接冒号+端口,端口需要通过独立的port参数指定,你之前所有的连接串写法都不符合驱动要求,这是最高概率的故障原因。
正确连接串写法如下:
server=mysql.default.svc.cluster.local;port=3306;uid=myUser;pwd=myPassword;database=myDatabase
如果Job和MySQL服务在同一个命名空间下,可直接简写服务名:
server=mysql;port=3306;uid=myUser;pwd=myPassword;database=myDatabase
修改Job的CONNECTION_STRING环境变量后重新运行Job即可测试。
2. 验证MySQL用户远程访问权限
如果修改连接串后仍报错,检查MySQL用户的访问权限配置:
- 本地端口转发连接到MySQL,执行SQL命令:
SELECT host, user FROM mysql.user WHERE user='myUser';
- 如果返回结果中
host字段只有localhost/127.0.0.1,说明该用户仅允许本地登录,执行授权命令开放集群访问权限:
GRANT ALL PRIVILEGES ON myDatabase.* TO 'myUser'@'%'; FLUSH PRIVILEGES;
%代表允许任意来源IP访问,生产环境可替换为集群Pod网段缩小权限范围。
3. 排查集群网络连通性
上述步骤都无效的情况下,验证集群内部网络连通性:
- 在Job所在的命名空间启动临时测试Pod执行连接测试:
kubectl run -it --rm --image=mysql:8.0 --restart=Never mysql-client -- mysql -h mysql.default.svc.cluster.local -P 3306 -u myUser -pmyPassword
- 如果测试Pod可以正常连接,说明网络无问题,故障出在迁移镜像的配置上,可检查EF Core MySQL Provider版本是否与.NET 5匹配;如果测试Pod也无法连接,依次排查:
- 执行
kubectl describe svc mysql查看Endpoints字段是否存在正常的MySQL Pod IP,确认Service的selector和Deployment标签匹配 - 检查集群是否存在NetworkPolicy规则禁止了对MySQL 3306端口的访问
- 确认minikube的CoreDNS服务运行正常
- 执行
4. 补充兼容配置
MySQL 8.0默认启用SSL认证,测试环境可在连接串中添加SslMode=None跳过SSL校验,避免认证失败问题。
内容的提问来源于stack exchange,提问作者Tomasz Sikora
相关产品推荐
相关产品推荐

