从Kubernetes集群外部访问MongoDB副本集如何仅用单个公网IP?
解决方案
你遇到的核心问题有两个:
- 常规7层Ingress不支持MongoDB使用的TCP四层协议,无法通过域名区分TCP流量
- 副本集模式下,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
相关产品推荐
相关产品推荐

