k8s通过ingress(域名方式)向集群外部暴露单机mongo服务

需求:用户想要用nacicat premium之类的连接工具从k8s集群外部访问集群内布的mongo单机版数据库。
技术背景:
高校内部的四台服务器组成的单master三node k8s集群
分析需求:
因为之前用ingress成功暴露集群内部其他服务,所以想通过ingress的方式从集群内部直接暴露一台mongo给外部用户,ingress暴露服务流程即下图所示:流量流程图

尝试:
但是,当正常的编写完上述所有的ingress,service和stategulset的yaml文件后,在集群外部并不能通过域名+端口的方式连接。
反思:
老师提供建议:mongoDB通讯是建立在TCP协议基础之上,但是,ingress不能转发TCP协议的流量,需要额外配置ingress让其转发来自集群内外的TCP流量。
分析:
之后尝试成功了,下面我将贴出所成功的例子,并且和大家一起探讨他为什么成功,他的流量进来是怎么走的,是怎么通过域名一步一步到的pod内。
首先我们看statefulset和对应的service
service和statefulset的yaml

通过这个yaml文件service就能和mongo pod之间产生流量联系,来自service的TCP流量转发至mongo内。
我们再来看ingress的yaml,将ingress和上面的service联系起来:
ingress-mongo.yaml

这就完成了ingress -> service -> statefulset的流程,但是问题出就出在ingress不转发TCP流量,我们看图:
不转发TCP释义
我们设置ingress转发TCP流量:
打开ingress转发tcp步骤:
步骤①

开放一个端口用来转发TCP流量:
配置ingress的nodeport

步骤二:
查看mandatory.yaml,里面的args配置:
mandatory.yaml内容
这里有tcp-service、udp-services,这些都是configmap,我们可以通过创建这些configmap,来动态让配置生效。
下面我们写tcp-service.yaml来让tcp-service生效。
configmap的yaml
27017: "default/teach-storage:27017"的含义石将命名空间default下的teach-storage的27017端口负载到nginx-controlller的27017端口,打通了ingress controller的27017端口和service teach-storage:27017之间的TCP通道。

通过两张图看上述两个步骤操作前后对比:

没添加ingress转发tcp流量前:转发流程是这样:
没添加ingress转发tcp流量转发流程

加了tcp转发流量后:过程是这样:
添加tcp转发后
最后,就可以通过ingress暴露的域名和nodeport使用navicat进行访问,使用navicat连接,主机名:mongo.xxx.cn 端口号:8889即可连接。
本人能力有限,本文为个人理解和查阅资料所写,如有错误,欢迎批评指正。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值