连接Kubernetes中SQL Server Pod执行查询报错:Internal connection fatal error
我通过Kubernetes YAML文件部署了SQL Server,能通过SSMS使用localhost,30000连接并查询master数据库。但用.NET 8创建的ASP.NET Core Web API本地测试时,能成功打开连接并获取SQL Server版本,却无法执行简单查询,报错信息如下:
Internal connection fatal error
Web API测试方法(WeatherforecastController)
[HttpGet("TestDatabaseConnection")] public IActionResult TestDatabaseConnection(string serverName = "localhost,14344", string databaseName = "master", string userId = "sa", string password = "P@ssw0rd123") { string connectionString = $"Server={serverName};Database={databaseName};User Id={userId};Password={password};"; string queryString = "SELECT TOP 1 * FROM sys.databases;"; _logger.LogInformation("Connection String: {0}", connectionString); _logger.LogInformation("Query String: {0}", queryString); try { using (SqlConnection connection = new SqlConnection(connectionString)) { _logger.LogInformation("Create new SqlCommand"); using (var command = new SqlCommand(queryString, connection)) { try { CultureInfo.CurrentCulture = CultureInfo.InvariantCulture; CultureInfo.CurrentUICulture = CultureInfo.InvariantCulture; _logger.LogInformation("Open connection"); connection.Open(); // Add a simple query execution here using (SqlCommand versionCommand = new SqlCommand("SELECT @@VERSION", connection)) { string version = (string)versionCommand.ExecuteScalar(); _logger.LogInformation("SQL Server Version: {0}", version); } _logger.LogInformation("Execute reader"); using (SqlDataReader reader = command.ExecuteReader()) { _logger.LogInformation("Read"); while (reader.Read()) { Console.WriteLine(String.Format("{0}", reader[0])); } _logger.LogInformation("Close connection"); reader.Close(); } return Ok("Database Connection Successful"); } catch (Exception ex) { return Problem("Database Connection Failed: " + ex.Message); } } } } catch (Exception ex) { return Problem("Database Connection Failed[SqlConnection]: " + ex.Message); } }
Kubernetes部署YAML文件
apiVersion: apps/v1 kind: StatefulSet metadata: name: accsol-sqlserver spec: serviceName: "accsol-sqlserver" replicas: 1 selector: matchLabels: app: accsol-sqlserver template: metadata: labels: app: accsol-sqlserver spec: securityContext: fsGroup: 10001 containers: - name: accsol-sqlserver image: solomiosisante/accsol-sqlserver:0.1.0 ports: - containerPort: 1433 name: tcpsql env: - name: ENABLE_HADR value: "1" - name: AGENT_ENABLED value: "1" - name: MSSQL_PID value: "Express" - name: ACCEPT_EULA value: "Y" - name: MSSQL_SA_PASSWORD valueFrom: secretKeyRef: name: accsol-sqlserver key: MSSQL_SA_PASSWORD volumeMounts: - name: accsol-sqlserver-claim mountPath: "/Data" volumeClaimTemplates: - metadata: name: accsol-sqlserver-claim spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi --- apiVersion: v1 kind: Service metadata: name: accsol-sqlserver-clusterip-srv spec: type: ClusterIP selector: app: accsol-sqlserver ports: - name: accsol-sqlserver protocol: TCP port: 14344 targetPort: 1433 --- apiVersion: v1 kind: Service metadata: name: accsol-sqlserver-service spec: selector: app: accsol-sqlserver ports: - protocol: TCP port: 1433 targetPort: 1433 nodePort: 30000 type: NodePort --- apiVersion: v1 kind: Service metadata: name: accsol-sqlserver-loadbalancer spec: type: LoadBalancer selector: app: accsol-sqlserver ports: - protocol: TCP port: 14344 targetPort: 1433
相关截图

排查与解决建议
补充连接字符串加密配置
SQL Server容器默认可能强制加密连接,执行查询时因证书信任问题中断。修改连接字符串,添加证书信任配置:string connectionString = $"Server={serverName};Database={databaseName};User Id={userId};Password={password};TrustServerCertificate=True;Encrypt=True;";(注:生产环境建议配置合法证书,而非使用
TrustServerCertificate=True)验证端口映射正确性
代码默认使用localhost,14344,但SSMS用的是localhost,30000。先改用localhost,30000测试,排除端口转发异常;若要使用14344,需确认对应的ClusterIP/LoadBalancer服务是否正常转发流量到Pod的1433端口。关闭不必要的HADR配置
YAML中开启了ENABLE_HADR=1(Always On可用性组),但单实例部署可能导致会话异常。临时关闭该配置,修改StatefulSet的环境变量:- name: ENABLE_HADR value: "0"重新部署Pod后测试。
移除冗余的手动资源释放
代码中手动调用reader.Close(),但using语句会自动释放SqlDataReader资源,手动关闭可能引发异常,建议删除该行代码。检查文化格式设置
代码中强制设置了InvariantCulture,若查询返回的字段涉及日期、数字等格式,可能引发隐性冲突。可尝试移除这两行文化设置代码,再测试查询。
内容的提问来源于stack exchange,提问作者Sol

