设为首页 收藏本站
查看: 805|回复: 0

[经验分享] 20、《每天5分钟玩转Docker容器技术》学习--macvlan Network

[复制链接]

尚未签到

发表于 2019-2-22 06:33:36 | 显示全部楼层 |阅读模式
  ------------------------------------重要说明------------------------------------
  本文内容都是参考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

  l Docker host(Ubuntu03) 192.168.56.128

b) 环境准备
  使用 docker02 和 docker03 上单独的网卡 ens33 创建 macvlan。为保证多个 MAC 地址的网络包都可以从 ens33 通过,我们需要打开网卡的混杂模式。
  ip link set ens33promisc on
  确保 ens33 状态 UP 并且 promisc 模式已经生效



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

c) 创建macvlan
  在 docker02 和 docker03 中创建 macvlan 网络 mac_net1:

  这里使用的网关是ens33网卡的IP地址;

  这里使用的网关是ens33网卡的IP地址;
  注意:在 host2 中也要执行相同的命令。
  ① -d macvlan 指定 driver 为 macvlan。
  ② macvlan 网络是 local 网络,为了保证跨主机能够通信,用户需要自己管理 IP subnet。
  ③ 与其他网络不同,docker 不会为 macvlan 创建网关,这里的网关应该是真实存在的,否则容器无法路由。
  ④ -o parent 指定使用的网络 interface。
  在 docker02 中运行容器 bbox1 并连接到 mac_net1

  由于 docker02 中的 mac_net1 与 docker03 中的 mac_net1 本质上是独立的,为了避免自动分配造成 IP 冲突,我们最好通过 --ip 指定 bbox1 地址为 172.16.56.151。
  在 docker03 中运行容器 bbox2,指定 IP 172.16.56.152。

d) 连通测试
1) 验证 bbox1 和 bbox1 的连通性

  看到bbox1可以ping同bbox2的IP地址,那测试ping主机名,验证是否能够解析:

  可见 docker 没有为 macvlan 提供 DNS 服务,这点与 overlay 网络是不同的。
2) 验证 bbox 和 docker02 docker03主机的连通性
  bbox1在docker02主机(192.168.56.130)


  Bbox2在docker03主机(192.168.56.128)


3) 验证与互联网的连通性


  重新创建macvlan网络,使用host的网关地址,测试是否可以与互联网通信
  将创建的之前创建的container和network删除
  l 创建网络

  这里使用的网关是host(docker02、docker03)的网关地址;

  这里使用的网关是host(docker02、docker03)的网关地址;
  l 运行容器在macvlan网络


  bbox1的IP:192.168.56.151  bbox2的IP:192.168.56.152
  l 测试连通性


  容器之间可以ping通;


  对方主机可以ping通;


  可以ping通www.baidu.com


  容器所在host的ip,无法ping通


  不具备DNS解析功能,ping hostname无法解析;
e) macvlan网络结构分析
  macvlan 不依赖 Linux bridge,brctl show 可以确认没有创建新的 bridge。


  查看一下容器的网络设备:
  l docker02

  l docker03

  除了 lo,容器只有一个 eth0,请注意 eth0 后面的 @if4,这表明该 interface 有一个对应的 interface,其全局的编号为4。根据 macvlan 的原理,我们有理由猜测这个 interface 就是主机的 ens33,确认如下:


  可见,容器的 eth0 就是 ens33 通过 macvlan 虚拟出来的 interface。容器的 interface 直接与主机的网卡连接,这种方案使得容器无需通过 NAT 和端口映射就能与外网直接通信(只要有网关),在网络上与其他独立主机没有区别。当前网络结构如图所示(引用cloudman博客中图):

f) 用 sub-interface 实现多 macvlan 网络
  macvlan 会独占主机的网卡,也就是说一个网卡只能创建一个 macvlan 网络,否则会报错:

  但主机的网卡数量是有限的,如何支持更多的 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。

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

  然后启用 sub-interface
  systemctl restart networking.service

  配置docker02主机vlan10接口(ens33.10)的macvlan网络

  配置docker02主机vlan20接口(ens33.20)的macvlan网络

  配置docker03主机vlan10接口(ens33.10)的macvlan网络

  配置docker03主机vlan20接口(ens33.20)的macvlan网络

  配置docker02主机vlan10的容器(172.16.10.11)

  配置docker02主机vlan20的容器(172.16.20.11)

  配置docker03主机vlan10的容器(172.16.10.12)

  配置docker03主机vlan20的容器(172.16.20.12)


3) sub-interface连通性测试


  bbox1 能 ping 通 bbox2,bbox3 能 ping 通 bbox4。即:同一 macvlan 网络能通信。
  bbox1 无法 ping 通 bbox3 和 bbox4。即:不同 macvlan 网络之间不能通信。但更准确的说法应该是:不同 macvlan 网络不能 在二层上 通信。在三层上可以通过网关将 macvlan 连通,下面我们就启用网关。
  将 Host 192.168.56.130 配置成一个虚拟路由器,设置网关并转发 VLAN10 和 VLAN20 的流量。当然也可以使用物理路由器达到同样的效果。首先确保操作系统 IP Forwarding 已经启用。

  输出为 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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-675428-1-1.html 上篇帖子: Linux虚拟化技术—Centos7.4下Docker容器安装配置与基本操作 下篇帖子: 21、《每天5分钟玩转Docker容器技术》学习--Flannel Network
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表