博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cni 添加网络 流程分析
阅读量:4978 次
发布时间:2019-06-12

本文共 3603 字,大约阅读时间需要 12 分钟。

cnitool: Add or remove network interfaces from a network namespace  cnitool  add  
  
  cnitool  del  
  

cnitool的使用方式如下:其中<net>是配置文件所在目录,一般为/etc/cni/net.d/*.conf文件,<netns>为network namespace的目录文件,一般为/var/run/netns/NS-ID

 

1、cni/libcni/api.go

// AddNetwork executes the plugin with ADD command

func (c *CNIConfig) AddNetwork(net *NetworkConfig, rt *RuntimeConf) (types.Result, error)

(1)、首先调用pluginPath, err := invoke.FindInPath(net.Network.Type, c.Path),该函数用于在c.Path中寻找对应插件的可执行文件,然后返回路径

(2)、调用 return invoke.ExecPluginWithResult(pluginPath, net.Bytes, c.args("ADD", rt)),net.Bytes是配置文件的序列化二进制码,其中c.args函数主要的作用是填充并返回一个*invoke.Args类型:

return &invoke.Args {  Command:        action,  ContainerID:      rt.ContainerID,  NetNS:         rt.NetNS,  PluginArgs:      rt.Args,  IfName:        rt.IfName,  Path:         strings.Join(c.Path, string(os.PathListSeparator)),}

  

NetworkConfig的数据结构如下所示,用于表示容器要加入的网络:

// libcni/api.gotype NetworkConfig struct {  Network   *types.NetConf  Bytes    []byte      // 在初始化CNI的时候,会将配置文件写入Bytes}// pkg/types/types.go// NetConf describes a networktype NetConf struct {  CNIVersion   string  Name       string  IPAM  string {    Type  string  }  DNS DNS}

  

Runtime的数据结构如下所示,用于表示加入网络的容器的信息:

type RuntimeConf struct {  ContainerID   string  NetNS       string  IfName      string  Args       [][2]string}

 

CNIConfig的数据结构如下所示:CNIconfig包含的是bridge,dhcp等插件的可执行文件的目录的路径集合

type CNIConfig struct {  Path    []string}

  

2、cni/pkg/invoke/exec.go

func ExecPluginWithResult(pluginPath string, netconf []byte, args CNIArgs) (types.Result, error)

该函数只是简单地返回 return defaultPluginExec.WithResult(pluginPath, netconf, args)

其中defaultPluginExec是一个*PluginExec的类型变量,赋值过程如下所示:

var defaultPluginExec = &PluginExec{  RawExec:      &RawExec{Stderr: os.Stderr},    --->RawExec又是在raw_exec.go中定义的一个结构类型,其中只有一个Stderr的io.Writer类型  VersionDecoder:   &version.PluginDecoder{},}// 其中PluginExec的定义如下所示:type PluginExec struct {  RawExec interface {    ExecPlugin(pluginPath string, stdinData []byte, environ []string) ([]byte, error)  }   VersionDecoder interface {    Decode(jsonBytes []byte) (version.PluginInfo, error)  }}

  

3、cni/pkg/invoke/exec.go

func (e *PluginExec) WithResult(pluginPath string, netconf []byte, args CNIArgs) (*types.Result, error)

(1)、调用stdoutBytes, err := e.RawExec.ExecPlugin(pluginPath, netconf, args.AsEnv()),args.AsEnv()将args里的内容转变为环境变量返回,例如CNI_COMMAND=ADD等等

// Plugin must return result in same version as specified in netconf

(2)、调用versionDecoder := &version.ConfigDecoder{}和confVersion, err := versionDecoder.Decode(netconf)从netconf中解析处CNI的版本

(3)、最后调用return version.NewResult(confVersion, stdoutBytes)返回相应版本的Result

 

4、cni/pkg/invoke/args.go

func (args *Args) AsEnv() []string

1、调用env := os.Environ()获取已有的环境变量

2、若args.PluginArgsStr为"",则将args.PluginArgs拼接为“A=B;C=D”的形式

3、调用env = append(env, 

  "CNI_COMMAND=" + args.Command,

  "CNI_CONTAINERID=" + args.ContainerID,

  "CNI_NETNS=" + args.NetNS,

  "CNI_ARGS=" + pluginArgsStr,

  "CNI_IFNAME=" + args.IfName,

  "CNI_PATH="+args.Path)

),将参数都作为环境变量传递给plugin

 

RawExec的结构如下所示:

type RawExec struct {  Stderr  io.Writer}

 

5、cni/pkg/invoke/raw_exec.go

func (e *RawExec) ExecPlugin(pluginPath string, stdinData []byte, environ []string) ([]byte, error)

(1)、首先获得stdout := bytes.Buffer{}作为输出缓冲器

(2)、创建执行命令并调用c.Run()运行

c := exec.Cmd {  Env:      environ,  Path:     pluginPath,  Args:     []string{pluginPath},  Stdin:     bytes.NewBuffer(stdinData),  Stdout:    stdout,  Stderr:    e.Stderr,}

(3)、最后返回stdout.Bytes(),插件直接将结果输出到stdout

 

转载于:https://www.cnblogs.com/YaoDD/p/6024535.html

你可能感兴趣的文章
用bcdedit.exe重建bcd
查看>>
关于元素透明
查看>>
Leetcode 516. Longest Palindromic Subsequence
查看>>
MinDoc文档管理系统搭建
查看>>
[HNOI2011] 数学作业
查看>>
在IDEA中创建Maven项目和添加tomcat
查看>>
ADO MFC SQL2000
查看>>
Hie with the Pie
查看>>
2019.01.04 bzoj2962: 序列操作(线段树+组合数学)
查看>>
ThinkPHP5集成支付宝手机网站支付接口
查看>>
hdu 3584 Cube (三维树状数组,更新区间,查询单点)
查看>>
lvs基础
查看>>
接口测试 rest-assured 使用指南
查看>>
Java 8简明教程
查看>>
Java线程池使用说明
查看>>
ectouch第十一讲 之 ECTouch 菜单里如何添加文章链接
查看>>
adb logcat
查看>>
VME总线 分类: 生活百科 2014-06-...
查看>>
数字信号相关和卷积
查看>>
[CSAPP]Bufbomb实验报告
查看>>