Docker容器之overlay网络

docker ginotang 2873℃ 0评论

overlay网络简介

overlay网络使不同主机上的容器可以进行通讯。虽然overlay网络的搭建非常简单,但是底层涉及的技术可能令人费解,它们包括:

  • network namespaces(网络命名空间)
  • VXLAN(可扩展虚拟局域网络)
  • distributed key-value store(分布式键值对数据库)

其中前两个技术是把网络数据包进行封装和传输,最后一个键值对数据库则是用于保存集群信息。由于overlay用于主机间的容器通讯,因此运行容器的主机必须在一个集群环境中,集群环境的创建可以使用docker的swarm,也可以使用consul,本文使用consul。

先运行起来

实验环境包括:

  • 2台Docker Host
  • 1台分布式键值对数据库(consul)

结构图如下:

docker overlay network

docker overlay network

安装数据库

键值对数据库有多种选择,包括etcd、consul、zookeeper等,它们用于服务发现,即保存overlay网络的相关信息。这里选择使用consul容器,也可以直接安装consul软件包。

在主机1下载并运行consul容器

配置docker启动参数

配置主机2和主机3docker守护进程的启动参数,目的是把它们加入集群环境

在ExecStart最后添加并设置参数--cluster-store--cluster-advertise的值。前者指定数据库的IP地址信息,后者指定监听的网卡和端口。

修改完毕重启docker服务

创建overlay网络

以下命令只需要在主机1或主机2中的任意一台执行

然后使用docker network命令查看

除了原先的bridge、host和none网络外,多了docker_gwbridge和my_ovnet网络,其中my_ovnet的范围global表明它是一个全局网络。

由于数据库中保存了网络的信息,这些信息会自动同步到另一台主机上面,因此另一台主机现在也拥有相同的overlay网络

创建容器

创建容器并把它们加入到my_ovnet网络中,以下命令需要在两台主机中执行

然后进入其中一个容器检查网络连通性

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 packet format

vxlan packet format

注意上图中的VXLAN Header,它由64bit组成,32bit已经被使用,32bit作为保留字段。其中VNID(即VNI)是最重要的一个部分,它是一个网络ID,用于划分不同的网络,只有相同VNI中的主机可以互相通讯,一个VNI就是一个隔离域。

VXLAN中的数据通过VTEP传输,VTEP的作用是对数据进行封包和解包。当集群中的一方需要个另一方通讯,就会向集群中的主机发送广播包,这些广播包之后被发送方的VTEP封装,最后被接收方的VTEP解包,如下图所示:

vxlan vtep

vxlan 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-1b462cfbf1就是overlay网络的命名空间,它在两台主机中都存在,可以通过下面的命令查看它里面的设备

interfaces下面的vxlan0表明它使用了VXLAN技术。下面看一下vxlan0的id是什么

可以看到vxlan的id是256

转载请注明:Pure nonsense » Docker容器之overlay网络

喜欢 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x