CNI插件实现框架---以loopback为示例
以最简单的loopback插件作为实例,来分析CNI plugin的执行流程
// cni/plugins/loopback/loopback.go
1、func main()
main函数只是简单地调用skel.PluginMain(cmdAdd, cmdDel, version.All),注册插件中的插入和删除方法
// cni/pkg/skel/skel.go // PluginMain is the core "main" for a plugin which includes automatic error handling. // The caller must also specify what CNI spec versions the plugin supports. // When an error occurs in either cmdAdd or cmdDel, PluginMain will print the error // as JSON to stdout and call os.Exit(1). // To have more control over error handling, use PluginMainWithErro() instead.
2、func PluginMain(cmdAdd, cmdDel func(_ *CmdArgs) error, versionInfo version.PluginInfo)
该函数仅仅调用e := PluginMainWithError(cmdAdd, cmdDel, versionInfo)
若e不为nil,调用e.Print()并os.Exit()
// cni/pkg/skel/skel.go
3、func PluginMainWithError(cmdAdd, cmdDel func(_ *CmdArgs) error, versionInfo version.PluginInfo) *types.Error
该函数仅仅调用return (&dispatcher{
Getenv: os.Getenv,
Stdin: os.Stdin,
Stdout: os.Stdout,
Stderr: os.Stderr,
}).pluginMain(cmdAdd, cmdDel, versionInfo)
dispatcher 结构如下所示:
type dispatcher struct {
Getenv func(string) string
Stdin: io.Reader
Stdout: io.Write
Stderr: io.Write
ConfVersionDecoder version.ConfigDecoder
VersionReconciler version.Reconciler
}
// cni/pkg/skel/skel.go
4、func (t *dispatcher) pluginMain(cmdAdd, cmdDel func(_ *CmdArgs) error, versionInfo version.PluginInfo) *types.Error
1、先调用cmd, cmdArgs, err := t.getCmdArgsFromEnv()解析出,操作指令(ADD ,DEL或者VERSION),和操作参数
2、再根据不同的cmd,调用相关的函数。对于"ADD",调用t.checkVersionAndCall(cmdArgs, versionInfo, cmdAdd)
// cni/pkg/skel/skel.go
5、func (t *dispatcher) getCmdArgsFromEnv() (string, *CmdArgs, error)
该函数从环境变量和stdin中提取信息,填充数据结构CmdArgs,如下所示:
cmdArgs := &CmdArgs{
ContainerID: contID,
Netns: netns,
IfName: ifName,
Args: args,
Path: path,
StdinData: stdinData, // StdinData中的数据其实是network配置
}
// cni/pkg/skel/skel.go
6、func (t *dispatcher) checkVersionAndCall(cmdArgs *CmdArgs, pluginVersionInfo version.PluginInfo, toCall func(*CmdArgs) error) error
1、调用confiVersion, err := t.ConfVersionDecoder.Decode(cmdArgs.StdinData)获取网络配置中的版本
2、调用verErr := t.VersionReconciler.Check(configVersion, pluginVersionInfo)
3、最后调用return toCall(cmdArgs)
// cni/plugins/loopback/loopback.go
7、func cmdAdd(args *skel.CmdArgs) error
1、因为loopback比较特殊,因此直接忽略args,设置args.IfName = "lo"
2、调用ns.WithNetNSPath(args.Netns, do func(_ ns.NetNS) error),在args指定的net ns中执行函数do
3、loopback比较简单,net ns中的执行函数只是调用link, err := netlink.LinkByName(args.IfName)找到lo设备,再调用netlink.LinkSetUp(link)启动而已
4、调用result := current.Result{}并return result.Print()
综上完成CNI插件的执行流程
CNI插件实现框架---以loopback为示例的更多相关文章
- CNI插件编写框架分析
概述 在<CNI, From A Developer's Perspective>一文中,我们已经对CNI有了较为深入的了解.我们知道,容器网络功能的实现最终是通过CNI插件来完成的.每个 ...
- CNI插件源码示例,对于github.com/rajatchopra/ocicni库的分析
CNI插件初始化 // ocicni.go 1.func InitCNI(pluginDir string) (CNIPlugin, error) (1).先调用plugin := probeNetw ...
- k8s CNI插件简单了解
Kubernetes网络模型本身对某些特定的网络功能有一定要求,但在实现方面也具有一定的灵活性.业界已经有不少不同的网络方案,来满足特定的环境和要求. CNI(container network in ...
- 开源的JavaScript插件化框架MinimaJS
本文介绍我开发的一个JavaScript编写的插件化框架——MinimaJS,完全开源,源码下载地址:https://github.com/lorry2018/minimajs.该框架参考OSGi规范 ...
- nodejs插件化框架——minimajs
本文介绍我开发的一个JavaScript编写的插件化框架——minimajs,完全开源,源码下载地址:https://github.com/lorry2018/minimajs.该框架参考OSGi规范 ...
- 【插件式框架探索系列】应用程序域(AppDomain)
应用程序域(AppDomain)已经不是一个新名词了,只要熟悉.net的都知道它的存在,不过我们还是先一起来重新认识下应用程序域吧,究竟它是何方神圣. 应用程序域 众所周知,进程是代码执行和资源分配的 ...
- Android Small插件化框架源码分析
Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ...
- Android Small插件化框架解读——Activity注册和生命周期
通过对嵌入式企鹅圈原创团队成员degao之前发表的<Android Small插件化框架源码分析>的学习,对Android使用的插件化技术有了初步的了解,但还是有很多需要认真学习的地方,特 ...
- java jodd框架介绍及使用示例
Jodd是一个普通开源Java包.你可以把Jodd想象成Java的"瑞士军刀",不仅小,锋利而且包含许多便利的功能.Jodd 提供的功能有: 提供操作Java bean, 可以 ...
随机推荐
- Python 常用内建模块(time ,datetime)
1,在Python中,与时间处理有关的模块就包括:time,datetime以及calendar. 2,在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时间字符串 3)元组(st ...
- 前端_basic
web: 分三部分:1.HTML:2.CSS:3.JavaScript. 1.HTML:用来构建网页的结构和内容: 2.CSS:用来给网页化妆,美化网页: 3.JavaScript:用来让网页呈现动态 ...
- CentOS6.2下安装中文输入法
因为在程序中需要输入中文,但是系统没有预装中文输入法,所以就安装一下,顺便记录 1.用root登录 ,或su root2.yum install "@Chinese Support" ...
- SockIOPool
1. SockIOPool – SockIO池化管理,为上层提供的接口是实例化函数[主要是指定memcached服务器地址,各个机器的权重]:根据key&hashCode获取SockIO-网络 ...
- jQuery中bind函数绑定多个事件
名人名言:道德是真理之花.——雨果 在jQuery中绑定多个事件名称是,使用空格隔开,举例如下: $("#foo").bind("mouseenter mouseleav ...
- hdu 5360 Hiking(优先队列+贪心)
题目:http://acm.hdu.edu.cn/showproblem.php? pid=5360 题意:beta有n个朋友,beta要邀请他的朋友go hiking,已知每一个朋友的理想人数[L, ...
- Spring MVC学习-----------springMVC-mvc.xml
springMVC-mvc.xml 配置文件片段解说 (未使用默认配置文件名称) <?xml version="1.0" encoding="UTF-8" ...
- 一站式WPF--依赖属性(DependencyProperty)二
书接上文,前篇文章介绍了依赖属性的原理和实现了一个简单的DependencyProperty(DP),这篇文章主要探讨一下如何使用DP以及有哪些需要注意的地方. 回顾 依赖属性是由Dependency ...
- c#——表达式树在LINQ动态查询
一般如果逻辑比较简单,只是存在有的情况多一个查询条件,有的情况不需要添加该查询条件 简单方式这样操作就可以了 public IQueryable<FileImport> DynamicCh ...
- MathType可以编辑物理公式吗
很多的物理专业的人都在为编辑物理公式头疼,其实要写出这些公式并不难,要写出这些物理公式,那你就需要一个MathType公式编辑器!这是一款专业的公式编辑器,不管多复杂的公式或方程,都可以用它编辑出来, ...