主要内容
overlay网络简介
overlay网络使不同主机上的容器可以进行通讯。虽然overlay网络的搭建非常简单,但是底层涉及的技术可能令人费解,它们包括:
- network namespaces(网络命名空间)
- VXLAN(可扩展虚拟局域网络)
- distributed key-value store(分布式键值对数据库)
其中前两个技术是把网络数据包进行封装和传输,最后一个键值对数据库则是用于保存集群信息。由于overlay用于主机间的容器通讯,因此运行容器的主机必须在一个集群环境中,集群环境的创建可以使用docker的swarm,也可以使用consul,本文使用consul。
先运行起来
实验环境包括:
- 2台Docker Host
- 1台分布式键值对数据库(consul)
结构图如下:
安装数据库
键值对数据库有多种选择,包括etcd、consul、zookeeper等,它们用于服务发现,即保存overlay网络的相关信息。这里选择使用consul容器,也可以直接安装consul软件包。
在主机1下载并运行consul容器
1 2 |
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap |
配置docker启动参数
配置主机2和主机3docker守护进程的启动参数,目的是把它们加入集群环境
1 2 3 4 5 6 7 8 |
#vim /usr/lib/systemd/system/docker.service [Service] Type=notify # the default is not to use systemd for cgroups because the delegate issues still # exists and systemd currently does not support the cgroup feature set required # for containers run by docker ExecStart=/usr/bin/dockerd --cluster-store=consul://192.168.0.222:8500 --cluster-advertise=enp2s0:3333 |
在ExecStart最后添加并设置参数--cluster-store
和--cluster-advertise
的值。前者指定数据库的IP地址信息,后者指定监听的网卡和端口。
修改完毕重启docker服务
1 2 3 |
systemctl daemon-reload systemctl restart docker |
创建overlay网络
以下命令只需要在主机1或主机2中的任意一台执行
1 2 |
docker network create --driver overlay my_ovnet |
然后使用docker network命令查看
1 2 3 4 5 6 7 8 |
[root@dellcentos7 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 217262f61082 bridge bridge local b3f488bc506d docker_gwbridge bridge local dbe591d292f5 host host local 1b462cfbf137 my_ovnet overlay global 51c12e8ab320 none null local |
除了原先的bridge、host和none网络外,多了docker_gwbridge和my_ovnet网络,其中my_ovnet的范围global表明它是一个全局网络。
由于数据库中保存了网络的信息,这些信息会自动同步到另一台主机上面,因此另一台主机现在也拥有相同的overlay网络
创建容器
创建容器并把它们加入到my_ovnet网络中,以下命令需要在两台主机中执行
1 2 3 4 5 6 |
# 主机1 docker run --name busybox1 --network my_ovnet -itd busybox # 主机2 docker run --name busybox2 --network my_ovnet -itd busybox |
然后进入其中一个容器检查网络连通性
1 2 3 4 5 6 7 8 9 10 11 |
[root@dellcentos7 ~]# docker exec -it busybox1 /bin/sh / # ping busybox2 -c 3 PING busybox2 (10.0.0.3): 56 data bytes 64 bytes from 10.0.0.3: seq=0 ttl=64 time=0.396 ms 64 bytes from 10.0.0.3: seq=1 ttl=64 time=0.382 ms 64 bytes from 10.0.0.3: seq=2 ttl=64 time=0.381 ms --- busybox2 ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 0.381/0.386/0.396 ms |
busybox1已经可以和busybox2通讯,反过来也一样。
overlay工作原理
overlay网络的核心是VXLAN。那么VXLAN是什么?
VXLAN简介
VXLAN(Virtual eXtensible LAN,可扩展虚拟局域网络)是基于IP网络、采用“MAC in UDP”封装形式的二层VPN技术。VXLAN可以基于已有的服务提供商或企业IP网络,为分散的物理站点提供二层互联,并能够为不同的租户提供业务隔离。VXLAN主要应用于数据中心网络。
通俗来说,VXLAN通过把MAC地址封装到OSI模型的第3层中,从而让处于不同网络的主机看起来像在同一个局域网,使用着相同的广播域一样,形成一个大局域网环境。
也就是说,VXLAN工作于第三层网络
VXLAN的优点
VXLAN具有如下优点:
- 支持大量的租户:使用24位的标识符,最多可支持2的24次方(16777216)个VXLAN,使支持的租户数目大规模增加,解决了传统二层网络VLAN资源不足的问题。
- 易于维护:基于IP网络组建大二层网络,使得网络部署和维护更加容易,并且可以充分地利用现有的IP网络技术,例如利用等价路由进行负载分担等;只有IP核心网络的边缘设备需要进行VXLAN处理,网络中间设备只需根据IP头转发报文,降低了网络部署的难度和费用。
VXLAN结构
VXLAN包括以下几个核心概念
- VXLAN Network Identifier (VNI)
- VXLAN Gateway
- VXLAN Tunnel End Point (VTEP)
VXLAN的核心技术是把MAC地址封装到3层的UDP包中,完整的VXLAN数据帧结构如下
注意上图中的VXLAN Header,它由64bit组成,32bit已经被使用,32bit作为保留字段。其中VNID(即VNI)是最重要的一个部分,它是一个网络ID,用于划分不同的网络,只有相同VNI中的主机可以互相通讯,一个VNI就是一个隔离域。
VXLAN中的数据通过VTEP传输,VTEP的作用是对数据进行封包和解包。当集群中的一方需要个另一方通讯,就会向集群中的主机发送广播包,这些广播包之后被发送方的VTEP封装,最后被接收方的VTEP解包,如下图所示:
针对之前的实验环境,从busybox1 ping busybox2,VXLAN数据帧中对应的数据分别是:
Original L2 Frame:
- S-MAC(busybox1): 02:42:0a:00:00:02
- D-MAC(busybox2):02:42:0a:00:00:03
- S-IP(busybox1):10.0.0.2/24
- D-IP(busybox2):10.0.0.3/24
Outer IP Header:
- S-IP(主机1):192.168.0.212
- D-IP(主机2):192.168.0.202
Outer Mac Header:
- S-MAC(主机1):02:42:58:f9:74:4f
- D-MAC(主机2):02:42:b9:3f:59:02
Docker网络命名空间
overlay网络的核心是VXLAN,但是Docker是通过什么方式使用VXLAN网络的呢?答案是network namespace。Docker会为每一个overlay网络创建一个命名空间,要查看overlay的网络空间,可以使用ip netns
命令。
1 2 3 4 5 |
ln -s /var/run/docker/netns /var/run/netns #先执行此命令 [root@dellcentos7 ~]# ip netns 4d821455471e (id: 1) 1-1b462cfbf1 (id: 0) |
1-1b462cfbf1
就是overlay网络的命名空间,它在两台主机中都存在,可以通过下面的命令查看它里面的设备
1 2 3 4 5 |
[root@dellcentos7 ~]# ip netns exec 1-1b462cfbf1 brctl show bridge name bridge id STP enabled interfaces br0 8000.6a7600df6d8a no veth0 vxlan0 |
interfaces下面的vxlan0表明它使用了VXLAN技术。下面看一下vxlan0的id是什么
1 2 3 4 5 |
[root@dellcentos7 ~]# ip netns exec 1-1b462cfbf1 ip -d link show vxlan0 18: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br0 state UNKNOWN mode DEFAULT group default link/ether b6:af:f5:30:36:18 brd ff:ff:ff:ff:ff:ff link-netnsid 0 promiscuity 1 vxlan id 256 srcport 0 0 dstport 4789 proxy l2miss l3miss ageing 300 noudpcsum noudp6zerocsumtx noudp6zerocsumrx |
可以看到vxlan的id是256
转载请注明:Pure nonsense » Docker容器之overlay网络