Airflow部署于K8s集群连接PostgreSQL遇SSL超时致任务延迟的原因及解决
我之前在3节点K8s集群部署Airflow+PostgreSQL的场景下,碰到过几乎一模一样的问题,给你梳理下问题根源和可行的解决办法:
核心原因1:PostgreSQL强制要求SSL连接,但Airflow未配置
你的PostgreSQL实例已经被配置为必须使用SSL连接(比如postgresql.conf里ssl=on,且pg_hba.conf中对Airflow的连接规则设置了ssl=require),但Airflow的数据库连接配置里完全没有添加SSL相关参数,导致每次调度器尝试连接PostgreSQL时,都会被拒绝,抛出FATAL: SSL connection is required的错误。
核心原因2:连接池与重试机制导致2小时后才恢复
出现连接超时后,Airflow调度器的数据库连接池默认配置可能没有及时触发重新连接:
- 默认的
sql_alchemy_pool_recycle值可能过大,或者没有开启pool_pre_ping,导致失效的连接一直被保留在池子里 - 调度器的重试逻辑间隔较长,直到连接池自动回收失效连接后,才重新建立有效连接,这段时间就出现了2小时的任务延迟
更新Airflow的数据库连接配置,启用SSL
找到Airflow的配置文件(如果是K8s部署,通常是挂载的ConfigMap里的airflow.cfg),修改sql_alchemy_conn参数,添加SSL相关的查询参数:sql_alchemy_conn = postgresql+psycopg2://<你的DB用户名>:<密码>@<DB地址>:<端口>/<DB名称>?sslmode=require如果你的PostgreSQL需要证书验证(比如
sslmode=verify-full),还要加上证书路径参数:sql_alchemy_conn = postgresql+psycopg2://<用户名>:<密码>@<DB地址>:<端口>/<DB名称>?sslmode=verify-full&sslrootcert=/path/to/root.crt&sslcert=/path/to/client.crt&sslkey=/path/to/client.key注意:在K8s里要把证书文件通过Secret挂载到Airflow Pod的对应路径下,确保Pod能访问到这些文件。
优化Airflow的数据库连接池设置
在airflow.cfg里调整以下参数,避免连接失效后无法及时重建:sql_alchemy_pool_size = 15 # 根据集群规模调整,建议10-20 sql_alchemy_pool_recycle = 3600 # 1小时回收一次连接,避免PostgreSQL超时断开 sql_alchemy_pool_pre_ping = True # 每次获取连接前检查有效性,失效则重建修改后记得重启Airflow调度器和Worker Pod。
检查K8s集群的网络配置
- 确认集群的NetworkPolicy是否允许Airflow Pod(调度器、Worker)和PostgreSQL Pod之间的5432端口SSL通信
- 在Airflow Pod内部执行
psql "postgresql://<用户>:<密码>@<DB地址>:<端口>/<DB名称>?sslmode=require"测试连接,排查是否存在网络丢包或者延迟过高的问题 - 如果PostgreSQL是外部服务,检查集群的安全组/防火墙是否允许出站的5432端口SSL连接
验证PostgreSQL的SSL配置
登录PostgreSQL服务器,执行以下SQL确认SSL设置:SHOW ssl; SHOW sslmode; SHOW ssl_cert_file;确保
ssl返回on,并且pg_hba.conf中对应Airflow的连接规则设置了ssl=require或更严格的验证模式。
内容的提问来源于stack exchange,提问作者nishant

