总结
flannel把节点把子网信息存在etcd中,并监控子网信息的变化,根据变化信息更新到路由中
入口
main.go中
func main() {
...
bn, err := be.RegisterNetwork(ctx, wg, config)
...
bn.Run(ctx)
}
注册网络
hostgw/hostgw.go中
func (be *HostgwBackend) RegisterNetwork(ctx context.Context, wg sync.WaitGroup, config *subnet.Config) (backend.Network, error) {
...
l, err := be.sm.AcquireLease(ctx, &attrs)
...
}
获取子网
subnet/etcdv2/local_manager.go中
func (m *LocalManager) AcquireLease(ctx context.Context, attrs *LeaseAttrs) (*Lease, error) {
config, err := m.GetNetworkCGetNetworkConfigonfig(ctx)
...
l, err := m.tryAcquireLease(ctx, config, attrs.PublicIP, attrs)
...
}
func (m *LocalManager) tryAcquireLease(ctx context.Context, config *Config, extIaddr ip.IP4, attrs *LeaseAttrs) (*Lease, error) {
}
处理etcd中子网信息的添加删除
backend/route_network.go中
func (n *RouteNetwork) Run(ctx context.Context) {
...
n.handleSubnetEvents(evtBatch)
...
}
func (n *network) handleSubnetEvents(batch []subnet.Event) {
...
switch evt.Type {
case subnet.EventAdded:
...
route := n.GetRoute(&evt.Lease)
...
netlink.RouteAdd(route)
case subnet.EventRemoved:
...
route := n.GetRoute(&evt.Lease)
...
netlink.RouteDel(route)
}
...
}