CNI IPAM插件分析 --- 以hostlocal为示例
skel.CmdArgs数据结构如下所示:
type CmdArgs struct { ContainerID string
Netns string
IfName string
Args string
Path string
StdinData []byte
}
// cni/plugins/ipam/host-local/main.go
1、func cmdAdd(args *skel.CmdArgs) error
1、调用ipamConf, confVersion, err := allocator.LoadIPAMConfig(args.StdinData, args.Args)加载IPAM的配置和版本号
2、若ipamConf.ResolvConf不为"",则调用dns, err := parseResolvConf(ipamConf.ResolvConf),并且将result.DNS = *dns
3、调用store, err := disk.New(ipamConf.Name, ipamConf.DataDir)
4、调用allocs := []*allocator.IPAllocator{} 获取allocator,保持该结构,当出错的时候,可以将所有IP地址释放
5、创建requestedIPs := map[string]net.IP{}并将ipamConf.IPArgs中的地址都填入其中
6、遍历for idx, ipRange := range ipamConf.Ranges,调用allocator := allocator.NewIPAllocator(ipamConf.Name, ipRange, store)
7、遍历requestedIPs,for k, ip := range requestedIPs,如果ipRange.IPInRange(ip)为nil,则说明请求的ip在可分配的地址范围内,
设置requestedIP = ip,并调用delete(requestedIPs, k)
8、调用ipConf, err := allocator.Get(args.ContainerID, requestedIP),并调用allocs = append(allocs, allocator)和result.IPs = append(result.IPs, ipConf)
9、如果最后len(requestedIPs)不为0,则释放所有的allocator并报错
10、设置result.Routes = ipamConf.Routes
11、最后return types.PrintResult(result, confVersion)
// cni/plugins/ipam/host-local/backend/allocator/config.go
// NewIPAMConfig creates a NetworkConfig from the given network name.
2、func LoadIPAMConfig(bytes []byte, envArgs string) (*IPAMConfig, string, error)
1、首先设置n := Net{},再调用json.Unmarshal(bytes, &n)进行解析
2、如果envArgs不为"",或者n.Args不为nil,则将他们都添加到n.IPAM.IPArgs中
3、如果n.IPAM.Range不为nil,说明使用的是老的配置方式,将n.IPAM.Range迁移到n.IPAM.Ranges中
4、遍历n.IPAM.Ranges,对IPv4或IPv6的range进行计数,若他们的数目大于1,切cni版本小于0.3.0则报错
5、检测各个range之间是否有重合
6、将n.IPAM.Name赋值为n.Name
7、最后return n.IPAM, n.CNIVersion, nil
Net数据结构如下所示:
type Net struct {
Name string
CNIVersion string
IPAM *IPAMConfig
Args *struct {
A *IPAMArgs
}
}
IPAMConfig数据结构如下所示:
// IPAMConfig represents the IP related network configuration
// 保留Range是为了向后兼容
type IPAMConfig struct {
*Range
Name string
Type string
Routes []*types.Route
DataDir string
ResolvConf string
Ranges []Range
IPArgs []net.IP // Requested IPs from CNI_ARGS and args
}
Range结构如下所示:
type Range struct {
RangeStart net.IP
RangeEnd net.IP
Subnet types.IPNet
Gateway net.IP
}
IPAMArgs结构如下所示:
type IPAMArgs struct {
IPs []net.IP
}
// cni/plugins/ipam/host-local/backend/disk/backend.go
3、func New(network, dataDir string) (*Store, error)
1、若dataDir为"",设置defaultDataDir为"/var/lib/cni/networks"
2、调用dir := filepath.Join(dataDir, network)并且调用os.MkdirAll(dir, 0755)创建目录
3、调用lk, err := NewFileLock(dir)
4、最后返回return &Store{*lk, dir}, nil
Store数据结构如下所示:
type Store struct {
FileLock // FileLock wraps os.File to be used as a lock using flock
dataDir string // 默认为/var/lib/cni/networks/NETWORKNAME
}
// cni/plugins/ipam/host-local/backend/allocator/allocator.go
4、func NewIPAllocator(netName string, r Range, store backend.Store) *IPAllocator
1、调用rangeID := base64.URLEncoding.EncodeToString(r.RangeStart)
2、返回return &IPAllocator{......}
IPAllocator数据结构如下所示:
type IPAllocator struct {
netName string
ipRange Range
store backend.Store
rangeID string // Used for tracking last reserved ip
}
// cni/plugins/ipam/host-local/backend/allocator/allocator.go
5、func (a *IPAllocator) Get(id string, requestedIP net.IP) (*current.IPConfig, error)
1、调用gw := a.ipRange
2、如果requestedIP 不为nil,首先判断requestedIP和gw不能相等,否则报错
如果a.ipRange.IPInRange(requestedIP)返回错误,则报错,否则调用reserved, err := a.store.Reserve(id, requestedIP, a.rangeID)将结果保存
最后,设置reservedIP为requestedIP
3、如果requestedIP不为nil,先调用iter, err := a.GetIter(),再调用for循环遍历iter,获取下一个可用的IP,之后的动作和2中相同
4、最后返回return ¤t.IPConfig{....}, nil
CNI IPAM插件分析 --- 以hostlocal为示例的更多相关文章
- CNI bridge 插件实现代码分析
对于每个CNI 插件在执行函数cmdAdd之前的操作是完全一样的,即从环境变量和标准输入内读取配置.这在http://www.cnblogs.com/YaoDD/p/6410725.html这篇博文里 ...
- Kubernetes CNI网络插件
CNI 容器网络接口,就是在网络解决方案由网络插件提供,这些插件配置容器网络则通过CNI定义的接口来完成,也就是CNI定义的是容器运行环境与网络插件之间的接口规范.这个接口只关心容器的网络连接,在创建 ...
- 安装cni网络插件-非必须
安装cni网络插件 安装cni # 安装 cni # 百度云链接:https://pan.baidu.com/s/1-PputObLs5jouXLnuBCI6Q 密码:tzqm cd /server/ ...
- RocketMQ源码分析之从官方示例窥探:RocketMQ事务消息实现基本思想
摘要: RocketMQ源码分析之从官方示例窥探RocketMQ事务消息实现基本思想. 在阅读本文前,若您对RocketMQ技术感兴趣,请加入RocketMQ技术交流群 RocketMQ4.3.0版本 ...
- 利用webuploader插件上传图片文件,完整前端示例demo,服务端使用SpringMVC接收
利用WebUploader插件上传图片文件完整前端示例demo,服务端使用SpringMVC接收 Webuploader简介 WebUploader是由Baidu WebFE(FEX)团队开发的一 ...
- 3.kubernetes的CNI网络插件-Flannel
目录 1.1.K8S的CNI网络插件-Flannel 1.1.1.集群规划 1.1.2.下载软件.解压.软链接 1.1.3.最终目录结构 1.1.4.拷贝证书 1.1.5.创建配置 1.1.6.创建启 ...
- 基于RabbltMQ延迟插件实现延迟队列代码示例
上一篇文章写了docker安装RabbitMQ及延迟插件的安装,这篇的话是基于RabbitMQ延迟插件实现延迟队列的示例 那么废话不多说 直接上代码!! 首先创建延迟队列配置类 DelayedQueu ...
- 第十章 Kubernetes的CNI网络插件--flannel
1.简介 1.1前言 Kubernetes设计了网络模型,但却将它的实现讲给了网络插件,CNI网络插件最重要的功能就是实现Pod资源能够跨主机通信 常见的CNI网络插件如下: Flannel: Cac ...
- CNI portmap插件实现源码分析
DNAT创建的iptables规则如下:(重写目的IP和端口) PREROUTING, OUTPUT: --dst-type local -j CNI-HOSTPORT_DNAT // PREROU ...
随机推荐
- Binary Tree Postorder Traversal --leetcode
原题链接:https://oj.leetcode.com/problems/binary-tree-postorder-traversal/ 题目大意:后序遍历二叉树 解题思路:后序遍历二叉树的步骤: ...
- 并发insert情况下会发生重复的数据插入问题
1.背景 用多线程接收推送的订单数据,把接收的订单数据存到一个表中,实现的需求是:如果接收的订单消息在数据库中已经存在,那么执行update操作:如果没有存在,那么执行insert操作代码逻辑: if ...
- NYOJ 78 圈水池 (入门级凸包)
题目链接:nyoj 78 单调链凸包小结 题目讲解:本题考查的主要是凸包的用法,算是入门级的吧,当然前提是你接触过,平面几何: AC代码: #include<iostream> #inc ...
- 河南省第七届ACM程序设计大赛赛后总结
我们学校ACM集训开始于4月5号(清明节),5月25日在郑州解放军信息工程大学举办,集训耗时50天,但是感觉效果还行,但是也不是太好:我们也已经尽力了,虽然说只拿了个银牌,每份收获的背后,都会有辛勤的 ...
- mysql之slave_skip_errors选项
要说slave_skip_errors选项,就不得不提mysql的replication机制,总的来说它分了三步来实现mysql主从库的同步 master将改变记录到二进制日志(binary log) ...
- ORACLE修改列名与列类型
--修改列名 alter table 表名 rename column 旧列名 to 新列名; --修改列类型 )); 删除表的一列: alter table 表名 drop column 列名 给表 ...
- 如何在线制作gif图片?
最近想做个gif在线制作的网站,所以研究下了imagemagick和graphicsmagick制作gif图片站已经做出来了:有兴趣的朋友可以先看看http://www.sosogif.com/mak ...
- 简单的异步Socket实现——SimpleSocket_V1.1
简单的异步Socket实现——SimpleSocket_V1.1 笔者在前段时间的博客中分享了一段简单的异步.net的Socket实现.由于是笔者自己测试使用的.写的很粗糙.很简陋.于是花了点时间自己 ...
- hdu6005 Pandaland 想法+dijkstra
/** 题目:hdu6005 Pandaland 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6005 题意:给定一个带权无向图,求权值和最小的环的值,如 ...
- IntelliJ IDEA JDK配置
1.JDK环境 目前大多数IDE都没有集成JDK环境,IDEA也是一样,在使用IDEA之前首先要安装JDK,并且配置环境变量.与其他IDE不同之处在于,IDEA不会自动匹配系统的JDK环境,编译时会提 ...