20、《每天5分钟玩转Docker容器技术》学习--macvlan Network
------------------------------------重要说明------------------------------------本文内容都是参考Cloudman系列进行学习,是个人学习过程记录,与原版不同!
原版请参考cloudman《每天5分钟玩转Docker容器技术》Cloudman博客如下:
https://blog.运维网.com/cloudman
------------------------------------重要说明------------------------------------
macvlan 本身是 linxu kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址,即多个 interface,每个 interface 可以配置自己的 IP。macvlan 本质上是一种网卡虚拟化技术,Docker 用 macvlan 实现容器网络就不奇怪了。
macvlan 的最大优点是性能极好,相比其他实现,macvlan 不需要创建 Linux bridge,而是直接通过以太 interface 连接到物理网络。下面我们就来创建一个 macvlan 网络。
a) 实验环境描述
l Docker host(Ubuntu02) 192.168.56.130
https://s1.运维网.com/images/20180414/1523697615861610.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
l Docker host(Ubuntu03) 192.168.56.128
https://s1.运维网.com/images/20180414/1523697625212715.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
b) 环境准备
使用 docker02 和 docker03 上单独的网卡 ens33 创建 macvlan。为保证多个 MAC 地址的网络包都可以从 ens33 通过,我们需要打开网卡的混杂模式。
ip link set ens33promisc on
确保 ens33 状态 UP 并且 promisc 模式已经生效
https://s1.运维网.com/images/20180414/1523697635729294.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180414/1523697643392775.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180414/1523697652690561.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
1) Workstation promisc
如果使用的是workstation for linux做实验,开启workstation网卡的混杂模式promisc;
1.将当前的虚拟机都关闭,退出workstation;
2.查看host中的vmnet;
ls -l /dev/vmnet*
3.更改vmnet权限;
chmod a+rw /dev/vmnet*
4.启动workstation;
2) Virtualbox promisc
https://s1.运维网.com/images/20180414/1523697683444458.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
c) 创建macvlan
在 docker02 和 docker03 中创建 macvlan 网络 mac_net1:
https://s1.运维网.com/images/20180414/1523697692934733.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
这里使用的网关是ens33网卡的IP地址;
https://s1.运维网.com/images/20180414/1523697700921277.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
这里使用的网关是ens33网卡的IP地址;
注意:在 host2 中也要执行相同的命令。
① -d macvlan 指定 driver 为 macvlan。
② macvlan 网络是 local 网络,为了保证跨主机能够通信,用户需要自己管理 IP subnet。
③ 与其他网络不同,docker 不会为 macvlan 创建网关,这里的网关应该是真实存在的,否则容器无法路由。
④ -o parent 指定使用的网络 interface。
在 docker02 中运行容器 bbox1 并连接到 mac_net1
https://s1.运维网.com/images/20180414/1523697712942385.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
由于 docker02 中的 mac_net1 与 docker03 中的 mac_net1 本质上是独立的,为了避免自动分配造成 IP 冲突,我们最好通过 --ip 指定 bbox1 地址为 172.16.56.151。
在 docker03 中运行容器 bbox2,指定 IP 172.16.56.152。
https://s1.运维网.com/images/20180414/1523697719716201.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
d) 连通测试
1) 验证 bbox1 和 bbox1 的连通性
https://s1.运维网.com/images/20180414/1523697728576747.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
看到bbox1可以ping同bbox2的IP地址,那测试ping主机名,验证是否能够解析:
https://s1.运维网.com/images/20180414/1523697737921908.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
可见 docker 没有为 macvlan 提供 DNS 服务,这点与 overlay 网络是不同的。
2) 验证 bbox 和 docker02 docker03主机的连通性
bbox1在docker02主机(192.168.56.130)
https://s1.运维网.com/images/20180414/1523697748422269.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180414/1523697756927517.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
Bbox2在docker03主机(192.168.56.128)
https://s1.运维网.com/images/20180414/1523697770954849.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180414/1523697776939118.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
3) 验证与互联网的连通性
https://s1.运维网.com/images/20180414/1523697786385071.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180414/1523697796317787.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
重新创建macvlan网络,使用host的网关地址,测试是否可以与互联网通信
将创建的之前创建的container和network删除
l 创建网络
https://s1.运维网.com/images/20180414/1523697805699291.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
这里使用的网关是host(docker02、docker03)的网关地址;
https://s1.运维网.com/images/20180414/1523697814209855.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
这里使用的网关是host(docker02、docker03)的网关地址;
l 运行容器在macvlan网络
https://s1.运维网.com/images/20180414/1523697825391671.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180414/1523697830219641.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
bbox1的IP:192.168.56.151bbox2的IP:192.168.56.152
l 测试连通性
https://s1.运维网.com/images/20180414/1523697839818628.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180414/1523697849343204.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
容器之间可以ping通;
https://s1.运维网.com/images/20180414/1523697857922167.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180414/1523697864654391.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
对方主机可以ping通;
https://s1.运维网.com/images/20180414/1523697872122755.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180414/1523697878271286.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
可以ping通www.baidu.com
https://s1.运维网.com/images/20180414/1523697887462250.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180414/1523697892974552.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
容器所在host的ip,无法ping通
https://s1.运维网.com/images/20180414/1523697901600212.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180414/1523697907666981.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
不具备DNS解析功能,ping hostname无法解析;
e) macvlan网络结构分析
macvlan 不依赖 Linux bridge,brctl show 可以确认没有创建新的 bridge。
https://s1.运维网.com/images/20180414/1523697917996704.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180414/1523697923276782.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
查看一下容器的网络设备:
l docker02
https://s1.运维网.com/images/20180414/1523697931940044.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
l docker03
https://s1.运维网.com/images/20180414/1523697940833932.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
除了 lo,容器只有一个 eth0,请注意 eth0 后面的 @if4,这表明该 interface 有一个对应的 interface,其全局的编号为4。根据 macvlan 的原理,我们有理由猜测这个 interface 就是主机的 ens33,确认如下:
https://s1.运维网.com/images/20180414/1523697948971118.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://blog.运维网.com/static/js/ueditor1.4.3/themes/default/images/spacer.gif
可见,容器的 eth0 就是 ens33 通过 macvlan 虚拟出来的 interface。容器的 interface 直接与主机的网卡连接,这种方案使得容器无需通过 NAT 和端口映射就能与外网直接通信(只要有网关),在网络上与其他独立主机没有区别。当前网络结构如图所示(引用cloudman博客中图):
https://s1.运维网.com/images/20180414/1523697987873185.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
f) 用 sub-interface 实现多 macvlan 网络
macvlan 会独占主机的网卡,也就是说一个网卡只能创建一个 macvlan 网络,否则会报错:
https://s1.运维网.com/images/20180414/1523697998668571.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
但主机的网卡数量是有限的,如何支持更多的 macvlan 网络呢?
好在 macvlan 不仅可以连接到 interface(如 ens33),也可以连接到 sub-interface(如 ens33.xxx)。
VLAN 是现代网络常用的网络虚拟化技术,它可以将物理的二层网络划分成多达 4094 个逻辑网络,这些逻辑网络在二层上是隔离的,每个逻辑网络(即 VLAN)由 VLAN ID 区分,VLAN ID 的取值为 1-4094。
1) 安装VLAN
Linux 的网卡也能支持 VLAN(apt-get install vlan),同一个 interface 可以收发多个 VLAN 的数据包,不过前提是要创建 VLAN 的 sub-interface。
https://s1.运维网.com/images/20180414/1523698011496246.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
2) 配置VLAN接口
比如希望 ens33 同时支持 VLAN10 和 VLAN20,则需创建 sub-interface ens33.10 和 ens33.20。
在交换机上,如果某个 port 只能收发单个 VLAN 的数据,该 port 为 Access 模式,如果支持多 VLAN,则为 Trunk 模式,所以接下来实验的前提是:
ens33 要接在交换机的 trunk 口上。不过我们用的是 workstation/VirtualBox 虚拟机,则不需要额外配置了。
下面演示如何在 ens33.10 和 ens33.20 上创建 macvlan 网络。
首先编辑 docker02 和 docker03 的 /etc/network/interfaces,配置 sub-interface
https://s1.运维网.com/images/20180414/1523698021413030.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
然后启用 sub-interface
systemctl restart networking.service
https://s1.运维网.com/images/20180414/1523698029789191.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
配置docker02主机vlan10接口(ens33.10)的macvlan网络
https://s1.运维网.com/images/20180414/1523698038734836.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
配置docker02主机vlan20接口(ens33.20)的macvlan网络
https://s1.运维网.com/images/20180414/1523698046939987.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
配置docker03主机vlan10接口(ens33.10)的macvlan网络
https://s1.运维网.com/images/20180414/1523698053651164.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
配置docker03主机vlan20接口(ens33.20)的macvlan网络
https://s1.运维网.com/images/20180414/1523698060385278.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
配置docker02主机vlan10的容器(172.16.10.11)
https://s1.运维网.com/images/20180414/1523698069845134.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
配置docker02主机vlan20的容器(172.16.20.11)
https://s1.运维网.com/images/20180414/1523698077244593.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
配置docker03主机vlan10的容器(172.16.10.12)
https://s1.运维网.com/images/20180414/1523698083331371.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
配置docker03主机vlan20的容器(172.16.20.12)
https://s1.运维网.com/images/20180414/1523698091889473.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180414/1523698097417418.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
3) sub-interface连通性测试
https://s1.运维网.com/images/20180414/1523698107587233.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
https://s1.运维网.com/images/20180414/1523698115760616.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
bbox1 能 ping 通 bbox2,bbox3 能 ping 通 bbox4。即:同一 macvlan 网络能通信。
bbox1 无法 ping 通 bbox3 和 bbox4。即:不同 macvlan 网络之间不能通信。但更准确的说法应该是:不同 macvlan 网络不能 在二层上 通信。在三层上可以通过网关将 macvlan 连通,下面我们就启用网关。
将 Host 192.168.56.130 配置成一个虚拟路由器,设置网关并转发 VLAN10 和 VLAN20 的流量。当然也可以使用物理路由器达到同样的效果。首先确保操作系统 IP Forwarding 已经启用。
https://s1.运维网.com/images/20180414/1523698129216767.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
输出为 1 则表示启用,如果为 0 可通过如下命令启用:
sysctl -w net.ipv4.ip_forward=1
------------------------------------重要说明------------------------------------
本文内容都是参考Cloudman系列进行学习,是个人学习过程记录,与原版不同!
原版请参考cloudman《每天5分钟玩转Docker容器技术》Cloudman博客如下:
https://blog.运维网.com/cloudman
------------------------------------重要说明------------------------------------
书籍:
1.《每天5分钟玩转Kubernetes》
https://item.jd.com/26225745440.html
2.《每天5分钟玩转Docker容器技术》
https://item.jd.com/16936307278.html
3.《每天5分钟玩转OpenStack》
https://item.jd.com/12086376.html
https://i.imgsafe.org/68/68da21ce15.png
页:
[1]