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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 13:22:11