在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
场景公司微服务快上线了,微服务都是用Docker容器进行部署的,在同一台主机下,把服务都部署上,注册到Nacos的IP与PORT都是内网的IP与Dockerfile中定义的端口号,看起来好像也没什么问题,通过网关去调用也是可以调通的,请注意这有一个大前提: 必须把所有服务容器部署在同一台主机上时才可以! 当服务实例没有部署在同一主机上,比如网关服务在A服务器,服务a在B服务器上,同样注册到Nacos (或其它注册中心) ,此时上报上来的都是内网的IP,那么当外部有请求进来的时候,网关通过Nacos的服务列表,找到了对应的服务a的内网IP,一调用发现调用不通 ps:内网怎么会通…… 任务微服务容器可以不在同一台服务器上,互相调用 想法
分析以下分别按上边的“想法”部分来进行说明下问题 1.翻遍官方文档与Github,得出的方案又有两个:
2.使用Docker的Host网络模式,你会发现IP这回上报的的确是宿主机IP,但是端口号不对啊……如果自己去通过shell使用Java参数传入待映射的端口号的话,这种情况理论上是可行的,唯一缺点是 3.映射端口号可以获取,但是主机的网卡名称不同,写死后不灵活,如果有的是 4.通过一些成熟的Docker容器网络共享,但是会有一定的性能损耗 ——完全可用 概念与选型最稳妥的办法——使用Docker网络共享,在搜索引擎的帮助下,我决定用Overlay的方式来实现效果 以下简单说下Overlay:
想要实现Overlay网络,需要引入一个K-V数据库,来保存网络状态信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都是 Docker 支持的K-V数据库 我们这里使用 Consul,相比其它K-V数据库,Consul提供的界面化方便管理,所以这里使用Consul实现Overlay 通过让每个服务器的Docker daemon将自己的IP注册到Consul中,来共享Docker内网,这里共享的内网是Overlay网络模式的,也只有在注册的Docker环境下使用同overlay网络的容器,才能互相通讯 ps: 创建完成后,不使用overlay网络的跨服务器容器,不能ping通 小试身手单节点的Consul实现Overlay网络,使用Docker镜像 环境说明
|
服务器OS | 主机IP | Docker版本 | 网卡名 |
---|---|---|---|
Ubuntu Server 18.04 LTS | 192.168.87.133 | 18.09.6 | ens33 |
Ubuntu Server 18.04 LTS | 192.168.87.139 | 18.09.7 | ens33 |
本测试环境适用于Systemd管理的Linux发行版
Consul没有使用非官方的progrium/consul,主要是因为这个镜像实在太老了,四年前的如果有漏洞也没能及时修复,所以自己去<hub.docker.com>去趟了遍官方的坑!
请发表评论