.NET 8服务在Kubernetes中连接SQL Server时sa登录失败
问题分析与解决方案
核心问题定位
从SQL Server日志的Error: 18456, Severity: 14, State: 38错误可以明确:并非SA账号密码错误,而是连接字符串中指定的platformsdb数据库不存在,或者SA用户无该数据库的访问权限。你本地SSMS能连接成功是因为默认登录的是master数据库,而非platformsdb。
解决方案步骤
1. 确认并创建目标数据库
通过SSMS连接到K8s中的SQL Server(使用mssql-loadbalancer的外部IP,或通过端口转发:kubectl port-forward svc/mssql-loadbalancer 1433:1433),执行以下SQL:
-- 检查数据库是否存在 SELECT name FROM sys.databases WHERE name = 'platformsdb'; -- 如果不存在则创建 IF NOT EXISTS (SELECT name FROM sys.databases WHERE name = 'platformsdb') CREATE DATABASE platformsdb;
2. 确保SA用户拥有数据库权限
即使SA是系统管理员,新创建的数据库可能需要显式映射用户权限,执行:
USE platformsdb; -- 为SA登录创建数据库用户(如果不存在) IF NOT EXISTS (SELECT name FROM sys.database_principals WHERE name = 'sa') CREATE USER sa FOR LOGIN sa; -- 授予SA数据库所有者权限 ALTER ROLE db_owner ADD MEMBER sa;
3. 验证K8s Secret与连接字符串一致性
检查Secret中的SA密码是否与连接字符串一致:
kubectl get secret mssql -o jsonpath='{.data.MSSQL_SA_PASSWORD}' | base64 --decode
确保输出为Pa55w0rd!,与连接字符串中的密码完全匹配。
4. 测试K8s内部服务连通性
在PlatformService的Pod中测试与SQL Server服务的连通性,排除网络问题:
# 替换为你的PlatformService Pod名称 kubectl exec -it <platformservice-pod-name> -- telnet mssql-clusterip-srv 1433
如果连接成功,说明网络正常;如果失败,检查mssql-clusterip-srv的Selector是否与SQL Server Pod的标签app: mssql匹配。
5. 检查EF Core迁移状态(若使用)
如果你的服务依赖EF Core迁移,确保迁移已应用到目标数据库:
# 本地执行迁移(或在K8s Pod中执行) dotnet ef database update --connection "Server=<sql-external-ip>,1433;Initial Catalog=platformsdb;User Id=sa;Password=Pa55w0rd!;TrustServerCertificate=True;"
内容的提问来源于stack exchange,提问作者Talented Developer
相关产品推荐
相关产品推荐

