结合源码理解flannel host-gw

161 阅读1分钟

总结

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)
    }
    ...
}