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内执行连通性测试,先排除网络层面问题:
如果测试失败,说明网络存在拦截;如果成功,再排查SQL Server的配置(如SA密码有效性、登录权限)。# 测试端口连通性 nc -zv <sql-container-ip> 1433 # 或用telnet telnet <sql-container-ip> 1433
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
相关产品推荐
相关产品推荐

