理解容器网络(一)

在默认情况下docker创建的容器都会有一个veth加随机字符串的虚拟网卡,这些通过虚拟网卡通过veth pair都连接到宿主机上的docker0网桥上,它是工作在数据链路层的设备,通过学习mac地址来学习将数据包转发到网桥的不同端口上,在同一个宿主机上的两个容器是怎样ping通的呢,我们起两个容器
在这里插入图片描述在这里插入图片描述当172.17.0.2ping172.17.0.3的时候我们看一下0.2的路由规则
在这里插入图片描述发现它会匹配第二条规则,它的网关是0.0.0.0说明它是一条直连规则,只要是匹配这条规则的ip包,通过本机的eth0网卡通过二层网络发给目的主机,要想到达另一个容器,就必须有它的mac地址,所以02通过eth0网卡发送一个arp广播通过ip地址查找对应的mac地址,一旦一个虚拟网卡被插在网桥上它就会变成该网桥的从设备,不处理数据包只转发数据包因为都插在docker0上,所以02可以获得03的mac地址,通过端口和mac地址表查到03对应的端口然后把数据发送到这个端口,这样这个数据包就进入了03的网络命名空间,03自己的网卡上出现了来自02的数据包,03就会处理响应,发送response
在实际传递数据的过程中在网络不同层次都有linu内核netfilter工作,容器想ping通另一个主机,先到达docker0网卡,然后根据宿主机上的路由规则到达另一台主机,前提是本身这两台主机都能互相通,容器之间的跨主机通信是如何实现的呢,我们可以通过软件的方式,创建一个整个集群公用的网桥,然后把集群里的所有容器都连接到这个网桥上,这种技术叫做overlay network 如图所示
在这里插入图片描述容器之间的跨主机通信如何实现的呢,我们以flannel为例子,它支持三种后端实现,vxlan,host-gw,udp,udp性能不好,vxlan可以完全在内核态实现封装和解封装的操作,构建出覆盖网络overlay network,在三层网络之上覆盖一层二层网络,使得连接的主机可以像在同一个局域网里自然通信,这个隧道的两段有两个连接设备叫做vtep,如图所示
在这里插入图片描述就是每台主机上的flannel.1设备,它有ip和mac地址,加入我们10.1.1.2要访问10.1.2.3,1.2要访问2.3会先出现在docker0,然后会被路由到flannel.1设备,主机二在加入主机一的时候会加入一条路由规则,就是发往2.3的ip包都要经过flannel.1,发往的网关地址是10.1.2.0就是主机二的vtep设备,这些vtep设备之间就是通过二层数据帧进行通信,所以它要先知道目的vtep的mac地址是什么,它会从arp记录里找到,这个表也是flanneld进程维护的,有了mac地址就开始封装了,封装结果如下
在这里插入图片描述上面封装的数据帧并不能在主机的二层网络里传输,所以内核还需要把这个内部数据帧封装成为一个能在主机网络中传输的一个普通数据帧,让它载着内部数据帧通过宿主机的eth0网卡传输,内核还会在这个内部数据帧前面加上一个特殊的vxlan头,这个头中有一个重要的标志是vni,然后内核再把这个数据帧封装进一个udp包发出去,下一步它要知道目的宿主机的地址,在这种情况下,flannel.1要变成一个网桥,在二层网络进行udp包的转发,它会从一个fdb转发数据库中找到对应的ip地址,这个fdb信息也是flanneld进程负责维护的,然后把目的主机地址目的主机mac地址封装进帧,这个帧会从宿主机网络到目的主机的eth0网卡,目的主机根据vni把它讲给本机的flannel设备,最终这个ip包就进入了容器二的网络命名空间了
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值