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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:24:51