【导读】本文介绍了K8s 网络模型之一的 Flannel。
每一个 Pod 都有一个在集群当中独一无二的IP并且在不经过NAT能互相通信
将TCP数据包装在另一种网络包里面进行路由转发和通信(性能损耗, 高并发情况下会丢失部分数据)
目前支持: UDP、VxLAN、AWS VPC和GCE路由
在每个主机上都会运行着flannel进程(DaemonSet方式的Pod)为主机小网段, 并将分配信息(子网网段/外部ip/mac)保存到ApiServer.etcd 以及使用Backends转发流量
本质就是封解包技术:
封装 虚拟地址 发送的报文, 送出宿主网络
解读 宿主网络 收到的报文, 发送给 虚拟网络
在 Underlay(IP层, 提供IP包的转发) 网络之上使用隧道技术依托 UDP 协议层构建的 Overlay(数据链路层) 的逻辑网络,并能灵活穿透三层 Underlay 网络,使逻辑网络与物理网络解耦
只要处于一个广播域里(一个主机发ARP广播, 可以到达所有的数据中心),无论主机移动到什么位置,只要它的VLAN(虚拟局域网)不变,就可以保持自己的IP不变
组网:
封包:
数据包从container的网络协议栈出发
经由default路由进入eth0
数据包eth0进入container挂载的bridge
bridge看到基于IP路由到来的数据包跳转进入flannel.1 vxlan设备
根据vxlan的协议标准进行二层封装转发
从ectd里面获取目的IP所在网段对应的vtep设备的mac地址进行封包
查询得到本节点上的vxlan fdb和目的端vtep对应的IP地址
vxlan设备将数据包经由UDP协议发送至对端的vxlan设备flannel.1
解包:
接受到数据包(vxlan的封包),
将包交给对应的vtep设备flannel.1,
由bridge传送给container
本质就是路由技术
通过配置每2个主机的 Overlay 网络的 subnet 对端 host 的路由信息实现, 数据包直接通过 eth0 进出
流量几乎无损耗,
但是需要维护n(n-1)/2条路由,
维护成本越来越重
类似vxlan, 代理模式, 数据需要封解包, 但是相比vxlan性能和稳定性要差
通过在主机两端建立隧道(tun), 连接 本机的kernel 网络协议栈 和 远程的 flannel进程
转自:
zhuanlan.zhihu.com/p/99697440
- EOF -
Go 开发大全
参与维护一个非常全面的Go开源技术资源库。日常分享 Go, 云原生、k8s、Docker和微服务方面的技术文章和行业动态。
关注后获取
回复 Go 获取6万star的Go资源库
分享、点赞和在看
支持我们分享更多好文章,谢谢!