GitHub - vishvananda/netlink: Simple netlink library for go.

netlink:

1. 添加删除网络接口,就是eth0、eth1

2. 配置IP地址和路由

3. 配置ipsec

这个netlink库被flannel使用了,fork from https://github.com/docker-archive/libcontainer 

要学习好docker网络,这个libcontainer要好好学习的。 

https://github.com/vishvananda/netns  https://github.com/vishvananda/netns 这哥们搞了2个库,netns是操作namespace的,提供了简洁的api接口

vxlan技术就是把二层报文用三层协议进行封装的技术,可以对二层网络在三层范围进行扩展。它应用于数据中心内部,使虚拟机可以在互相连通的三层网络范围内迁移,而不需要改变IP地址和MAC地址,保证业务的连续性。VXLAN采用24bit的网络标识,使用户可以创建1600万相互隔离的虚拟网络,突破了目前广泛采用的VLAN所能表示的4K个隔离网络的限制,这使得大规模多租户的云环境中具有了充足的虚拟网络分区资源。

比如说vxlan技术,很明显可以让跨物理主机的容器互相通信,看下面的图片,是2个私有网段10.20.1.0/24,完全是不可路由的,现在通过vxlan,竟然可以互相ping通

$ ip link add vxlan0 type vxlan \
    id 42 \
    dstport 4789 \
    remote 192.168.8.101 \
    local 192.168.8.100 \
    dev enp0s8 

这条命令创建一个名字为 vxlan0,类型为 vxlan 的网络 interface,后面是 vxlan interface 需要的参数

 id42这个就是vxlan技术中的VNI,就是802.1q里面的vlan tag,只不过VNI最大可达2的24次方,1600万个vxlan,数量比vlan多多了

vxlan技术涉及到vtep,这个英文字母要知道是什么意思,可以理解为一个物理主机上的进程,和另外一台主机上的vtep通过UDP通信。

dev enp0s8,这个是当前物理节点上的用于vxlan技术UDP通信的网卡名称(就是用ifconfig可以看到的网卡名称,iface),我们要读取这个网卡上的IP地址,用于UDP通信的双方的IP地址。

这条命令一旦执行,就会在物理主机上创建一个叫做vxlan0的iface,这个vxlan0是自己随便取的名称,执行后就好像物理主机多了一块物理网卡一样,然后需要给这个物理网卡配一个IP地址,我们使用ip addr add ip地址 dev 接口名称这个命令来给接口配置一个ip地址

root@node1:~# ip -d link show dev vxlan0
4: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether ba:d4:0a:f8:41:7c brd ff:ff:ff:ff:ff:ff promiscuity 0
    vxlan id 42 remote 192.168.8.101 dev enp0s8 srcport 0 0 dstport 4789 ageing 300 addrgenmode eui64
$ ip addr add 10.20.1.2/24 dev vxlan0
$ ip link set vxlan0 up

一旦执行了这个命令后,神奇的地方出现了,注意我们给这个虚拟接口配置的IP地址是10.20.1.2,物理主机上的路由表就会发生变化,任何往10.20.1.0/24网段去的数据包,都要通过vxlan0接口转发,就好像vxlan0是一个路由器一样,很奇妙,这个都是linux网络虚拟化能力的体现。

root@node0:~# ip route
10.20.1.0/24 dev vxlan0  proto kernel  scope link  src 10.20.1.2

还有个命令 bridge fdb,显示的内容很重要

root@node1:~# bridge fdb
00:00:00:00:00:00 dev vxlan0 dst 192.168.8.101 via enp0s8 self permanent

刚才是在192.168.8.100这台物理主机上添加的vxlan0虚拟接口,然后在192.168.8.101上面也做一模一样的设置,VNI也是2,UDP通信端口dstport也是4789,虚拟接口IP地址我们设置为10.20.1.3。

这样,就造成了A主机上的虚拟接口和B主机上的虚拟接口好像在1个网段内一样,而实际上它们是通过物理主机的网卡+物理主机的IP地址进行通信的。从A主机上pingB主机,就可以ping通:

root@node0:~# ping -c 3 10.20.1.3
PING 10.20.1.3 (10.20.1.3) 56(84) bytes of data.
64 bytes from 10.20.1.3: icmp_seq=1 ttl=64 time=1.84 ms
64 bytes from 10.20.1.3: icmp_seq=2 ttl=64 time=0.462 ms
64 bytes from 10.20.1.3: icmp_seq=3 ttl=64 time=0.427 ms

所以,我们就可以利用linux的vxlan技术组成多对多的网络通信模式,这就实现了通过物理主机的UDP报文overlay一个基于vxlan技术的虚拟网络了,就像下面docker技术使用的背后技术,docker在每个物理主机上都创建bridge,然后让容器都连接到bridge上就可以实现同一台主机上的容器之间互相通信,但是再加上linux的vxlan技术,一下子就打通了不同物理主机上的容器的网络,实现了容器的跨网络通信,这就是SDN的奇妙,要修改网络,比在物理网络中要telnet到交换机、路由器上去敲命令,效率高多了。

但是linux上的vxlan这种overlay技术,涉及到网络数据包的封包,解包,性能会下降,所以还有更好的方案就是基于路由表的方式进行直接路由,还有linux上的macvlan技术,都不会涉及到封包、解包,性能更好。现在Kubernetes网络中pod的互联互通,就是直接修改node主机上的路由表,不使用overlay网络技术,所以性能几乎没有下降。

 更多Linux网络虚拟化的知识:linux 网络虚拟化: network namespace 简介 | Cizixs Write Here

vxlan 协议原理简介 | Cizixs Write Here 

华为的一篇介绍vxlan的技术文章:【华为悦读汇】技术发烧友:认识VXLAN

Logo

更多推荐