无法从AWS EKS集群节点的Docker容器连接EC2 PostgreSQL服务器
问题描述
我们在AWS EC2实例上运行PostgreSQL数据库,需要从AWS EKS集群内EC2节点上的Docker容器,通过Python的pyodbc库连接该数据库。
遇到如下错误:
2023-02-23T15:03:49.532858159Z return pyodbc.connect(connection_str) 2023-02-23T15:03:49.532902079Z pyodbc.OperationalError: ('08001', '[08001] could not connect to server: Network is unreachable Is the server running on host "****" and accepting TCP/IP connections on port 5432? could not connect to server: Network is unreachable Is the server running on host "5432" (0.0.21.56) and accepting TCP/IP connections on port 5432? (101) (SQLDriverConnect)')
通过Putty登录EKS的EC2节点,运行相同的Python代码时,数据库连接成功。怀疑Docker容器存在网络连接问题,但无法定位具体原因。
使用的docker-compose.yaml文件如下:
version: "3.7" services: dev: image: dbimage container_name: dbimage build: context: . target: dbimage args: - BUILDKIT_INLINE_CACHE=1 - BUILD_DATE - GITREF networks: - cloud-network volumes: - .:/app networks: cloud-network: driver: bridge
排查与解决步骤
1. 修正连接字符串格式
错误日志中出现host "5432",说明连接字符串格式错误,将端口号误识别为主机地址。正确的PostgreSQL ODBC连接字符串格式应为:
connection_str = "DRIVER={PostgreSQL Unicode};SERVER=你的EC2实例IP/域名;PORT=5432;DATABASE=数据库名;UID=用户名;PWD=密码"
确认SERVER与PORT参数分离正确,未将端口拼接至主机地址中。
2. 测试容器内网络连通性
进入运行中的容器,执行以下命令验证网络:
# 进入容器 docker exec -it dbimage bash # 安装ping工具(容器未预装时执行) apt-get update && apt-get install -y iputils-ping # ping EC2实例私有IP,测试基础连通 ping <EC2实例私有IP> # 测试5432端口连通性(二选一) telnet <EC2实例私有IP> 5432 # 或使用nc nc -zv <EC2实例私有IP> 5432
- 若ping不通:说明容器网络无法访问EC2实例
- 若ping通但端口连不上:检查EC2安全组或PostgreSQL配置
3. 检查EC2安全组规则
确保EC2安全组的入站规则允许以下来源访问5432端口:
- EKS节点所在的安全组ID
- Docker自定义网桥的网段(可通过
docker network inspect cloud-network查看实际网段,默认bridge网桥多为172.17.0.0/16)
4. 排查Docker网络配置
查看自定义网桥网段
docker network inspect cloud-network
确认网段未与VPC内其他网段冲突,且EC2安全组已开放该网段的访问权限。
临时切换为host网络测试
修改docker-compose.yaml,使用host网络模式:
services: dev: # 保留原有其他配置 network_mode: host # 注释或删除原networks配置 # networks: # - cloud-network
重启容器后测试连接,若成功则说明自定义网桥的路由存在问题。
5. 检查PostgreSQL监听配置
修改EC2上PostgreSQL的postgresql.conf文件,确保允许所有IP访问:
listen_addresses = '*'
修改后重启PostgreSQL服务:
sudo systemctl restart postgresql
6. 检查EKS网络策略
若EKS集群配置了Network Policy,需确认策略未限制容器访问EC2实例5432端口的出站流量。
内容的提问来源于stack exchange,提问作者Ahmed Gad
相关产品推荐
相关产品推荐

