docker swarm (三):overlay与docker_gwbridge网络详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker swarm (三):overlay与docker_gwbridge网络详解相关的知识,希望对你有一定的参考价值。

参考技术A 本文通过实验,帮助大家认识docker swarm中的overlay和docker_gwbridge网络。

先建立两台物理机组成的docker swarm网络(方法可见 《docker swarm(一): 入门,搭建一个简单的swarm集群》 ):

创建一个overlay网络。

当前建立的docker相关的网络有:

这里关注两个网络:

我们知道,docker是基于namespace,划分了网络空间。这里先准备一段脚本,由于在各个namespece中,执行对应的网络命令。

它可以查看有哪些namespace:

还可以在指定的namespace下执行命令:

第二个工具,find_links.sh

这个脚本可以根据ifindex查找接口所在的namespace。

以下,我们通过实验,了解一下overlay网络与docker_gwbridge网络。

我们现在在两个nodes上都创建容器:

在容器的环境下,查看一下网络连接:

我们发现,除了回环口外,还有两个接口。10.200.0.2/16即是容器busybox在overlay_test网络上的接口的IP地址。172.18.0.3/16是容器busybox在docker_gwbridge网络上的接口的IP地址。

到目前为止,我们看到的容器网络是这样的。我们只看到了网络地址,还不知道它们间的报文是如何交互的。(192.168.154.2是宿主机的网关)

我们尝试从容器内跟踪访问外部IP的路由

可见,流量经过172.18.0.1,然后访问到宿主机网关上。

接下来,我们尝试解析出内部网络连接。上面我们已经得知,从容器内部的视角,172.18.0.3所在的接口为:61: eth1@if62。我们可以理解为,此接口的ifindex为61,通过veth连接到ifindex为62的接口上。

我们查找看看62接口的namespace是:

居然没有显示。这就说明62接口是在宿主机的主namespace中的。我们在宿主机上看看:

可见,62接口的master是docker_gwbridge。也就是说,62接口被桥接到docker_gwbridge中。

南北向流量在经过宿主机出口时,还做了NAT转换

于是,南北向的流量走向就很清晰了。我们的网络拓扑可以更新为:

东西向流量即容器与容器间的流量。我们先测试一下容器间的连通性。

接下来探索这个流量是怎么走的。我们再看一下容器中的网络配置。

10.200.0.2所在的接口为,59: eth0@if60。即本接口ifindex为59,连接到ifindex为60的接口上。我们查询一下60接口所在的namespaec。

可见60接口处于1-hxyiridl2b这一namespace中。

在这个namespace中,有一个vxlan出口。docker overlsy就是通过overlay隧道与其它容器通信的。

两个容器虽然是通过vxlan隧道通信,但容器内部却不感知。它们只能看到两个容器处于同一个二层网络中。由vxlan接口将二层报文封装在UDP报文的payload中,发到对端,再由对端的vxlan接口解封装。

我们查看一下namespace 1-hxyiridl2b中的arp地址表:

我们可以看到,远端node中的容器IP 10.200.0.4,有体现在本端的arp地址表中。即是通过查找此表,得到对端的二层地址。

我们再来看看,vxlan报文的出口在哪里:

这可以理解为VxLAN的VTEP表,即根据MAC地址,查找出VxLAN报文应该封装的外层IP,是192.168.154.136

我们可以画出东西向流量的完整的拓扑了:

Docker Swarm 环境搭建

Docker Swarm 环境搭建

swarm 使用前提

1、Docker版本1.12+

Docker升级教程:https://www.cnblogs.com/xiangsikai/p/9935894.html

2、集群节点之间保证如下端口通信:

TCP 2377(管理节点与集群模式的通信manager与worker)

TCP/UDP 7946(节点之前其他数据的传输)

UDP 4789(overlay网络通信)


节点规划

  • 系统:Centos 7.4 x64
  • 应用版本:Docker 18.09.0
  • 管理节点:192.168.1.79
  • 工作节点:192.168.1.78
  • 工作节点:192.168.1.77

环境部署

1、管理节点:初始化swarm

docker swarm init --advertise-addr 192.168.1.79

2、管理节点:截取输出内容

Swarm initialized: current node (mcoe3f7kit5o60gp7v2f6wjc9) is now a manager.
To add a worker to this swarm, run the following command:

# 如果要添加工作节点就复制下面命令到工作节点并执行
docker swarm join --token SWMTKN-1-5lfs200tcund6wwnewmwk4jc5wjqso4nj9zb7nykvrsmwy08me-atei4s350szwknfbbn7jzhrpm 192.168.1.79:2377

To add a manager to this swarm, run docker swarm join-token manager and follow the instructions.

3、工作节点1与2:加入swarm

docker swarm join --token SWMTKN-15lfs200tcund6wwnewmwk4jc5wjqso4nj9zb7nykvrsmwy08me-atei4s350szwknfbbn7jzhrpm 192.168.1.79:2377
技术分享图片
#  已加入到工作节点
This node joined a swarm as a worker.
输出

4、管理节点:查看集群中的节点(完成部署)

docker node ls
技术分享图片
ID                           HOSTNAME    STATUS  AVAILABILITY  MANAGER STATUS
bmlecoeitwsbf1r6skpmiq6m5    slave01     Ready   Active        
kqkwgx5d87nt2mo42263r0dkj    slave02     Ready   Active        
mcoe3f7kit5o60gp7v2f6wjc9 *  management  Ready   Active        Leader
输出

 

以上是关于docker swarm (三):overlay与docker_gwbridge网络详解的主要内容,如果未能解决你的问题,请参考以下文章

Docker Swarm 创建overlay网络

Docker Swarm 创建overlay网络

Docker swarm中的LB和服务发现详解

Docker Swarm 环境搭建

Docker Swarm集群部署防火墙开放端口

Docker Overlay 应用部署