flannel vxlan 实现原理【转】
flannel是coreos为kubernets提供的网络解决方案,主要为打通跨节点的容器通信,其中vxlan模式为flannel实现的一种后端模式,其他模式还包括udp, host-gw等,可以通过flannel官网了解更多信息。
linux vxlan工作原理
flannel的vxlan模式使用的是原生的linux vxlan实现,因此了解linux vxlan工作原理对于理解flannel的代码实现很有帮助。
在linux vxlan中,主要术语:
- L3 Miss: 目标IP在邻居表中未找到 (IP Miss,所以才叫L3 Miss吗?)
- L2 Miss: 目标MAC在vxlan FDB中未找到对应项 (2层的Miss)
- NOLEARNING: 禁止洪泛数据包 (在FDB中未找到相应表项)
vxlan fdb 主要映射目标MAC到vtep IP。
如图
创建vxlan device
$ip link add vxlan0 type vxlan id 42 group 239.1.1.1 dev eth0
$ip link set vxlan0 address 54:8:20:0:0:A
$ip address add 10.10.10.1 dev vxlan0
$ip link set up vxlan0
host-A 10.10.10.1 ping host-B 10.10.11.1
Host-A $ping 10.10.11.1
- host-A vxlan0接口生成arp请求10.10.11.1的mac地址
- vxlan 驱动封装添加VNI header,没有已知的目的mac,使用多播地址
- eth0 发出数据包
在host-B上,
- host-B收到数据包然后转发给相应的udp端口(vxlan)
- vxlan驱动解封装,vxlan0接收到arp request包,并生成相应的arp reply包,添加相应的vxlan header,目的mac为56:bb:01:0f:cb:A
这样在host-B的fdb中,会学到56:bb:01:0f:cb:A到转发规则,如下:
Host-B $bridge fdb show dev vxlan0
56:bb:01:0f:cb:A dev vxlan0 dst 192.168.1.10 self
0:0:0:0:0:0 dev vxlan0 dst 239.1.1.1 via eth0 self permanent
第二条规则就是在目的mac为止时使用多播地址的相应规则。
flannel实现方式
因为flannel是为k8s提供的网络解决方案,而在k8s中,每一台host会分配一个网段,该网段所有启动的容器均在这台机器上,所以,对于flnanel来说,很多信息都是已知的,可以简化flannel的vxlan fdb(不需要处理未知的MAC地址情况)以及相应的代码实现。
在flannel中,flannel会在每一台启动了flannel agentd的机器上创建一个vxlan device(上述的vxlan0),名称是flannel.1(1为vni号),flannel agent会根据分配的网段信息和vxlan device信息(vxlan device的mac地址),动态的修改host上的邻居表,并结合vxlan device的fdb实现跨主机的docker容器的通信。
一个例子
flannel的网段分配信息是通过etcd 记录的,在etcd中设置相应信息:
etcd $etcdctl get /flannel/network/config
{ "Network": "10.10.0.0/16", "Backend": { "Type": "vxlan", "VNI": 1 } }
在host-A上运行flannel agent,agent在etcd中分配网段10.10.10.0/24,agent创建flannel.1设备接口,配置IP 10.10.10.0 MAC 56:bb:01:0f:cb:A,配置路由,整个大段通过flannel.1, 这样overlay网络流量通过flannel.1转发处理,然后启动docker0,通过指定bip 10.10.10.1/24启动,这样在host-A上的容器使用网段10.10.10.1/24。
同理在host-B上运行flannel agent,agent进行的相应配置过程类似。
整个例子如图
flannel vxlan相应工作流程
由于flannel agentd知道所有的网段分配信息以及每台host上的flannel.1设备的IP,MAC,因此每一个网段在进行vxlan fdb转发时,可以使用host上flannel.1的MAC地址。
在host-A上,运行
host-A# bridge fdb show dev flannel.1
56:bb:01:0f:cb:B dst 192.168.1.11 self permanent
在host-B上,运行
host-B# bridge fdb show dev flannel.1
56:bb:01:0f:cb:A dst 192.168.1.10 self permanent
如图c1 ping c2时,如果容器c1 IP(10.10.10.2), 容器c2 IP(10.10.11.2), 因为host-A 的邻居表里没有c2 IP到MAC表项,flannel agent会收到相应的l3 miss(netlink)消息,然后flannel agent会反应式的设置c2 的IP到MAC表项为10.10.11.2-56:bb:01:0f:cb:B,这样在fdb中MAC 56:bb:01:0f:cb:B就对应到host-B的flannel.1。
因为flannel知道必要的网络信息,所以flannel直接按段处理了L3 miss的消息,L2的fdb直接在启动时根据etcd信息静态配置好,这样整个网络就连通了。
L3 miss代码
如代码,在L3 miss代码中,通过miss的IP在所有段里匹配然后设置对应的vtepMac,即: 上述的c2 IP是对应到网段10.10.11.0/24的,然后相应的vtepMAC就对应到host-B的flannel.1的MAC,代码中是通过路由信息记录的,也保存了设备的MAC。
func (n *network) handleL3Miss(miss *netlink.Neigh) {
log.Infof("L3 miss: %v", miss.IP)
rt := n.rts.findByNetwork(ip.FromIP(miss.IP))
if rt == nil {
log.Infof("Route for %v not found", miss.IP)
return
}
if err := n.dev.AddL3(neigh{IP: ip.FromIP(miss.IP), MAC: rt.vtepMAC}); err != nil {
log.Errorf("AddL3 failed: %v", err)
} else {
log.Info("AddL3 succeeded")
}
}
L2的代码也可以在该函数所在文件中找到。
参考资料
- http://events.linuxfoundation.org/sites/events/files/slides/2013-linuxcon.pdf
- http://lartc.org/howto/lartc.kernel.obscure.html
- http://hustcat.github.io/vxlan-l3miss-problem/
flannel vxlan 实现原理【转】的更多相关文章
- flannel vxlan工作基本原理及常见排障方法
写在前面 最近用kubeadm鼓捣了几个cluster集群测试用,网络用的flannel.因为这些机器都不是纯净的环境(以前部署过其他的k8s或者有一些特别的设置),所以部署起来遇到了很多问题.看了下 ...
- VXLAN 基础教程:VXLAN 协议原理介绍
VXLAN(Virtual eXtensible Local Area Network,虚拟可扩展局域网),是一种虚拟化隧道通信技术.它是一种 Overlay(覆盖网络)技术,通过三层的网络来搭建虚拟 ...
- Flannel的VXLAN模式工作原理
跨主机通信的一个解决方案是Flannel,由CoreOS推出,最早支持的是UDP模式,但是因为性能太差被淘汰了, 过时的UDP模式 相比两台宿主机直接通信,多出了flanneld的处理过程,发出IP包 ...
- 浅析flannel与docker结合的机制和原理
flannel flannel可以为容器提供网络服务. 其模型为全部的容器使用一个network,然后在每个host上从network中划分一个子网subnet. 为host上的容器创建网络时,从su ...
- 【转】flannel网络的VXLAN及host-gw
http://www.fly63.com/article/detial/1738 VXLAN是Linux内核本身支持的一种网络虚拟化技术,是内核的一个模块,在内核态实现封装解封装,构建出覆盖网络,其实 ...
- 【Kubernetes】两篇文章 搞懂 K8s 的 fannel 网络原理
近期公司的flannel网络很不稳定,花时间研究了下并且保证云端自动部署的网络能够正常work. 1.网络拓扑 拓扑如下:(点开看大图) 容器网卡通过docker0桥接到flannel0网卡,而每个 ...
- Docker网络解决方案 - Flannel部署记录
Docker跨主机容器间网络通信实现的工具有Pipework.Flannel.Weave.Open vSwitch(虚拟交换机).Calico, 其中Pipework.Weave.Flannel,三者 ...
- flannel
Docker跨主机容器间网络通信实现的工具有Pipework.Flannel.Weave.Open vSwitch(虚拟交换机).Calico实现跨主机容器间的通信.其中Pipework.Weave. ...
- Docker网络解决方案-Flannel(转)
转自https://www.cnblogs.com/kevingrace/p/6859114.html Docker跨主机容器间网络通信实现的工具有Pipework.Flannel.Weave.Ope ...
随机推荐
- IIS优化整理
IIS 之 在IIS7.IIS7.5中应用程序池最优配置方案 找到Web站点对应的应用程序池,“应用程序池” → 找到对应的“应用程序池” → 右键“高级设置...” 一.一般优化方案 1.基本设置 ...
- SpringIOC源码分析总结
大致的加载过程: spring ioc容器的加载,大体上经过以下几个过程: 资源文件定位.解析.注册.实例化 1.资源文件定位:主要发生在ApplicationContext中,由于applicati ...
- torch 深度学习(5)
torch 深度学习(5) mnist torch siamese deep-learning 这篇文章主要是想使用torch学习并理解如何构建siamese network. siamese net ...
- 51nod-1103-抽屉原理
1103 N的倍数 题目来源: Ural 1302 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 一个长度为N的数组A,从A中选出若干个数,使得 ...
- poj3308 Paratroopers 最大流 最小点权覆盖
题意:有一个n*m的矩阵,告诉了在每一行或者每一列安装大炮的代价,每一个大炮可以瞬间消灭这一行或者这一列的所有敌人,然后告诉了敌人可能出现的L个坐标位置,问如何安置大炮,使花费最小.如果一个敌人位于第 ...
- IOS-第三方开源库
我找的琐碎框架 1.HZExtend:应用快速开发架构集合了MVC和MVVM的特点https://github.com/GeniusBrother/HZExtend : 1.减少控制器压力以及耦合 2 ...
- RabbitMQ其他(八)
1 RabbitMQ消息队列的小伙伴: ProtoBuf(Google Protocol Buffer) 什么是ProtoBuf? 一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序 ...
- NPOI:初次操作(新建Excel)
1. 由于在某些电脑上没有安装office,或者有权限限制,使用COM组件进行读写Excel的话会出现问题, 为此,NPOI是一个很好的选择,NPOI可以在上述环境中满足Office的操作需求,并且功 ...
- 【LeetCode-128】Longest Consecutive Sequence
描述 输入一个乱序的连续数列,输出其中最长连续数列长度,要求算法复杂度为 O(n) . 输入 54,55,300,12,56 输出 3 通常我们看有没有连续序列时 找某个数有没有的前后的数,比如看到5 ...
- C#学习历程(七)[基础知识]
---恢复内容开始--- >>接受用户输入的整数 Console.readline():接受键盘输入的字符串,如果需要接受整数并输出,则需要字符串的转换. 一般建议使用Covert类中的方 ...