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

从Kubernetes集群外部访问MongoDB副本集如何仅用单个公网IP?

解决方案

你遇到的核心问题有两个:

  1. 常规7层Ingress不支持MongoDB使用的TCP四层协议,无法通过域名区分TCP流量
  2. 副本集模式下,MongoDB客户端会先从接入节点拉取副本集内部配置的节点地址列表,默认配置下该地址为K8s集群内部地址,公网环境无法访问

具体实现步骤

第一步:调整MongoDB副本集节点通告配置

修改MongoDB副本集每个节点的启动参数,将advertisedHostname设置为后续要使用的公网IP,每个节点分别配置不同的advertisedPort(例如3节点副本集分别用27017、27018、27019)。
配置完成后执行rs.conf()确认副本集配置中每个成员的host字段为公网IP:对应端口的格式,若仍为集群内部地址可手动修改配置同步到整个副本集。

第二步:配置单IP多端口四层转发

仅需为该套副本集申请1个公网IP,通过以下任意一种方式实现端口转发:

  • 方式1:创建多端口LoadBalancer服务
    为该套MongoDB副本集创建1个LoadBalancer类型的Service,配置多端口映射规则:
    • 公网IP的27017端口转发到副本集第1个Pod的27017端口
    • 公网IP的27018端口转发到副本集第2个Pod的27017端口
    • 公网IP的27019端口转发到副本集第3个Pod的27017端口
      该方案下LoadBalancer只会分配1个公网IP,符合成本要求。
  • 方式2:复用Nginx Ingress Controller的公网IP
    如果你集群已经部署了Nginx Ingress Controller,可以直接复用它的公网IP,通过修改Ingress Controller的TCP ConfigMap配置,将27017/27018/27019端口分别转发到对应MongoDB Pod的服务端口,无需额外申请公网IP。

第三步:客户端连接测试

使用如下格式的连接串访问即可正常连接副本集,支持事务功能:

mongodb://<你的用户名>:<你的密码>@<公网IP>:27017,<公网IP>:27018,<公网IP>:27019/<数据库名>?replicaSet=<你的副本集名称>&authSource=admin

也可以使用mongo命令行连接:

mongo --host "<副本集名称>/<公网IP>:27017,<公网IP>:27018,<公网IP>:27019" --authenticationDatabase admin --username <用户名> --password <密码>

扩展说明

如果有多套MongoDB副本集,只需要为每套副本集分配一组不冲突的端口即可,所有副本集可以共用同一个公网IP,进一步降低成本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:45:01