承接上文

先补充下上文执行的命令
## 允许防火墙,路由转发
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
## 给网桥设置一个ip
ip addr add 178.192.64.2/16 dev vxlan0
## 启动网桥
ip link set vxlan0 up
## 创建网络命名空间
ip netns add red
ip link add veth-red type veth peer name veth-red-br
ip link set veth-red up
ip link set veth-red-br up
## 创建网桥
brctl addbr br0
ip link set br0 up
ip link set veth-red netns red
ip link set veth-red-br master br0
## 绑定ip
ip netns exec red ip addr add 178.192.64.3/24 dev veth-red
ip addr add 178.192.64.1/24 dev br0
## 创建路由
ip netns exec red ip route add default via 178.192.64.1 dev veth-red onlink
k8s vxlan不同点
k8s上的vxlan配置方式和上文说的略有不同,在k8s上面,它是一个集群中多主机的方式,上文创建vxlan的方式只指定了一台主机
ip link add vxlan0 type vxlan \
id 42 \
remote 192.168.64.4 \
local 192.168.64.3 \
dev enp0s1
即192.168.64.4,到达vxlan这个设备上的无论什么包都会发往192.168.64.4这个主机上。那k8s集群超过两台主机的话,那经过vxlan封装的包不仅仅是要发往一台主机,还有可能发往另外一台主机。
这种情况如何配置vxlan呢?
通过主机上面的fdb表去查找要发送的目的ip。当通过ip link指定一个remote ip的时候,会默认在fdb表里面去创建一个规则:只要达到vxlan这个网络设备上,它都会被发往一个目的ip叫192.168.64.4的主机上面。

查看fdb表项,vxlan需要查看下一跳的mac地址在对应fdb中的ip地址,让主机上的网卡通过这个ip地址把封装好的网络包发送过去。
所以在k8s里面,不会去指定mac地址和ip地址的映射规则。
比如指定172.192.63.0这个网络段,发往下一跳地址,是目的主机上面的vxlan这个网络设备的ip,那我发送ip网络包到这个ip地址之前,先去寻找对应的mac地址。
之前fdb表配置的映射为
00:00:00:00:00:00 dev vxlan0 dst 192.168.64.4 via enp0s1 self permanent
这样存在一个问题,任何封装的vxlan包都将发往192.168.64.4主机,如果集群是多台主机的情况,则不能这么配置。
所以flannel明确配置了要发往192.168.64.4主机的包的mac地址为该主机的vxlan设备的mac地址,既然明确配置了mac地址,回到配置路由的地方,
178.192.63.0/24 via 178.192.64.1 dev vxlan0 onlink
这里从vxlan0设备出去的下一跳地址是178.192.64.1,那如何让178.192.64.1和刚才所说的mac地址建立映射呢?
所以flannel又配置了arp表,这样就能让访问特定ip段的包发送到特定的主机上,由目的主机的vxlan包进行解包。
## nud permanent 指明该arp记录不会过期,不用做存活检查
ip neigh add 178.192.64.1 lladdr 02:3f:39:67:7d:f9 dev vxlan0 nud permanent
之前在说这个图的时候,
vxlan0这里是没有mac地址的,因为它的下一跳的mac地址是178.192.64.1,在主机上是没有的,
178.192.63.0/24 via 178.192.64.1 dev vxlan0 onlink
它会通过vxlan去封装一个arp的帧,发送到目的地址上,取得一个arp响应。
但是k8s却不这样做,因为k8s上面把这个下一跳的ip地址对应的mac地址,在arp缓存这个表里面创建了这么一条地址,即通过neigh能够创建这个ip地址的一个mac地址,并指定永不过期,这样呢,路由寻找178.192.64.1这个ip的mac地址,就不用通过vxlan进行封包解包了,而是直接从主机上面寻找,有了mac地址之后,vxlan将会一直对ip网络包进行一个封包的操作。
那封包了之后,怎么发往目的ip呢?
首先这个网络段,它对应一个下一跳地址,这个下一跳地址对应一个mac地址,这里就会涉及到fdb表,明确配置了一条mac地址。
特定的网络段和特定的目的ip建立起一个映射关系,这也是k8s通过flannel的vxlan模式去进行通信和上面那个图的区别。
flanneld
fllannel上面有一个进程叫flanneld,它负责动态创建、更新arp表fdb表。最后创建出来路由,创建的arp表,更新的fdb表所达到的最终目的是让我们的网络包能够转发到特定的网卡,能够从某个端口出去,能够到达vxlan设备上去进行封包解包的操作。




