基于SpringCloud开发的微服务在Docker Swarm集群中跨Host主机通信的一种解决方案

一、前言

        当我们开发好微服务(笔者是基于SpringCloud开发的微服务)之后,考虑到灵活快速持续部署的需要,通常会考虑将其Docker镜像化并在Docker环境下运行。由于微服务个数通常会较多,把所有微服务部署在一台docker主机上是不现实的,因此需要考虑到跨主机通信的问题,对实际部署必然会提出以下几点要求:
        1. 微服务作为一个docker container可以在任意host上运行;
        2. 同一host上可以运行多个相同的微服务;
        3. 运行在同一个host上的微服务之间可以相互通信;
        4. 运行在不同host上的微服务也可以相互通信;
        5. 每个微服务的ip地址不受host所在本地局域网ip地址段限制,即拥有独立网段,避免占用本地IP地址,同时确保container数量受限尽量小;
        6. 每个微服务container避免通过端口暴露的方式相互通信,确保不会因端口独占而导致无法灵活部署。
 
        综上原因,笔者研究并采用在docker swarm模式下将各微服务加入同一个overlay network网络的方式实现微服务之间的相互通信。

二、总体架构图

        

       说明:

 

  • 如图所示,假设本地局域网段10.159.62.0/24中存在主机10.159.62.231,10.159.62.232和10.159.62.233互联互通
  • 每个主机上都运行dockerengine,通过docker engine运行若干个docker container,例如图中的Order,Billing等等。
  • 将这3台主机建立成为一个dockerswarm集群
  • 创建一个docker overlay网络(网段10.10.0.0/24),每个主机上的container都被加入到该overlay网络中,通过overlay网络实现跨主机的container相互通信
  • 假设console,terminal和api这三个服务均需要暴露端口到物理网络,因为物理网络10.159.62.0/24无法直接访问overlay网络中的container,需要container中映射端口到物理网络。
  • overlay网络中的container默认通过与主机之间的bridge访问物理网络。

 

三、创建Swarm 集群

        1.  在主机23 1 上创建管理节点
     $ docker swarm init --advertise-addr 10.159.62.231
        

        执行完会显示token,例如SWMTKN-1-0t7yro4d6rtkn6eecw58od4m18lswr181k9z028x219q3cxlsg-366f5j9x1fuvo7jnxwa7bxz0z

        创建工作节点时需要引用该token,Manager和Worker节点之间通信端口是2377

        
    2. 在主机232上创建工作节点
    $ docker swarm join -- token SWMTKN-1-0t7yro4d6rtkn6eecw58od4m18lswr181k9z028x219q3cxlsg-366f5j9x1fuvo7jnxwa7bxz0z 10.159.62.231:2377
 
   3.在主机231上创建工作节点
   $ docker swarm join --token SWMTKN-1-0t7yro4d6rtkn6eecw58od4m18lswr181k9z028x219q3cxlsg-366f5j9x1fuvo7jnxwa7bxz0z 10.159.62.231:2377

四、构建Overlay network

       在管理节点主机231上执行
       
$ docker network create -d overlay \
  --subnet=10.10.0.0/16 \
  --gateway=10.10.0.254 \
  --attachable=true \
overlay

五、部署服务

根据上文架构图中所示分别在各主机上执行类似的命令,将各微服务docker container启动起来。
对于不需要暴露端口的微服务,命令类似如下
$ docker run --name order --network=overlay 10.159.62.231/somecom/order:1.0.0 &

对于需要暴露端口的微服务,命令类似如下:

$ docker run --name -p 9769:8769 api --network=overlay 10.159.62.231/somecom/api:1.0.0 &

六、验证测试

由于对于读者而言并不知道文中各微服务之间的关系,所以不从服务调用方面测试微服务之间可达,而通过代表各微服务的docker container间的ping ip的方式测试验证。
 
1. 查看231上已经启动的container
$ docker ps
CONTAINER ID        IMAGE                                                                                COMMAND                  CREATED             STATUS              PORTS                                            NAMES
585c46f5f8fb        10.159.62.231/somecom/console:3.0.0                "/bin/sh -c 'java ..."    5 hours ago         Up 5 hours          22/tcp, 0.0.0.0:9086->8086/tcp   console
10e61f6fe11e        10.159.62.231/somecom/terminal:3.0.0               "/bin/sh -c 'java ..."   5 hours ago         Up 5 hours          22/tcp, 0.0.0.0:9088->8088/tcp   terminal
 
2. 查看其中console的overlay network ip地址
$ docker inspect -f {{.NetworkSettings.Networks.overlay.IPAMConfig.IPv4Address}} 585c46f5f8fb
10.10.0.2
 
3. 查看232上已经启动的container
CONTAINER ID        IMAGE                                                          COMMAND                  CREATED             STATUS              PORTS                            NAMES
31411d3g33g1       10.159.62.231/somecom/sso:3.0.0        "/bin/sh -c 'java ..."   5 days ago          Up 5 days           22/tcp, 8085/tcp                  sso
151f48b3130b        10.159.62.231/somecom/api:3.0.0        "/bin/sh -c 'java ..."    5 days ago          Up 5 days           0.0.0.0:9769->8769/tcp      api
 
4. 查看api对应的pid
$ docker inspect -f {{.State.Pid}} 31411d3g33g1
22256
 
5. 进入container,ping 10.10.0.2
$ nsenter --target 22256 --mount --uts --ipc --net --pid
root@585c46f5f8fb:/#   ping 10.10.0.2
64 bytes from 10.10.0.2: icmp_seq=0 ttl=64 time=0.049 ms
64 bytes from 10.10.0.2: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from 10.10.0.2: icmp_seq=2 ttl=64 time=0.042 ms
64 bytes from 10.10.0.2: icmp_seq=3 ttl=64 time=0.055 ms
 
至此,验证跨主机的container之间通过overlay network互联成功。
 

本文为笔者原创,转载请注明出处。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值