k8s通过ingress(域名方式)向集群外部暴露单机mongo服务
需求:用户想要用nacicat premium之类的连接工具从k8s集群外部访问集群内布的mongo单机版数据库。技术背景:高校内部的四台服务器组成的单master三node k8s集群分析需求:因为之前用ingress成功暴露集群内部其他服务,所以想通过ingress的方式从集群内部直接暴露一台mongo给外部用户,ingress暴露服务流程即下图所示:尝试:但是,当正常的编写完上述所有的ing
需求:用户想要用nacicat premium之类的连接工具从k8s集群外部访问集群内布的mongo单机版数据库。
技术背景:
高校内部的四台服务器组成的单master三node k8s集群
分析需求:
因为之前用ingress成功暴露集群内部其他服务,所以想通过ingress的方式从集群内部直接暴露一台mongo给外部用户,ingress暴露服务流程即下图所示:
尝试:
但是,当正常的编写完上述所有的ingress,service和stategulset的yaml文件后,在集群外部并不能通过域名+端口的方式连接。
反思:
老师提供建议:mongoDB通讯是建立在TCP协议基础之上,但是,ingress不能转发TCP协议的流量,需要额外配置ingress让其转发来自集群内外的TCP流量。
分析:
之后尝试成功了,下面我将贴出所成功的例子,并且和大家一起探讨他为什么成功,他的流量进来是怎么走的,是怎么通过域名一步一步到的pod内。
首先我们看statefulset和对应的service:
通过这个yaml文件service就能和mongo pod之间产生流量联系,来自service的TCP流量转发至mongo内。
我们再来看ingress的yaml,将ingress和上面的service联系起来:
这就完成了ingress -> service -> statefulset的流程,但是问题出就出在ingress不转发TCP流量,我们看图:
我们设置ingress转发TCP流量:
打开ingress转发tcp步骤:
步骤①
开放一个端口用来转发TCP流量:
步骤二:
查看mandatory.yaml,里面的args配置:
这里有tcp-service、udp-services,这些都是configmap,我们可以通过创建这些configmap,来动态让配置生效。
下面我们写tcp-service.yaml来让tcp-service生效。
27017: "default/teach-storage:27017"的含义石将命名空间default下的teach-storage的27017端口负载到nginx-controlller的27017端口,打通了ingress controller的27017端口和service teach-storage:27017之间的TCP通道。
通过两张图看上述两个步骤操作前后对比:
没添加ingress转发tcp流量前:转发流程是这样:
加了tcp转发流量后:过程是这样:
最后,就可以通过ingress暴露的域名和nodeport使用navicat进行访问,使用navicat连接,主机名:mongo.xxx.cn 端口号:8889即可连接。
本人能力有限,本文为个人理解和查阅资料所写,如有错误,欢迎批评指正。
更多推荐
所有评论(0)