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

连接Kubernetes中SQL Server Pod执行查询报错:Internal connection fatal error

问题:连接K8s部署的SQL Server可获取版本但执行查询报错"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连接测试截图


排查与解决建议

  1. 补充连接字符串加密配置
    SQL Server容器默认可能强制加密连接,执行查询时因证书信任问题中断。修改连接字符串,添加证书信任配置:

    string connectionString = $"Server={serverName};Database={databaseName};User Id={userId};Password={password};TrustServerCertificate=True;Encrypt=True;";
    

    (注:生产环境建议配置合法证书,而非使用TrustServerCertificate=True)

  2. 验证端口映射正确性
    代码默认使用localhost,14344,但SSMS用的是localhost,30000。先改用localhost,30000测试,排除端口转发异常;若要使用14344,需确认对应的ClusterIP/LoadBalancer服务是否正常转发流量到Pod的1433端口。

  3. 关闭不必要的HADR配置
    YAML中开启了ENABLE_HADR=1(Always On可用性组),但单实例部署可能导致会话异常。临时关闭该配置,修改StatefulSet的环境变量:

    - name: ENABLE_HADR
      value: "0"
    

    重新部署Pod后测试。

  4. 移除冗余的手动资源释放
    代码中手动调用reader.Close(),但using语句会自动释放SqlDataReader资源,手动关闭可能引发异常,建议删除该行代码。

  5. 检查文化格式设置
    代码中强制设置了InvariantCulture,若查询返回的字段涉及日期、数字等格式,可能引发隐性冲突。可尝试移除这两行文化设置代码,再测试查询。


内容的提问来源于stack exchange,提问作者Sol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:44:58