当前位置:   article > 正文

主机overlay和网络overlay_docker swarm(三) overlay与docker_gwbridge网络详解

docker ingress gwbridge

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

实验环境搭建

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

  1. $ docker node ls
  2. ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
  3. 43k0p9fnwu9dhsyr0n6utfynn * ubuntu Ready Active Leader 19.03.5
  4. gorkh8cb5ylb7szzbbrp2sheu ubuntu-2 Ready Active 19.03.5

创建一个overlay网络。

docker network create -d overlay --attachable --subnet 10.200.0.0/16 overlay_test

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

  1. local
  2. 5e1880193fbf docker_gwbridge bridge

这里关注两个网络:

  • overlay_test:overlay网络,实现容器间东西向流量的网络。
  • docker_gwbridge: 容器收发南北向报文的网络。

工具准备

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

#!/bin/bash 

它可以查看有哪些namespace:

  1. $ sudo ./docker_netns.sh
  2. 1-k2rx924tgr
  3. eab3f856fe9a
  4. ingress_sbox

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

65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 

第二个工具,find_links.sh

#!/bin/bash 

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

  1. 60
  2. 1-hxyiridl2b:
  3. 60: veth1@if59: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu

网络结构分析

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

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

36000

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

  1. exec busybox ip addr
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu

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

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

1d5d5f521af94b0c3ac574b719047f1c.png

南北向流量

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

  1. exec busybox traceroute baidu.com
  2. traceroute to baidu.com

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

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

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

62

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

65536 qdisc noqueue state UNKNOWN group default qlen 

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

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

| grep -- 

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

d11ce50a0084c6e73f61da9f111164d4.png

东西向流量

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

  1. exec busybox ping 10.200.0.2
  2. PING 10.200.0.2

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

  1. exec busybox ip addr
  2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu

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

  1. 60
  2. 1-hxyiridl2b:
  3. 60: veth1@if59: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu

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

65536 qdisc noqueue state UNKNOWN group default qlen 

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

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

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

  1. $ sudo ./docker_netns.sh 1-hxyiridl2b ip neigh
  2. 10.200.0.5 dev vxlan0 lladdr 02:42:0a:c8:00:05 PERMANENT
  3. 10.200.0.4 dev vxlan0 lladdr 02:42:0a:c8:00:04 PERMANENT

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

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

  1. 0 self permanent
  2. 02:42:0a:c8:00:04 dev vxlan0 dst 192.168.154.136 link-netnsid

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

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

1cf0561539e53e5af4c0dd44aef3fa0c.png
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/119991
推荐阅读
相关标签
  

闽ICP备14008679号