在 Kubernetes 中,两个不同节点上的 Pod 通过 VXLAN 来进行通信的具体过程如下:
首先,每个节点上运行的 kube-proxy 进程会监听一个特定的端口(默认为 10250),该端口用于接收来自其他节点上 Pod 的请求。
当某个 Pod A 需要与另外一个 Pod B 进行通信时,它会向目标 Pod B 所在节点发送一条 ARP 请求,以获取其 MAC 地址信息。
目标节点上运行的 CNI 插件会截获这条 ARP 请求,并将其转发给 kube-proxy 进程处理。
kube-proxy 进程收到 ARP 请求后,会根据请求中携带的 IP 地址信息查找对应的目标 Pod 所在节点,并尝试通过该节点上保存的路由表和 ARP 表获取目标 Pod 的 MAC 地址。
如果目标 Pod 的 MAC 地址已经存在于本地 ARP 缓存中,则直接返回该地址;否则,kube-proxy 会向目标节点发送一条 VXLAN 封装后的数据包,以请求该节点返回目标 Pod 的 MAC 地址信息。VXLAN 头部中包含了源 IP、目标 IP 和 VNI 等字段信息。
目标节点接收到 VXLAN 数据包后,会将其解封装,并根据其中携带的 VNI 字段查找对应的虚拟网络。然后,在该虚拟网络中查找目标 Pod 的 MAC 地址信息,并将其返回给源节点。
源节点收到目标 Pod 的 MAC 地址信息后,将其添加到本地 ARP 缓存中,并向该地址发送数据包。数据包会被 VXLAN 封装后发送到目标节点,在该节点上进行解封装并转发给目标 Pod 进行处理。
需要注意的是,在 Flannel 中使用 VXLAN 来实现虚拟网络时,每个节点都会分配一个唯一的 Subnet,因此所有节点间的通信都是基于该 Subnet 进行的。同时,Flannel 也提供了其他可选的网络驱动(如 host-gw、udp 和 aws-vpc 等),可以根据实际需求进行选择和配置。