
VxLAN过渡到Flannel
Linux下的VxLAN
两台机器构成一个VxLAN网络,每台机器有一个VTEP,VTEP通过它们的IP互相通信。
# Centos7查看内核版本如果低于7.0请升级
uname -r
# 在所有的实验节点上升级内核
apt install rpm
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y
grub2-set-default 0
reboot
uname -r
通过ifconfig
查看ip与网卡信息。
# 第一台机器
# 添加一个vxlan类型的link名为vxlan0,并设置VNI为5,需要连接的目标IP为10.211.55.12本地地址为10.211.55.11从eth0口出去
ip link add vxlan0 type vxlan id 5 dstport 4789 remote 10.211.55.12 local 10.211.55.11 dev eth0
# 设置vxlan0的ip:10.20.1.2
ip addr add 10.20.1.2/24 dev vxlan0
# 启动vxlan0
ip link set vxlan0 up
yum -y install net-tools
# 第二台机器
# 添加一个vxlan类型的link名为vxlan0,并设置VNI为5,需要连接的目标IP为172.30.1.2本地地址为172.30.2.2从enp1s0口出去
ip link add vxlan0 type vxlan id 5 dstport 4789 remote 10.211.55.11 local 10.211.55.12 dev eth0
# 设置vxlan0的ip:10.20.1.3
ip addr add 10.20.1.3/24 dev vxlan0
# 启动vxlan0
ip link set vxlan0 up
yum -y install net-tools
route -n
# 测试
ping 10.20.1.2
参数 | 描述 |
---|---|
id 5 | 指定VNI的值,有效在1到2的24次方。 |
dstport 4789 | VTEP通信的端口,IANA分配的端口是4789。如果不指定,Linux默认使用8472. |
remote | 对端VTEP的地址 |
local | 当前节点VTEP要使用的IP地址,即当前节点隧道口的IP地址。 |
dev eth0 | 当前节点用于VTEP通信的网卡设备,用来获取VTEP IP地址。注意,这个参数和local参数含义相同,读者在使用过程中二选一即可。 |
能够ping通,接下来我们进行抓包查看。
tcpdump -i any -w linux-vxlan.cap
VNI为5,源地址是10.20.1.2目标地址是10.20.1.3,上面的地址还是主机对主机的地址。
但是我们会发现这样一个一个添加的方式太麻烦了,所以我们可以用组播的方式进行通信,直接在组播中去找。
组播Vxlan
要组成同一个VxLAN网络,VTEP必须能感知到彼此的存在。多播组的功能就是把网络中的节点组成一个虚拟的组。
# 第一台
# 添加一个vxlan类型的link名为vxlan1,并设置VNI为6,需要连接的目标组为239.1.1.1从eth0口出去
ip link add vxlan1 type vxlan id 6 dstport 4789 group 239.1.1.1 dev eth0
# 设置vxlan1的ip:192.168.1.1
ip addr add 192.168.1.1/24 dev vxlan1
# 启动vxlan1
ip link set vxlan1 up
# 第二台
# 添加一个vxlan类型的link名为vxlan1,并设置VNI为6,需要连接的目标组为239.1.1.1从eth0口出去
ip link add vxlan1 type vxlan id 6 dstport 4789 group 239.1.1.1 dev eth0
# 设置vxlan1的ip:192.168.1.2
ip addr add 192.168.1.2/24 dev vxlan1
# 启动vxlan1
ip link set vxlan1 up
# 测试
ping 192.168.1.1
注:组播地址让源设备能够将分组发送给一组设备。属于多播组的设备将被分配一个多播组 IP 地址,多播地址范围为239.0.0.0~239.255.255.255
。
组播与点对点的不同点在于FDB表。
可通过如下命令进行查看。
bridge fdb | grep vxlan
我们先来看vxlan0:默认的VTEP对端地址为10.211.55.12
。换句话说,原始的报文经过vxlan0后会被内核添加上VXLAN头部,而外部UDP头的目的IP地址会被冠上10.211.55.12
。在另一台机器上也进行相同的配置,要保证VNI和dstport也是相同的,并修改VTEP的local和remote IP地址到相应的值。
再来看vxlan1:
dst字段的值变成了组播地址239.1.1.1,而不是之前对方的VTEP地址,意思是原始报文经过vxlan0后被内核添加上VXLAN头部,其外部UDP头的目的IP地址会被冠上多播地址239.1.1.1;配置好后,VTEP通过IGMP加入同一个多播组239.1.1.1。
Vxlan+桥接网络
尽管上面的方法能够通过多播实现自动化的overlay网络构建,但是通信的双方只有一个VTEP。在实际生产中,每台主机上都有几十台甚至上百台虚拟机或者容器需要通信,因此需要找到一种方法将这些通信实体组织起来,再经过隧道口VTEP转发出去。
通过前面的介绍我们知道,Linux网桥可以连接多块虚拟网卡,因此可以使用网桥把多个虚拟机或者容器放到同一个VXLAN网络中,VXLAN+网桥的网络拓扑如下图所示。
和上面的多播模式相比,这里只是多了一块网桥,连接同一个主机上的不同容器的veth pair。接下来我们先用network namespace代替容器,其实现原理都是一样的。我们将创建一个network namespace,并通过一对veth pair将namespace中的eth0网卡连接到网桥。同时,VXLAN网卡也连接到网桥。
# 创建 namespace
ip netns add ns0
ip netns add ns1
# 创建 bridge
ip link add br0 type bridge
ip link set br0 up
# 创建两对 veth-pair (相当于网线)
ip link add veth0 type veth peer name br0-veth0
ip link add veth1 type veth peer name br0-veth1
# 先插入一头到网络名称空间里面去
ip link set veth0 netns ns0
ip link set veth1 netns ns1
# 再插入一头到网桥里面去
ip link set br0-veth0 master br0
ip link set br0-veth1 master br0
# 都要激活
ip link set br0-veth0 up
ip link set br0-veth1 up
# 配置ip并启用
ip netns exec ns0 ip add a 192.168.1.10/24 dev veth0
ip netns exec ns0 ip link set veth0 up
ip netns exec ns0 ip link set lo up
ip netns exec ns1 ip add a 192.168.1.11/24 dev veth1
ip netns exec ns1 ip link set veth1 up
ip netns exec ns1 ip link set lo up
# 把vxlan1加入到网桥网络
ip link set vxlan1 master br0
# 测试ns1 ping ns0
ip netns exec ns1 ping 192.168.1.10
# 创建 namespace
ip netns add ns2
ip netns add ns3
# 创建 bridge
ip link add br0 type bridge
ip link set br0 up
# 创建两对 veth-pair (相当于网线)
ip link add veth2 type veth peer name br0-veth2
ip link add veth3 type veth peer name br0-veth3
# 先插入一头到网络名称空间里面去
ip link set veth2 netns ns2
ip link set veth3 netns ns3
# 再插入一头到网桥里面去
ip link set br0-veth2 master br0
ip link set br0-veth3 master br0
# 都要激活
ip link set br0-veth2 up
ip link set br0-veth3 up
# 配置ip并启用
ip netns exec ns2 ip add a 192.168.1.12/24 dev veth2
ip netns exec ns2 ip link set veth2 up
ip netns exec ns2 ip link set lo up
ip netns exec ns3 ip add a 192.168.1.13/24 dev veth3
ip netns exec ns3 ip link set veth3 up
ip netns exec ns3 ip link set lo up
# 把vxlan1加入到网桥网络
ip link set vxlan1 master br0
# 测试ns3 ping ns2
ip netns exec ns3 ping 192.168.1.12
最后测试它们之间是否能够ping通。
关于Ubuntu请参考:https://www.freesion.com/article/5905520026/
Flannel简介
Flannel 是 CoreOS 团队中针对 Kubernetes 设计的一个网络规划服务,简单说它功能可以让集群中的不同节点主机创建的 Docker 都具有,整个集群中唯一的虚拟IP地址。在docker配置中,每一个节点的docker服务会分别负责所在节点容器的IP分配。这样导致不同的点上容器可能获得相同的内外IP地址。
flannel 的设计目的就是为集中的所有及诶单重新规划 IP 地址的使用规则,从而使得不同的节点上的容器能够获得同属于一个内网且不重复的IP地址,并且使得属于不同节点上的容器能够直接通过内网的IP 通信。
大致的网络结构如下:
我们会发现与我们刚刚的搭建的 vxlan 差不多,只是Flannel并非依赖ARP进行MAC地址学习,而是由节点上的flanneld进程启动时将本地flannel.1接口IP与MAC地址的映射信息上报到etcd中,并由其他各节点上的flanneld来动态生成相应的解析记录。
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739


默认昵称
mac地址会更改但vxlan解析后mac地址除了源mac地址改为cni0的地址外目的mac是c3 pod的mac. 这里的源地址是被改为flannel.1的mac地址吧 ,你这里写的是cni0的地址