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

Azure K8s集群Pod连接同VNet内Azure VM中Docker容器问题

问题分析与解决方案

核心结论

同一Azure VNet下的AKS(kubenet)Pod与Azure VM上的Docker容器完全可以实现网络连接,当前问题大概率是配置遗漏导致,而非网络栈限制。

排查步骤与修复建议

1. 验证SQL容器的IP地址与连接字符串正确性

  • 你用sqlContainer.IpAddress获取的IP,需要确认是Azure VNet内的可路由IP(而非Docker默认桥接网络的私网IP)。可在VM上执行docker inspect <sql-container-name>,查看Networks.azurevnet.IPAddress字段确认IP归属。
  • 连接字符串中不要添加\SQLEXPRESS后缀:标准SQL Server容器的默认实例名是MSSQLSERVER,直接用IP地址,1433作为DataSource即可。修改后的代码示例:
    ServerName = $@"{sqlContainer.IpAddress},1433";
    ConnectionString = new SqlConnectionString(new SqlConnectionStringBuilder()
    {
        UserID = SqlUsername,
        DataSource = ServerName,
        Password = Credentials.Password,
        TrustServerCertificate = true // 测试环境可临时启用,规避证书验证问题
    }
    .ToString());
    

2. 检查Azure VM的网络安全组(NSG)配置

  • 确保NSG添加入站规则:允许AKS集群所在子网的IP段,访问SQL容器IP的1433端口(TCP协议)。默认NSG会拒绝非信任来源的入站流量,即使同属一个VNet也需要显式放行。

3. 验证VM本地防火墙设置

  • 检查VM操作系统的防火墙(Windows防火墙/Linux iptables),确认是否允许1433端口的入站流量,尤其是来自AKS子网的IP段。可临时关闭防火墙做测试,快速确认是否是防火墙拦截。

4. 检查AKS kubenet的路由配置

  • 使用kubenet的AKS集群,Pod的IP来自节点所在子网。需要确保AKS节点的路由表中存在到SQL容器所在子网的路由(Azure VNet默认会自动配置同VNet子网间的路由,可在Azure门户检查路由表确认)。
  • 在AKS Pod内执行连通性测试,先排除网络层面问题:
    # 测试端口连通性
    nc -zv <sql-container-ip> 1433
    # 或用telnet
    telnet <sql-container-ip> 1433
    
    如果测试失败,说明网络存在拦截;如果成功,再排查SQL Server的配置(如SA密码有效性、登录权限)。

5. 确认SQL容器的TCP/IP协议启用

  • SQL Server容器默认启用TCP/IP协议,可通过docker exec进入容器,执行/opt/mssql/bin/mssql-conf show network.tcp enabled确认配置为yes。

关于Azure Container Instance(ACI)的补充

如果上述排查后仍无法解决,将SQL容器部署到ACI并加入同一VNet确实是更简化的方案:ACI会直接分配VNet内的IP,AKS Pod可直接访问,无需额外配置VM层面的网络规则。但建议先完成上述排查,定位现有配置的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:46:07