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

使用工作负载身份连接SQL Server时登录超时问题求助

排查Kubernetes Pod中使用托管身份连接Azure SQL Server的超时问题

我按照微软文档配置,使用以下Python代码通过托管身份连接Azure SQL Server:

import pyodbc

connString = f"Driver={{ODBC Driver 17 for SQL Server}};SERVER=tcp:<server-name>.database.windows.net,1433;DATABASE=<db-name>;ConnectionTimeout=60;Authentication=ActiveDirectoryMsi"

conn = pyodbc.connect(connString)

执行后出现超时错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
pyodbc.OperationalError: ('HYT00', '[HYT00] [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired (0) (SQLDriverConnect)')

已确认:

  • Kubernetes命名空间的工作负载身份权限配置正确
  • 使用UID和密码的连接字符串可正常连接

以下是具体排查与解决步骤:


1. 升级ODBC驱动版本

ODBC Driver 17对Kubernetes工作负载身份的支持存在局限性,建议升级到ODBC Driver 18 for SQL Server,同时添加加密连接参数:

import pyodbc

connString = f"Driver={{ODBC Driver 18 for SQL Server}};SERVER=tcp:<server-name>.database.windows.net,1433;DATABASE=<db-name>;ConnectionTimeout=60;Authentication=ActiveDirectoryMsi;Encrypt=yes"

conn = pyodbc.connect(connString)

2. 验证工作负载身份环境变量与连接参数

如果使用用户分配托管身份,需确保Pod内已注入AZURE_CLIENT_ID环境变量,且连接字符串中指定该客户端ID:

connString = f"Driver={{ODBC Driver 18 for SQL Server}};SERVER=tcp:<server-name>.database.windows.net,1433;DATABASE=<db-name>;ConnectionTimeout=60;Authentication=ActiveDirectoryMsi;UID=<your-msi-client-id>"

可在Pod内执行printenv | grep AZURE,确认AZURE_CLIENT_ID、AZURE_TENANT_ID是否正确注入。

3. 排查网络与防火墙限制

  • 在Pod内测试SQL Server端口连通性:
    nc -zv <server-name>.database.windows.net 1433
    
  • 检查Azure SQL Server防火墙规则:确保允许Kubernetes集群的出站IP、VNet服务端点或对等网络访问。若使用VNet服务端点,需确认SQL Server已绑定对应子网,且子网已启用Microsoft.Sql服务端点。

4. 确认托管身份的SQL权限配置

即使工作负载身份绑定正确,仍需验证托管身份已被添加为SQL Server的合法用户:

  1. 确保Azure SQL Server已配置Active Directory管理员
  2. 使用AD管理员账号连接SQL Server,执行以下SQL:
    CREATE USER [your-msi-display-name] FROM EXTERNAL PROVIDER;
    ALTER ROLE db_datareader ADD MEMBER [your-msi-display-name];
    ALTER ROLE db_datawriter ADD MEMBER [your-msi-display-name];
    
    替换your-msi-display-name为托管身份的显示名称。

5. 启用ODBC日志排查细节

临时延长超时时间并开启ODBC日志,获取更详细的认证流程信息:

  • 修改连接字符串:ConnectionTimeout=120
  • 在Pod内配置ODBC日志:
    # /etc/odbc.ini
    [ODBC]
    Trace=Yes
    TraceFile=/tmp/odbc.log
    
    执行代码后查看/tmp/odbc.log,定位具体失败环节。

6. 验证K8s服务账户绑定

确认服务账户已与托管身份正确绑定:

kubectl describe sa <your-service-account> -n <namespace>

查看Annotations中是否包含azure.workload.identity/client-id和azure.workload.identity/tenant-id,且值与托管身份信息一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:52:40