网站首页 > 技术文章 正文
Flannel是cereos开源的CNI网络插件,下图flannel官网提供的一个数据包经过封包、传输以及拆包的示意图,从这个图片里面里面可以看出两台机器的docker0分别处于不同的段:10.1.20.1/24 和 10.1.15.1/24 ,如果从Web App Frontend1 Pod(10.1.15.2)去连接另一台主机上的Backend Service2 Pod(10.1.20.3),网络包从宿主机192.168.0.100发往192.168.0.200,内层容器的数据包被封装到宿主机的UDP里面,并且在外层包装了宿主机的IP和mac地址。这就是一个经典的overlay网络,因为容器的IP是一个内部IP,无法从跨宿主机通信,所以容器的网络互通,需要承载到宿主机的网络之上。
Flannel的支持多种网络模式,常用用都是VXLAN、UDP、hostgw、ipip以及gce和阿里云等,VXLAN和UDP的区别是VXLAN是内核封包,而UDP是flanneld用户态程序封包,所以UDP的方式性能会稍差;hostgw模式是一种主机网关模式,容器到另外一个主机上容器的网关设置成所在主机的网卡地址,这个和calico非常相似,只不过calico是通过BGP声明,而hostgw是通过中心的Etcd分发,所以hostgw是直连模式,不需要通过overlay封包和拆包,性能比较高,但hostgw模式最大的缺点是必须是在一个二层网络中,毕竟下一跳的路由需要在邻居表中,否则无法通行。
下面以vxlan 举例介绍一下,flannel 在vxlan模式下的通信原理。首先网络包从容器发出后,通过veth 连接到 docker0 网桥。
那么怎么知道哪些流量需要被flannel 接管呢? 这里通过第一个关键点,路由选择
# ip route show dev flannel.1
10.254.50.0/24 via 10.254.50.0 onlink
10.254.60.0/24 via 10.254.60.0 onlink
从而将flannel 管理的网段的流量转发到 flannel.1 网卡处理。
flannel.1这个虚拟网络设备将会对数据封包,但下面一个问题又来了,这个网关的mac地址是多少呢?因为这个网关是通过onlink设置的,flannel会下发这个mac地址,查看一下arp表:
# ip neig show dev flannel.1
10.254.50.0 lladdr ba:10:0e:7b:74:89 PERMANENT
10.254.60.0 lladdr 92:f3:c8:b2:6e:f0 PERMANENT
可以看到这个网关对应的mac地址,并且这些地址都是PERMANENT持久有效的,这样内层的数据包就封装好了。
还剩最后一个问题,外出的数据包的目的IP是多少呢?换句话说,这个封装后的数据包应该发往哪一台机器呢?难不成每个数据包都广播。VXLAN默认实现第一次确实是通过广播的方式,但flannel再次采用一种hack方式直接下发了转发表FDB。
# bridge fdb show dev flannel.1
92:f3:c8:b2:6e:f0 dst 10.100.139.246 self permanent
ba:10:0e:7b:74:89 dst 10.100.139.247 self permanent
这样对应mac地址转发目标IP便可以获取到了。这里还有个地方需要注意,无论是arp表还是FDB表都是permanent,它表明写记录是手动维护的,传统的arp获取邻居的方式是通过广播获取,如果收到对端的arp相应则会标记对端为reachable,在超过reachable设定时间后,如果发现对端失效会标记为stale,之后会转入的delay以及probe进入探测的状态,如果探测失败会标记为Failed状态。之所以介绍arp的基础内容,是因为老版本的flannel并非使用我上面的方式,而是采用一种临时的arp方案,此时下发的arp表示reachable状态,这就意味着,如果在flannel宕机超过reachable超时时间的话,那么这台机器上面的容器的网络将会中断。
猜你喜欢
- 2024-10-23 容器工程师:引领容器技术潮流,塑造行业未来!
- 2024-10-23 11张图带你彻底了解Kubernetes架构,绝对要收藏的!
- 2024-10-23 深入理解Kubernetes网络策略 kubernetes的网络方案
- 2024-10-23 Kubernetes 网络、监控技术全面解读
- 2024-10-23 Docker术语大全,建议收藏! docker简单介绍
- 2024-10-23 Cilium eBPF 网络解析 bt文件解析
- 2024-10-23 在生产环境中,阿里云如何构建高性能云原生容器网络?
- 2024-10-23 kubernetes系列教程(十二)详解DaemonSet控制器
- 2024-10-23 kubernetes 集群组件介绍 kubernetes集群搭建
- 2024-10-23 如何做容器化集群管理?保障容器能被有序访问是关键
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)