You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从Kubernetes集群连接DigitalOcean的MongoDB Droplet遇连接超时问题

解决Kubernetes Pod连接外部MongoDB的超时问题

你遇到的核心问题是Kubernetes Pod的出站请求并非使用LoadBalancer Service的外部IP——LoadBalancer的IP是用来接收外部流量进入集群的,而Pod发起的向外请求,默认会使用所在Node节点的公网IP,或者DigitalOcean Kubernetes集群专属的出站IP池地址,这就是为什么你只把LoadBalancer IP加入白名单后还是连接超时的原因。

完全不需要把MongoDB部署到Kubernetes集群里,下面给你几个可行的解决方案,按安全性和便捷性排序:

方案一:使用VPC内网连接(推荐,最安全)

DigitalOcean的VPC可以让你的K8s集群和MongoDB Droplet在同一个私有网络内通信,不用走公网,既安全又高效:

    1. 在DigitalOcean控制台创建一个VPC(如果还没有),然后将你的K8s集群和MongoDB Droplet都加入这个VPC;
    1. 修改MongoDB的配置,让它监听VPC内网IP(或者保持0.0.0.0但通过防火墙限制来源);
    1. 更新应用的MongoDB连接URI,把<droplet_ip>替换成Droplet的VPC内网IP;
    1. 在MongoDB Droplet的防火墙规则中,添加一条允许VPC内网CIDR段访问27017端口的规则,拒绝其他所有来源的公网请求。

这样Pod通过内网IP连接MongoDB,完全不需要暴露公网端口,安全性拉满。

方案二:添加Pod的实际出站IP到白名单

如果暂时不想配置VPC,可以先找到Pod实际的出站IP,加到MongoDB的防火墙白名单里:

方法1:直接在Pod内测试出站IP

  • 执行命令进入一个运行中的Pod(比如随便选一个和应用同环境的Pod):
    kubectl exec -it <your-pod-name> -- sh
    
  • 在Pod内执行命令获取出站公网IP:
    curl ifconfig.me
    
  • 把得到的IP地址添加到MongoDB Droplet的防火墙规则中,允许其访问27017端口。

方法2:查看DigitalOcean K8s集群的出站IP池

DigitalOcean的Kubernetes集群有固定的出站IP集合,你可以直接在控制台查看:

  • 登录DigitalOcean控制台,进入你的K8s集群页面;
  • 切换到「Networking」标签页,找到「Outbound IPs」部分,这里会列出集群所有的出站公网IP;
  • 把这些IP全部添加到MongoDB Droplet的27017端口白名单中。

补充说明

你的应用代码里的MongoDB连接配置是没问题的,问题出在网络层面的IP白名单配置错误。只要确保Pod的出站IP(或者VPC内网段)被MongoDB的防火墙允许,就能正常连接,不需要迁移MongoDB到K8s集群。

内容的提问来源于stack exchange,提问作者Vitor Bigelli

火山引擎 最新活动