15张图超硬核讲解 Kubernetes 网络,我不信网工不会看( 三 )


15张图超硬核讲解 Kubernetes 网络,我不信网工不会看

文章插图
 
图:A simple IPIP network workflow
Kubernetes中 IPIP 与 VxLAN 类似,也是通过网络隧道技术实现的 。与 VxLAN 差别就是,VxLAN 本质上是一个 UDP包,而 IPIP 则是将包封装在本身的报文包上 。
15张图超硬核讲解 Kubernetes 网络,我不信网工不会看

文章插图
 
图:IPIP in kubernetes
15张图超硬核讲解 Kubernetes 网络,我不信网工不会看

文章插图
 
图:IPIP packet with wireshark unpack
 
Notes:公有云可能不允许IPIP流量,例如Azure
 
VxLAN
kubernetes中不管是 flannel 还是 calico VxLAN的实现都是使用Linux内核功能进行的封装,Linux 对 vxlan 协议的支持时间并不久,2012 年 Stephen Hemminger 才把相关的工作合并到 kernel 中,并最终出现在 kernel 3.7.0 版本 。为了稳定性和很多的功能,你可以会看到某些软件推荐在 3.9.0 或者 3.10.0 以后版本的 kernel 上使用 VxLAN 。
15张图超硬核讲解 Kubernetes 网络,我不信网工不会看

文章插图
 
图:A simple VxLAN network topology
在kubernetes中vxlan网络,例如 flannel,守护进程会根据kubernetes的Node而维护 VxLAN,名称为 flannel.1 这是 VNID,并维护这个网络的路由,当发生跨节点的流量时,本地会维护对端 VxLAN 设备的MAC地址,通过这个地址可以知道发送的目的端,这样就可以封包发送到对端,收到包的对端 VxLAN设备 flannel.1 解包后得到真实的目的地址 。
查看 Forwarding database 列表
$ bridge fdb 26:5e:87:90:91:fc dev flannel.1 dst 10.0.0.3 self permanent
15张图超硬核讲解 Kubernetes 网络,我不信网工不会看

文章插图
 
图:VxLAN in kubernetes
15张图超硬核讲解 Kubernetes 网络,我不信网工不会看

文章插图
 
图:VxLAN packet with wireshark unpack
 
Notes:VxLAN使用的4789端口,wireshark应该是根据端口进行分析协议的,而flannel在linux中默认端口是8472,此时抓包仅能看到是一个UDP包 。
 
通过上述的架构可以看出,隧道实际上是一个抽象的概念,并不是建立的真实的两端的隧道,而是通过将数据包封装成另一个数据包,通过物理设备传输后,经由相同的设备(网络隧道)进行解包实现网络的叠加 。
weave vxlan
weave也是使用了 VxLAN 技术完成的包的封装,这个技术在 weave 中称之为 fastdp (fast data path),与 calico 和 flannel 中用到的技术不同的,这里使用的是 Linux 内核中的 openvswitch datapath module,并且weave对网络流量进行了加密 。
15张图超硬核讲解 Kubernetes 网络,我不信网工不会看

文章插图
 
图:weave fastdp network topology




推荐阅读