nslistener的作用实质上就是将新的namespace里的veth网卡的配置信息通过proxy进程传输出来,并且利用该信息对tap进行相同的配置,最终用tap模拟新的namespace里的veth,将流量导入虚拟机的tap网卡中。

NetlinkUpdate的数据结构如下所示:

// NetlinkUpdate tracks the change of network namespace
type NetlinkUpdate struct {
  // AddrUpdate is used to pass information back from AddrSubscribe()
  Addr netlink.AddrUpdate   // RouteUpdate is used to pass information back from RouteSubscribe()   Route netlink.RouteUpdate
  // Veth is used to pass information back from LinkSubscribe().   // Only support veth link at present   Veth *netlink.Veth   // UpdateType indicates which part of the netlink information has been changed.   UpdateType NetlinkUpdateType
}

  

------------------------------------------------------------ nsListener 内-----------------------------------------------------------------------------------

// runv/supervisor/hyperpod.go

1、func createHyperPod(f factory.Factory, spec *specs.Spec, defaultCpus int, defaultMemory int) (*HyperPod, error)

...// create Listener process running in its one netns

调用hp.startNsListener()

// runv/supervisor/hyperpod.go

2、func (hp *HyperPod) startNsListener() (err error)

(1)、创建var parentPipe, childPipe *os.File

(2)、调用`runv containerd-nslistener`命令

(3)、调用enc := gob.NewEncoder(parentPipe)和dec := gob.NewDecoder(parentPipe)

(4)、填充hp.nslistener{

  enc:  enc,

  dec:  dec,

  cmd:   cmd,

}

(5)、从dec中独到read == "init"则表示创建成功

注:runv/supervisor/proxy/nslistener.go的init函数调用reexec.Register("containerd-nslistener", setupNsListener)函数,因此,`runv containerd-nslistener`命令本质上就是调用setupNsListener()函数

// runv/supervisor/proxy/nslistener.go

3、func setupNsListener()

(1)、调用syscall.Unshare(syscall.CLONE_NEWNET) --> create own netns

(2)、再通过childPipe将"init"传输给containerd--> notify containerd to execute prestart hooks

(3)、after execute prestart hooks从childPipe中读到"init"再继续执行

// Get network namespace info for the first time and send to the containerd

(4)、调用routes, err := netlink.RouteList(nil, netlink.FAMILY_V4) --> get route info before link down

(5)、调用infos := collectionInterfaceInfo() --> send interface info to containerd

(6)、调用enc.Encode(intofs)和enc.Encode(routes)传输

(7)、创建函数netNs2Containerd := func(netlinkUpdate supervisor.NetlinkUpdate) ->本质上就是将netlinkUpdate信息通过childPipe发送出去

(8)、调用setupNetworkNsTrap(netNs2Containerd) --> keep collecting network namespace info and sending to the containerd

// runv/supervisor/proxy/nslistener.go

// 获取net ns中的veth网卡信息,传输出去,并且将其link down

4、func collectionInterfaceInfo() []supervisor.InterfaceInfo

(1)、调用links, err := netlink.LinkList()

(2)、遍历links,当link.Type()为"veth"时,将信息填充添加到infos数组中,

最后调用netlink.LinkSetDown(link)  --> set link down, tap device take over it

// runv/supervisor/proxy/nslistener.go

// This function should be put into the main process or somewhere that can be used to init the network namespace trap

5、func setupNetworkNsTrap(netNs2Containerd func(supervisor.NetlinkUpdate))

该函数主要用于获取links change event,addresses change event,route change event,然后将它们分别利用handleLink,handleAddr和handleRoute函数发送给containerd

......

------------------------------------------------------------------- containerd中 ----------------------------------------------------------------------------------

6、func (c *Container) start(p *Process) error

.....

(1)、调用err = execPrestartHooks(c.Spec, state)

(2)、调用c.ownPod.initPodNetwork(c)

7、func execPrestartHooks(rt *specs.Spec, state *specs.State)

遍历rt.Hooks.Prestart,调用execHook(hook, state)

8、func (hp *HyperPod) initPodNetwork(c *Container) error

(1)、当len(hp.Containers) > 1时,返回nil --> Only start first container will setup netns

(2)、当len(c.Spec.Hooks.Prestart) == 0时,返回nil --> container has no prestart hooks, means no net for this container

