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

通过SSH隧道连接CNPG PostgreSQL数据库遇连接拒绝问题求助

问题分析

你在私有Kubernetes环境用CloudNativePG部署了3实例PostgreSQL集群,配置中禁用了默认的只读服务(disabledDefaultServices: ["r"])。尝试通过SSH隧道结合Kubernetes端口转发连接只读副本时,出现connection refused错误,且端口转发丢失连接;但服务器本地能正常通过Pod Shell查询数据,也能telnet通本地5432端口。

解决方案

以下是针对性的排查和修复步骤:

1. 修正SSH隧道命令的参数顺序

你的SSH命令参数顺序错误,-v( verbose模式)应放在选项位置,-L的格式为本地端口:目标地址:目标端口。正确命令:

ssh -v -L 5432:localhost:5432 username@hostname

原命令将-v放在-L之后,导致SSH无法正确解析端口转发规则,这是连接拒绝的直接原因之一。

2. 确保Kubernetes端口转发的目标正确

由于你禁用了默认的只读服务(pgsql-cluster-r),需先确认端口转发的目标是有效的只读Pod或自定义服务:

  • 查找集群中的只读Pod:
    kubectl get pods -n database -l role=readonly
    
  • 针对找到的只读Pod启动端口转发(需保持该命令后台运行,可加&或用终端多窗口):
    kubectl port-forward -n database pgsql-cluster-1 5432:5432
    
    注:将pgsql-cluster-1替换为实际的只读Pod名称。

3. 检查服务器本地端口的监听状态

用以下命令确认5432端口确实被Kubernetes端口转发进程监听:

netstat -tulpn | grep 5432

如果输出中不是kubectl进程,说明端口被其他服务占用,可更换端口:

  • 调整端口转发命令:
    kubectl port-forward -n database pgsql-cluster-1 5433:5432
    
  • 对应修改SSH隧道命令:
    ssh -v -L 5433:localhost:5433 username@hostname
    

4. 恢复默认只读服务(可选,长期使用场景)

如果需要长期使用只读副本服务,可移除Cluster配置中的disabledDefaultServices: ["r"]:
修改后的Cluster配置片段:

apiVersion: postgresql.cnpg.io/v1
kind: Cluster
metadata:
  name: pgsql-cluster
  namespace: database
spec:
  instances: 3
  managed:
    services:
      # 移除disabledDefaultServices配置项
  storage:
    size: 1Gi

应用配置:

kubectl apply -f your-cluster-config.yaml -n database

之后可直接端口转发到自动创建的只读服务:

kubectl port-forward -n database svc/pgsql-cluster-r 5432:5432

5. 验证SSH服务器的端口转发权限

检查服务器的sshd_config配置,确保允许TCP转发:

grep -E "AllowTcpForwarding" /etc/ssh/sshd_config

如果输出不是AllowTcpForwarding yes,修改配置后重启sshd服务:

echo "AllowTcpForwarding yes" >> /etc/ssh/sshd_config
systemctl restart sshd

内容的提问来源于stack exchange,提问作者Jeppe Christensen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 00:58:22