AKS部署中Snowflake Connector返回504网关超时问题求助
我们在Azure Kubernetes Services(AKS)上运行一套系统,其中一个部署实例托管的Python代码通过以下方式连接Snowflake:
import os import snowflake.connector def create_snowflake_connection(account, access_token, warehouse, database, user, role): conn = snowflake.connector.connect( user=user, host=os.getenv('SNOWFLAKE_ACCOUNT'), token=access_token, role=role, account=account, warehouse=warehouse, database=database, authenticator='oauth', client_session_keep_alive=True, max_connection_pool=100, ) return conn
调用该部署的接口执行查询时,返回错误:Server Error 504 Gateway Time-out for url https://url-of-deployment.com/endpoint/function_name,但本地运行相同代码可正常工作。
1. Snowflake连接配置排查
- 使用的Snowflake Connector版本为
snowflake-connector-python==3.12.0 - 参考官方文档增加连接超时参数,修改后的代码如下:
import os import snowflake.connector def create_snowflake_connection(account, access_token, warehouse, database, user, role): conn = snowflake.connector.connect( user=user, host=os.getenv('SNOWFLAKE_ACCOUNT'), token=access_token, role=role, account=account, warehouse=warehouse, database=database, authenticator='oauth', client_session_keep_alive=True, max_connection_pool=100, login_timeout=300, network_timeout=300, socket_timeout=300 ) return conn
问题依旧,且发现添加socket_timeout参数并未改变DEFAULT_SOCKET_CONNECT_TIMEOUT的默认值(已参考相关Github issue)。
2. Kubernetes配置排查
Kubernetes日志显示等待响应超过60秒时触发超时,已检查部署清单的超时配置:
... readinessProbe: initialDelaySeconds: 1 periodSeconds: 2 timeoutSeconds: 300 # 原60秒已改为300秒 successThreshold: 1 failureThreshold: 1 ... ... nginx.org/proxy-connect-timeout: 3600s nginx.org/proxy-read-timeout: 3600s nginx.org/proxy-send-timeout: 3600s
系统使用OAuth2反向代理处理用户请求认证,但该代理的清单未设置超时配置。发现Kubernetes文档中nginx.ingress.kubernetes.io/auth-keepalive-timeout默认值为60秒,疑似是问题根源,但不清楚该参数与nginx.ingress.kubernetes.io/auth-keepalive的关联关系,寻求解决该504网关超时问题的方案。
1. 明确两个认证代理参数的关联
nginx.ingress.kubernetes.io/auth-keepalive:布尔型参数,默认开启(true),控制Ingress是否与OAuth2认证代理保持长连接。关闭后每次请求都会重新建立连接,增加延迟,但不会直接触发超时。nginx.ingress.kubernetes.io/auth-keepalive-timeout:指定Ingress与认证代理之间长连接的空闲超时时间,默认60秒。如果Snowflake查询耗时超过60秒,Ingress与认证代理的长连接会因超时被关闭,导致后续响应无法传递,触发504错误。
2. 调整OAuth2反向代理的超时配置
在Ingress资源的注解中添加以下配置:
nginx.ingress.kubernetes.io/auth-keepalive-timeout: "300s" # 与Snowflake连接超时匹配 nginx.ingress.kubernetes.io/auth-keepalive: "true" # 确保长连接开启
同时同步调整认证代理内部的超时参数(如代理的proxy-read-timeout),确保不小于Snowflake查询的最大预期耗时。
3. 优化Snowflake连接超时设置
通过环境变量强制覆盖默认超时值:
# 在建立连接前设置环境变量 os.environ['SNOWFLAKE_DEFAULT_SOCKET_CONNECT_TIMEOUT'] = '300' os.environ['SNOWFLAKE_DEFAULT_SOCKET_TIMEOUT'] = '300' conn = snowflake.connector.connect(...)
同时确认Snowflake仓库的查询超时设置足够长,避免查询被Snowflake主动中断。
4. 验证全链路超时配置
确认以下配置已覆盖所有超时节点:
- 部署的
readinessProbe超时已设为300秒(已完成) - Ingress的代理超时(
proxy-connect-timeout、proxy-read-timeout、proxy-send-timeout)已设为3600秒(已完成) - 认证代理的超时参数已同步调整
内容的提问来源于stack exchange,提问作者Aniss Chohra

