zoukankan      html  css  js  c++  java
  • CNI flannel插件

    // plugins/meta/flannel/flannel.go

    func cmdAdd(args *skel.CmdArgs) error

    • 调用n, err := loadFlannelNetConf(args.StdinData)读取网络配置
    • 调用fenv, err := loadFlannelSubnetEnv(n.SubnetFile)读取flannel的配置结果
    • 确定n.Delegate["name"],n.Delegate["type"],n.Delegate["ipMasq"],n.Delegate["mtu"],n.Delegate["ipam"]等字段
    • 调用return delegateAdd(args.ContainerID, n.DataDir, n.Delegate)

    NetConf的结构如下所示:

    type NetConf struct {
      types.NetConf
      SubnetFile  string
      DataDir    string
      Delegate   map[string]interface{}
    }
    

      

    // plugins/meta/flannel/flannel.go

    func loadFlannelNetConf(bytes []byte) (*NetConf, error)

    • 创建n := &NetConf{}其中设置SubnetFile为默认的defaultSubnetFile = /run/flannel/subent.env,defaultDataDir = /var/lib/cni/flannel
    • 再调用json.Unmarshal(bytes, n)将配置解析至n中

    // plugins/meta/flannel/flannel.go

    func loadFlannelSubnetEnv(fn string) (*subnetEnv, error)

    • 调用f, err := os.Open(fn)打开subnet file
    • 创建变量 se := &subnetEnv{},遍历subnet file从中提取FLANNEL_NETWORK, FLANNEL_SUBNET, FLANNEL_MTU, FLANNEL_IPMASQ填充至se中
    • 调用se.missing(),如果se中有任何一个字段为空则报错

    // plugins/meta/flannel/flannel.go

    func delegateAdd(cid, dataDir string, netconf map[string]interface{})

    • 调用netconfBytes, err := json.Marshal(netconf)
    • 再调用saveScratchNetConf(cid, dataDir, netconfBytes) ---> 创建目录dataDir,并且将netconf写入,当删除网络时,会从该目录读取配置
    • 接着调用result, err := invoke.DelegateAdd(netconf["type"].(string), netconfBytes),调用相应的插件,例如bridge
    • 最后调用return result.Print()
  • 相关阅读:
    将同一个应用程序同时作为 http 和 https
    将数组元素划分为等长的块(二维数组)
    将数组中的空元素转为 undefined
    将某个类型断言为另一个与之毫无关系的类型
    将前端代码放入 Egg 项目中
    将根组件挂载到 DOM 节点上
    将类数组对象转换成数组
    将 ts 代码转成 js 代码
    将代码推迟到系统资源空闲时执行
    React 将 state 传给子组件用
  • 原文地址:https://www.cnblogs.com/YaoDD/p/6635633.html
Copyright © 2011-2022 走看看