(3)、将listener赋值为hp.nslistener,调用listener.enc.Encode("init"),向nsListener发送收集信息的请求

(4)、调用listener.dec.Decode(&info)和listener.dec.Decode(&route)收集ns的nic信息

(5)、遍历infos,调用bridge,err := GetBridgeFromIndex(info.PeerIndex),nicId := strconv.Itoa(info.Index),并用它们填充获得conf := &api.InterfaceDescription{},最后调用hp.vm.AddNic(conf)

(6)、调用hp.vm.AddRoute()

(7)、调用go hp.nsListenerStrap()

9、func (hp *HyperPod) nsListenerStrap()

(1)、将listener赋值为hp.nslistener

// Keep watching container network setting and then update vm/hyperstart

(2)、从parentPipe中获取update信息(类型为NetlinkUpdate{}),再根据update.UpdateType,分别进行对应的操作

runv nslistener源码分析的更多相关文章

  1. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  2. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

  3. nginx源码分析之网络初始化

    nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...

  4. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  5. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  6. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  7. java使用websocket,并且获取HttpSession,源码分析

    转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...

  8. ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...

  9. ABP源码分析三:ABP Module

    Abp是一种基于模块化设计的思想构建的.开发人员可以将自定义的功能以模块(module)的形式集成到ABP中.具体的功能都可以设计成一个单独的Module.Abp底层框架提供便捷的方法集成每个Modu ...

随机推荐

  1. 自己动手C#模拟电梯的运行V1.0

    电梯调度有很多种模式,参见http://www.cnblogs.com/jianyungsun/archive/2011/03/16/1986439.html 1.1先来先服务算法(FCFS) 先来先 ...

  2. 让Visual Studio Code对jQuery支持智能提示!

    本人新手,对代码各种不熟悉,记不准确,总是打错,造成各种失误!! 其实这个方法应该适合大部分前端开发工具!! 园里子有前人写了一篇文章对智能提示的实现!不过很多新手看不懂吧. http://www.c ...

  3. 数三角形 bzoj 1201

    数三角形(1s 128MB)triangle [题目描述] 小苏看到一个这样的等边三角形:该等边三角形每边的长度为n且被分成n等份,于是每条边就有n-1个等分点.而整个三角形被连接两个不同边的等分点且 ...

  4. 《数据结构与算法Python语言描述》习题第二章第三题(python版)

    ADT Rational: #定义有理数的抽象数据类型 Rational(self, int num, int den) #构造有理数num/den +(self, Rational r2) #求出本 ...

  5. [翻译]用 Puppet 搭建易管理的服务器基础架构(4)

    我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第四部分. 原文地址:http://blog.jobbole.com/89214/ 本文由 伯乐在线 - Wing 翻译,黄利民 校稿 ...

  6. CSS制作凹环特效

    就是在地面上打凿出凹的圆环效果,利用linear-gradient线性渐变增强内环质感,再用伪类after元素设置中心圆凸块的位置以及大小与跟内环之间的阴影度,然后设置内环的颜色就行了:第四个环上面的 ...

  7. ajax大全

    简介 对于WEB应用程序:用户浏览器发送请求,服务器接收并处理请求,然后返回结果,往往返回就是字符串(HTML),浏览器将字符串(HTML)渲染并显示浏览器上. 传统的web应用简单的操作需要加载全局 ...

  8. 理解 iOS 的内存管理

    远古时代的故事 那些经历过手工管理内存(MRC)时代的人们,一定对 iOS 开发中的内存管理记忆犹新.那个时候大约是 2010 年,国内 iOS 开发刚刚兴起,tinyfool 大叔的大名已经如雷贯耳 ...

  9. [转]oracle 实施方法论学习心得

      本周由部门新入职的同事为我们分享oracle实施方法论,本次重点围绕项目启动会来做介绍,并着重介绍了oracle与我们不一样的地方.收获颇丰,简单总结几个值得学习借鉴的要点: 1.      细节 ...

  10. Windows Phone 8.1低功耗蓝牙开发-Nokia Treasure Tag

    1. 引言 上一篇文章<Windows 8.1 低功耗蓝牙开发>讲述了如何在Windows 8.1平台上创建低功耗蓝牙应用,并且以TI的Sensor Tag为例,给出了代码步骤和演示.其实 ...