Flannel原理
1. 原理
Flannel的源码简洁明了,依次做了以下几件“大事”:
启动时使用Leases and Reservations里的机制从etcd/kubernetes租用一段ipv4网络地址空间,然后把它写入由参数
subnet-file
指定的配置文件(默认为/run/flannel/subnet.env
),包含了以下几个环境变量:FLANNEL_NETWORK
(所有flannel可供分配的网段)、FLANNEL_SUBNET
(该flannel分配到的网段)、FLANNEL_MTU
(MTU值)、FLANNEL_IPMASQ
,这几个值除了flannel自己用,还可用于设置docker的启动参数(例:设置--bip=FLANNEL_SUBNET
)。如果指定了ip-masq(默认为false),则增加一些IP masquerade rule,当容器要访问overlay外部的网络时,对包进行SNAT操作。
如果指定了iptables-forward-rules(默认为true),则增加FORWARD规则,让发送到
FLANNEL_NETWORK
网段里的ip的包能forward到容器里。对于docker 1.13+,这个非常重要,主要原因是从1.13版本开始,docker把FORWARD的默认规则改为DROP了。
Flannel有个非常好的extension backend用来理解和测试各个backend的原理,理解PreStartupCommand
、PostStartupCommand
、SubnetAddCommand
这几个命令,基本上就理解了相应backend的实现了。
2. 运行
Running flannel描述得很详细,文章host-gw里有具体的例子。
3. 参考资料
Leases and Reservations: https://github.com/coreos/flannel/blob/master/Documentation/reservations.md
Extension backend: https://github.com/coreos/flannel/blob/master/Documentation/extension.md
Last updated