在上一篇文章里我们介绍了k8s集群中flannel vxlan overlay网络的创建,这在里我们基于上一篇文章中的例子,来介绍在flannel vxlan overlay网络中pod到pod的通讯。
查看集群中所有的pod:
我们用以前文章里部署的nginx application为例子,对于这个应用:
kubectl get pods -o wide --all-namespaces
利用以前文章中的kubectl-debug进入pod 10.1.55.2调试:
kubectl-debug deployment-nginx-app-69b6bbfd6d-5k8pd --namespace default
从pod 10.1.55.2访问pod 10.1.74.5
ip addr
ping -c 4 10.1.74.5
ip addr
traceroute 10.1.74.5
发现无论是ping命令还是traceroute命令都可以从pod 10.1.55.2访问的到pod 10.1.74.5,说明flannel vxlan overlay网络是没有问题的。
我们分析数据是如何从pod 10.1.55.2访问的到pod 10.1.74.5的
数据在pod network namespace的路由:
根据以前文章,ip为10.1.55.2的pod从自己的network namespace访问pod 10.1.74.5,根据10.1.55.2 pod network namespace的路由表,数据进入了10.1.55.2 pod的宿主172.20.11.42的network namespace中的linux bridge docker0。
数据在宿主network namespace的路由:
ip addr|grep 42
route -n
我们发现10.1.74.0/24网段的访问下一跳ip地址是10.1.74.0/32,并且用flannel.1设备发送。而这个flannel.1设备就是flannel启动的时候根据vxlan类型网络在宿主上创建的,它属于vxlan设备,会完成对二层eth以太数据包到udp数据包的封装与拆封。其中的".1"代表vxlan这个二层网络id号为1,也对应了vxlan网络在etcd里的配置。这个时候数据包源ip为10.1.55.2,目标ip为10.1.74.5,源mac为pod 10.1.55.2 network namespace中veth设备mac,目标mac为下一跳ip 10.1.74.0/32的mac。
查询vtep端点mac地址:
我们在pod 10.1.55.2的宿主172.20.11.42上通过arp表查询10.1.74.0/32的mac地址为5e:75:7d:bf:98:03
ip addr|grep 42
ip neigh|grep 10.1.74.0
ip neigh show dev flannel.1
查询vtep端点mac地址转发接口:
由于flannel.1设备是vxlan设备,会有转发接口与它的mac对应,我们继续在pod 10.1.55.2的宿主172.20.11.42上查询flannel.1设备的mac转发接口。
ip addr|grep 42
bridge fdb show |grep 5e:75:7d:bf:98:03
bridge fdb show dev flannel.1
我们发现flannel.1设备mac地址5e:75:7d:bf:98:03对应的转发接口为172.20.11.43,代表flannel.1设备将会把原始二层数据包(源ip为10.1.55.2,目标ip为10.1.74.5,源mac为pod 10.1.55.2 network namespace中veth设备mac,目标mac为10.1.74.0/32 mac)做为upd的payload发给172.20.11.43的8472端口(上一篇文章有端口配置)。而我们知道目标pod 10.1.74.5的宿主确实是172.20.11.43,而且其上的flannel.1设备同样会对8472端口的数据进行upd解包。
flannel.1设备upd封包:
ip addr|grep 42
route -n
我们从pod 10.1.55.2的宿主172.20.11.42的路由表得知发往172.20.11.0/24网段为直连路由,使用宿主网络设备enp0s3发送。所以对于:
目标节点处理upd封包:
host的路由表和fdb转发表的写入:
这里vxlan关键的两个点就是:
那么这些数据是怎么写入host的呢?因为所有的host都运行flannel服务,而flannel连接etcd存储中心,所以每个host就知道自己的子网地址cidr是什么,也知道在这个cidr中自己的flannel.1设备ip地址和mac地址,同时也知道了其它host的子网cidr以及flannel.1设备ip地址和mac地址。而知道了这些信息,就可以在flannel启动的时候写入到路由表和fdb中了,以下面172.20.11.42宿主为例:
ip addr|grep 42
bridge fdb show dev flannel.1
etcdctl --ca-file /etc/etcd/ca.crt --cert-file /etc/etcd/etcd-client.crt --key-file /etc/etcd/etcd-client.key get /cloudnetwork/subnets/10.1.82.0-24
etcdctl --ca-file /etc/etcd/ca.crt --cert-file /etc/etcd/etcd-client.crt --key-file /etc/etcd/etcd-client.key get /cloudnetwork/subnets/10.1.74.0-24
etcdctl --ca-file /etc/etcd/ca.crt --cert-file /etc/etcd/etcd-client.crt --key-file /etc/etcd/etcd-client.key get /cloudnetwork/subnets/10.1.55.0-24
总结flannel vxlan overlay网络pod到pod的通讯过程如下: