容器网络三-k8s 不同主机之间容器互联原理

vxlan联通不同主机的netns

vxlan这种网络设备,能够对内部要发出去的包进行udp封装,对外部到达到vxlan上的包进行解包,
这种模式是flannel实现不同主机上容器互联的一个原理。

什么是vxlan

xvlan是linux主机上的一个虚拟网络设备,它能够对主机上要发出去的包进行udp封装,然后到达目的主机,然后在对应的vxlan设备上进行一个解包的操作。解包之后,再把之前原始想要发出去的那个网络包进行网卡的一个转发,最终会送达到目的主机的特定的网络命名空间里面去。

因为涉及到网卡包的转发,所以得让linux主机去支持一个包转发的功能,所以要打开ip forward功能

  • 允许防火墙,路由转发
  • iptables -A FORWARD -j ACCEPT
  • 内核允许路由转发,修改值为1
  • bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

创建vxlan interface

ip link add vxlan0 type vxlan \
   id 42 \
   remote 192.168.64.4 \
   local 192.168.64.3 \
   dev enp0s1
  • id

id是vxlan的一个设备id,这个id和目的主机上面的vxlan的一个设备id必须得一样,一样之后,才能对包进行一个解包的操作

  • remote 是一个目的主机的ip
  • local是一个本地主机的ip
  • dev 是从本地主机的这个enp0s1这个网卡出去

给网桥设置一个ip

ip addr add 178.192.64.2/16 dev vxlan0

启动网桥

ip link set vxlan0 up

创建好了这个xvlan虚拟设备之后,来看下,目前主机上面的一个包流转情况。

这里有两台主机,一台是192.168.64.3,一台是192.168.64.4,前面24位是一个网络号,都是同一个局域网之内的。

red代表一个名字叫red的网络命名空间,对应的目的主机是一个叫blue的网络命名空间,它们的网络段是不一样的,一个是178.192.64,一个是178.192.63,它们属于一个不同的网络段。

绿色部分代表一个网桥的设备。

首先看下red这个网络命名空间(ip是178.192.64.3,网段是178.192.64),它的路由表信息

178.192.64.0/24 dev br0 scope link src 178.192.64.1 
178.192.63.0/24 via 178.192.64.1 dev vxlan0 onlink

它的下一跳地址是br0这个网桥,然后从它内部veth-red的网卡出去,ip是178.192.64.1,因为在red网络命名空间有一对网络设备,一端叫veth-red,一端是veth-red-br,路由信息是

default via 178.192.64.1 dev veth-red onlink
178.192.64.0/24 dev veth-red proto kernel scope link src 178.192.64.3

根据路由信息,ip网络包会从veth-red这个网卡出去,然后赋予它原始地址是178.192.64.3。

小结

在red网络命名空间里面去ping一个blue这个网络命名空间里面的一个ip,比如在red网络命名空间ping 178.192.63.4。

  • ping这个ip,就会由默认路由出去,它的下一跳地址将会达到br0这个网桥上
  • 然后内核会做一个操作,它发现它的目的ip(178.192.63.4)和它本地的一个ip(178.192.64.3)不在同一个局域网内,它就会去寻找主机上面的其他网卡是否有匹配的一个网络段
  • 所以看下主机上的路由信息,如果是178.192.64.0网段的话,它就会从br0出去,如果是178.192.63.0这个网络段的话,就会从vxlan0这个网络设备出去,而这个178.192.63.0网络段,也就是blue这个网络命名空间所在的一个网络段。
  • 此时会转发到vxlan0这个网卡上,它的下一跳地址是178.192.64.1,它是目的主机上面的vxlan的一个ip地址。
  • 如果主机上没有178.192.64.1这个ip网络包的mac地址,那它首先会去寻找一个mac地址,它会从vxlan0这个网卡发一个封装arp协议的一个包,
  • 从eth0这个网络出去,到达目的主机这里,然后vxlan收到了,
  • 对arp协议封装的包进行解包的操作
  • 解包之后,它发现arp协议包里的一个目的ip是178.192.64.1,正是它自己
  • 在链路层arp协议封装的一个包,其实更准确的说是封装了一个帧。
  • 然后去响应这个arp的request请求,发一个replay给vxlan0这个网络设备,

抓下网络包:

这里是发了一个arp的request请求

request外部是用udp协议包裹的,它的目的port是8472 (linux主机上面vxlan的默认端口是8472)

udp里面包了一个arp的request请求,可以看到原mac地址、目的mac地址、原ip、目的ip都会在这里呈现出来。

vxlan的一个工作模式是将网络包用udp协议去封装一下,然后通过主机上面的网卡发送出去。

  • 得到mac地址之后,就能够去封装ip网络包,
  • 然后从网卡出去了,它封装ip网络包的原理也是用udp协议去封装一个ip网络包。
  • 送达到目的主机之后,vxlan1通过解包的操作对这个网络包进行解包,
  • 解包完之后,发现网络包的一个目的ip是178.192.63.4,
  • 然后会寻找目的主机上面的路由,发现178.192.63 这个网络段的路由,
  • 然后会从br1这个网桥进去,所以会把这个ip网络包转发到br1网桥上,
  • 然后会往与它连接的一个veth上发送这个ip网络包
  • 会找到blue网络命名空间 因为两者是通过veth设备去进行连接的
  • 所以这个网络包会发往到blue这个网络命名空间上
  • 然后blue网络命名空间回去的那个ip响应包,也是通过类似的整个流程,最后是经过vxlan1进行封包
  • 然后通过eth0网卡再到达vxlan0然后再进行解包
  • 然后到达了br0这里

vxlan连接不同主机的大概原理

两台主机上面通过一个比较巧妙的路由表的设计,能够使一个ip网络包能够灵活的从特定的网卡上进去,然后通过主机上面的ip forward的功能去转发到了特定网卡上,从而到达到了网络命名空间上。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章