// backend/vxlan/vxlan.go

func (be *VXLANBackend) RegisterNetwork(ctx context.Context, network string, config *subnet.Config) (backend.Network, error)

  • 创建cfg变量,它的结构体中包含VIN int, Port int, GBP bool三个字段,其中VNI设置为默认的defaultVNI = 1,并且调用json.Unmarshal(config.Backend, &cfg)解析
  • 创建变量devAttrs := vxlanDeviceAttrs{

    vni:      uint32(cfg.VNI),

    name:      fmt.Sprintf("flannel.%v", cfg.VNI),

    vtepIndex:   be.extIface.Iface.Index,

    vtepAddr:   be.extIface.IfaceAddr,

    vtepPort:    cfg.Port,

    gbp:       cfg.GBP,

  }

  • 调用dev, err := newVXLANDevice(&devAttrs) ---> 调用netlink库添加vlan设备,并且可以处理设备已经存在的情况
  • 调用subnetAttrs, err := newSubnetAttrs(be.extIface.ExtAddr, dev.MACAddr())
  • 调用lease, err := be.subnetMgr.AcquireLease(ctx, network, subnetAttrs)
  • 创建vxlanNet := ip.IP4Net{

    IP:      lease.Subnet.IP,

    PrefixLen:   config.Network.PrefixLen,

  }

  • 调用err = dev.Configure(vxlanNet)
  • 最后return newNetwork(network, be.subnetMgr, be.extIface, dev, vxlanNet, lease)

// backend/vxlan/vxlan.go

func newSubnetAttrs(publicIP net.IP, mac net.HardwareAddr)

  • 首先调用data, err := json.Marshal(&vxlanLeaseAttrs{hardwarAddr(mac)})
  • 接着调用return &subnet.LeaseAttrs{

    PublicIP:    ip.FromIP(publicIP),

    BackendType:  "vxlan",

    BackendData:  json.RawMessage(data),

  }

// backend/vxlan/device.go

func (dev *vxlanDevice)  Configure(ipn ip.IP4Net) error

  • 调用setAddr4(dev.link, ipn.ToIPNet())
  • 调用netlink.LinkSetUp(dev.link)启动VTEP
  • 最后添加一条路由 route := netlink.Route{

    LinkIndex:    dev.link.Attrs().Index,

    Scope:      netlink.SCOPE_UNIVERSE,

    Dst:        ipn.Network().ToIPNet(),

  },再调用netlink.RouteAdd(&route)

// backend/vxlan/network.go

func newNetwork(name string, subnetMgr subnet.Manager, extIface *backend.ExternalInterface, dev *vxlanDevice, _ ip.IP4Net, lease *subnet.Lease) (*network, error)

该函数仅仅用参数填充network数据结构:

nw := &network {

  SimpleNetwork:  backend.SimpleNetwork{

    SubnetLease:  lease,

    ExtIface:     extIface,

  },

  name:     name,

  subnetMgr:    subnetMgr,

  dev:      dev,

}

network数据结构如下所示:

type network struct {
  backend.SimpleNetwork
  name    string
  extIface   *backend.ExternalInterface
  dev     *vxlanDevice
  routes    routes
  subnetMgr  subnet.Manager
}

  

// backend/vxlan/network.go

func (nw *network) Run(ctx context.Context)

  • 创建misses := make(chan *netlink.Neigh, 100)并调用go nw.dev.MonitorMisses(misses)
  • 创建events := make(chan []subnet.Event)并调用go subnet.WatchLeases(ctx, nw.subnetMgr, nw.name, nw.SubnetLease, events)
  • 调用select,如果事件类型为initialEventsBatch,调用nw.handleInitialSubnetEvents(initialEventsBatch)直到成功为止
  • 一个无限的for循环,当misses有事件发生时,调用nw.handleMiss(miss),events有事件发生时,调用nw.handleSubnetEvents(evtBatch)

flannel源码分析---backend为vxlan的更多相关文章

  1. flannel源码分析---初始化部分

    // main.go 1.func main() ..... 首先调用sm, err := newSubnetManager()创建subnet manager .... 调用ctx, cancel ...

  2. gRPC源码分析0-导读

    gRPC是Google开源的新一代RPC框架,官网是http://www.grpc.io.正式发布于2016年8月,技术栈非常的新,基于HTTP/2,netty4.1,proto3.虽然目前在工程化方 ...

  3. 《深入理解Spark:核心思想与源码分析》——SparkContext的初始化(叔篇)——TaskScheduler的启动

    <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...

  4. 安卓MonkeyRunner源码分析之启动

    在工作中因为要追求完成目标的效率,所以更多是强调实战,注重招式,关注怎么去用各种框架来实现目的.但是如果一味只是注重招式,缺少对原理这个内功的了解,相信自己很难对各种框架有更深入的理解. 从几个月前开 ...

  5. Spark Scheduler模块源码分析之TaskScheduler和SchedulerBackend

    本文是Scheduler模块源码分析的第二篇,第一篇Spark Scheduler模块源码分析之DAGScheduler主要分析了DAGScheduler.本文接下来结合Spark-1.6.0的源码继 ...

  6. linux内存源码分析 - SLAB分配器概述【转】

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请 ...

  7. linux内存源码分析 - SLAB分配器概述

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 之前说了管理区页框分配器,这里我们简称为页框分配器,在页框分配器中主要是管理物理内存,将物理内存的页框分配给申请 ...

  8. linux调度器源码分析 - 运行(四)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 之前的文章已经将调度器的数据结构.初始化.加入进程都进行了分析,这篇文章将主要说明调度器是如何在程序稳定运 ...

  9. 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

随机推荐

  1. 日志分析工具--GoAccess的安装部署

    需求:及时得到线上用户访问日志分析统计结果,以便给开发.测试.运维.运营人员提供决策! 方案:GoAccess,图文并茂,而且速度快,每秒8W 的日志记录解析速度,websocket10秒刷新统计数据 ...

  2. 分页技术框架(Pager-taglib)学习三(pager-taglib中传递参数时中文乱码问题)

    一.问题描述 问题: 使用<pg:param name="key" />标签传递中文参数时,会有乱码. 原因: 因为它默认是用gb2312来对添加的参数进行编码,如果你 ...

  3. oracle,mysql分页

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...

  4. [转]Python定时任务框架APScheduler

    APScheduler是基于Quartz的 一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以 持久化任务 ...

  5. modbus学习

  6. ssh密码登陆的原理,密码的公私钥和sshkey的不是一回事

    密码登录的原理: 密钥加密: 创建分发密钥.分发到服务端的ssh-copy-id的本质是拷贝公钥到对面服务器的,authorized_keys文件下就会多了一个密钥文件信息.就会被拷贝入下面. 客户端 ...

  7. Jmeter实现对字符串加密

    最近测试移动端接口,但是请求内容是用MD5加密的,所以要先对请求内容进行加密,Jmeter内置的没有MD5加密方法,所以自己从网上copy了一份,实现了加密功能,以下是具体操作: 1.从网上copy了 ...

  8. ISP图像调试工程师

    汉邦高科 任职要求: 1. 电子工程.图像与信号处理.计算机等相关专业,本科及以上学历: 2. 在数字图像处理.视频压缩等方面具有扎实的理论背景知识: 3. 熟悉Sony.Panasonic.Apti ...

  9. combox使用要点

    <select id="node_type" name="node_type" class="easyui-combobox" req ...

  10. tcpdf

    将文档整为pdf格式文档 网址:http://www.tcpdf.org/examples.php