CNI:容器网络接口
不管是 docker 还是 kubernetes,在网络方面目前都没有一个完美的、终极的、普适性的解决方案,不同的用户和企业因为各种原因会使用不同的网络方案。目前存在网络方案 flannel、calico、openvswitch、weave、ipvlan等,而且以后一定会有其他的网络方案,这些方案接口和使用方法都不相同,而不同的容器平台都需要网络功能,它们之间的适配如果没有统一的标准,会有很大的工作量和重复劳动。
CNI就是这样一个标准,它旨在为容器平台提供网络的标准化。不同的容器平台(比如目前的 kubernetes、mesos 和 rkt)能够通过相同的接口调用不同的网络组件。
CNI(Conteinre Network Interface) 是 google 和 CoreOS 主导制定的容器网络标准,它 本身并不是实现或者代码,可以理解成一个协议。这个标准是在 rkt 网络提议 的基础上发展起来的,综合考虑了灵活性、扩展性、ip 分配、多网卡等因素。
这个协议连接了两个组件:容器管理系统和网络插件。它们之间通过 JSON 格式的文件进行通信,实现容器的网络功能。具体的事情都是插件来实现的,包括:创建容器网络空间(network namespace)、把网络接口(interface)放到对应的网络空间、给网络接口分配 IP 等等。
关于网络,docker 也提出了 CNM 标准,它要解决的问题和CNI是重合的,也就是说目前两者是竞争关系。目前 CNM 只能使用在 docker 中,而CNI可以使用在任何容器运行时。CNM 主要用来实现 docker 自身的网络问题,也就是 docker network
子命令提供的功能。
官方网络插件
所有的标准和协议都要有具体的实现,才能够被大家使用。CNI也不例外,目前官方在 github 上维护了同名的CNI代码库,里面已经有很多可以直接拿来使用的CNI插件。
官方提供的插件目前分成三类:main、meta 和 ipam。main 是主要的实现了某种特定网络功能的插件;meta 本身并不会提供具体的网络功能,它会调用其他插件,或者单纯是为了测试;ipam 是分配 IP 地址的插件。
ipam 并不提供某种网络功能,只是为了灵活性把它单独抽象出来,这样不同的网络插件可以根据需求选择 ipam,或者实现自己的 ipam。
这些插件的功能说明如下:
main
loopback:这个插件很简单,负责生成
lo
网卡,并配置上127.0.0.1/8
地址bridge:和 docker 默认的网络模型很像,把所有的容器连接到虚拟交换机上
macvlan:使用 macvlan 技术,从某个物理网卡虚拟出多个虚拟网卡,它们有独立的 ip 和 mac 地址
ipvlan:和 macvlan 类似,区别是虚拟网卡有着相同的 mac 地址
ptp:通过 veth pair 在容器和主机之间建立通道
meta
flannel:结合 bridge 插件使用,根据 flannel 分配的网段信息,调用 bridge 插件,保证多主机情况下容器
ipam
host-local:基于本地文件的 ip 分配和管理,把分配的 IP 地址保存在文件中
dhcp:从已经运行的dhcp服务器中获取 ip 地址
接口参数
网络插件是独立的可执行文件,被上层的容器管理平台调用。网络插件只有两件事情要做:把容器加入到网络以及把容器从网络中删除。调用插件的数据通过两种方式传递:环境变量和标准输入。一般插件需要三种类型的数据:容器相关的信息,比如 ns 的文件、容器 id 等;网络配置的信息,包括网段、网关、DNS 以及插件额外的信息等;还有就是CNI本身的信息,比如CNI插件的位置、添加网络还是删除网络。
我们来看一下为容器添加网络是怎么工作的,删除网络和它过程一样。
把容器加入到网络
调用插件的时候,这些参数会通过环境变量进行传递:
CNI_COMMAND
:要执行的操作,可以是ADD
(把容器加入到某个网络)、DEL
(把容器从某个网络中删除)CNI_CONTAINERID
:容器的 ID,比如 ipam 会把容器 ID 和分配的 IP 地址保存下来。可选的参数,但是推荐传递过去。需要保证在管理平台上是唯一的,如果容器被删除后可以循环使用CNI_NETNS
:容器的 network namespace 文件,访问这个文件可以在容器的网络 namespace 中操作CNI_IFNAME
:要配置的 interface 名字,比如eth0
CNI_ARGS
:额外的参数,是由分号;
分割的键值对,比如 “FOO=BAR;hello=world”CNI_PATH:CNI
二进制查找的路径列表,多个路径用分隔符:
分隔
网络信息主要通过标准输入,作为 JSON 字符串传递给插件,必须的参数包括:
cniVersion:CNI
标准的版本号。因为CNI在演化过程中,不同的版本有不同的要求name
:网络的名字,在集群中应该保持唯一type
:网络插件的类型,也就是CNI可执行文件的名称args
:额外的信息,类型为字典ipMasq
:是否在主机上为该网络配置 IP masqueradeipam
:IP 分配相关的信息,类型为字典dns
:DNS 相关的信息,类型为字典
插件接到这些数据,从输入和环境变量解析到需要的信息,根据这些信息执行程序逻辑,然后把结果返回给调用者,返回的结果中一般包括这些参数:
IPs assigned to the interface:网络接口被分配的 ip,可以是 IPv4、IPv6 或者都有
DNS 信息:包含 nameservers、domain、search domains 和其他选项的字典
CNI协议的内容还在不断更新,请到官方文档获取当前的信息。
CNI的特性
CNI作为一个协议/标准,它有很强的扩展性和灵活性。如果用户对某个插件有额外的需求,可以通过输入中的 args
和环境变量CNI_ARGS
传输,然后在插件中实现自定义的功能,这大大增加了它的扩展性;CNI插件把 main 和 ipam 分开,用户可以自由组合它们,而且一个CNI插件也可以直接调用另外一个CNI插件,使用起来非常灵活。
如果要实现一个继承性的CNI插件也不复杂,可以编写自己的CNI插件,根据传入的配置调用 main 中已经有的插件,就能让用户自由选择容器的网络。
在 kubernetes 中的使用
CNI目前已经在 kubernetes 中开始使用,也是目前官方推荐的网络方案,具体的配置方法可以参考kubernetes 官方文档。
kubernetes 使用了CNI网络插件之后,工作过程是这样的:
kubernetes 先创建 pause 容器生成对应的 network namespace
调用网络 driver(因为配置的是CNI,所以会调用CNI相关代码)
cni driver 根据配置调用具体的cni插件
cni 插件给 pause 容器配置正确的网络
pod 中其他的容器都是用 pause 的网络
转载于:https://blog.51cto.com/tsing/1982786
相关文章:

马云:你改变不了特朗普,你连你妈都改变不了,你要改变你自己
整理 | 非主流出品 | AI 科技大本营1 月 3 日,世界浙商上海论坛暨上海市浙江商会第十次会员代表大会在上海举行。马云在大会上发表主题演讲,依旧金句频出。回望 2018,马云表示,「2018 年确实很不容易,但是大家都度过了…

简述Field,Attribute,Property的区别
您要是关注我这个,说明您是行内人,那我就开门见山了,用代码来诠释吧 //Fieldprotectedstring_Version;//Attribute[XmlElement("Version")]//PropertypublicstringVersion{ set{ _Version value; } get{ return_Version; }}转载…

添加Soap头来增加Web Service的安全性
myService.asmx.cs 添加类:MyHeader 从 System.Web.Services.Protocols.SoapHeader继承 完整的代码如下usingSystem;usingSystem.Collections;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Diagnostics;usingSystem.Web;usingSystem.Web.Services;//对…

BAT七年经验,却抵不过外企面试的两道算法题?
整理| 琥珀 出品| AI科技大本营又遇年底跳槽季,如果你曾在 BAT 等互联网大厂有过较为丰富的工作经验,想要换份工作,面试时会主要考虑哪些因素?面试外企,却被两道算法题难住?近日,一位网友在脉脉…

#Ruby# Introspect (1)
Introspect,内省,是指从程序自身出发,审视程序各方面的能力。这个过程又称为Reflection,反射。 孔子曰,吾日三省吾身。于人于程序,内省都是非常重要的。 1. Looking at objects ObjectSpace.each_object([…

java.lang.IllegalMonitorStateException 异常出现原因
java.lang.IllegalMonitorStateException 违法的监控状态异常。当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时,抛出该异常。 例子: //计算线程 //获取计算…

Tomcat init 脚本并添加服务自启动
很多用源码编译安装和一些用tar包直接解压缩的java程序都没有init脚本,不能像httpd或者nginx这种服务直接使用service httpd start,也不能使用/etc/init.d/httpd start 来启动。对于这种情况,我们可以自己写一个init脚本,并将命令…

算法 | 动画+解析,轻松理解「Trie树」
Trie这个名字取自“retrieval”,检索,因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词。 虽然发音与「Tree」一致,但为了将这种 字典树 与 普通二叉树 以示区别,程序员小吴一般读「Trie」尾部会重读一声,可…

#Ruby# Introspect (2)
3. Looking at Classes superclass > get the parent of any particular class ancestors > get both superclasses and mixin modules 在Ruby1.9中,任何未指定的class都继承自Object,而Object继承自BasicObject,BasicObject无supercla…

国内ITSM解决方案-UNIPER
UNIPER是行业领先的ITSM解决方案提供商。参与了ITIL V3的开发与实践,是中国ITSM行业推动者之一,方案包括服务台,事件和问题管理,变更和配置管理,服务等级管理,IT运营绩效考评,主动计划任务管理&…

清华首批7门标杆课程,到底有多牛?
整理 | Jane出品 | AI科技大本营近日,清华大学公布首批七门标杆课程。什么是标杆课程?据清华大学官方介绍,此项评选是 2018 年 4 月启动的,由各院系推荐、教务处形式审查。本次最终确定了 26 门课程参加评审,并于 2018…

我的Rails笔记(1)
《Agile Web Development With Rails》Notebook. 环境: Rails 3.1.0 Gem 1.8.10 Ruby ruby 1.9.2p180 1. rails depot 2. rails generate scaffold Product title:string description:text image_url:string price:decimal 报错:/1.9.1/gems/execj…

资源 | 斯坦福最新NLP课程上线,选择PyTorch放弃TensorFlow
整理 | Jane 出品 | AI科技大本营 今天在斯坦福大学 2019 年冬季 CS224n 最新课程已经正式更新到官网啦。新一年,大家可以开始跟着名校课程学起来啦~今年一个非常大的变化就是所有内容实现都使用 PyTorch,不再使用 TensorFlow。内容设计方面新增了 Tra…

推荐本人微博及浅谈发博原则
本人新浪微博:http://weibo.com/jinbinforever 花了一些力气,将关注数降到100以下,以后原则上关注数不会增加了。发现这样做的好处非常明显,减少了很多无谓的信息干扰。less is more,做减法能让自己收获更多࿰…

Lintcode108 Palindrome Partitioning || solution 题解
【题目描述】Given a strings, cutsinto some substrings such that every substring is a palindrome.Return the minimum cuts needed for a palindrome partitioning ofs.给定一个字符串s,将s分割成一些子串,使每个子串都是回文。返回s符合要求的的最…

发现价值(1)-无限的网络资源
Google发布Google wave的新闻甚嚣尘上.匆匆忙忙间,我也第一时间浏览了这个未来的杀手级应用.不得不赞叹Google强大创新力的同时,又不得不在自己的 to-read-list 上多了一个标签. 仅仅是read是不能产生任何价值的,对于技术我们需要dive into it.这点我明白,但是还是常常陷入浩如…

Ruby的Singleton method
Ruby中,特定于某一对象的方法被称为Singleton method。 例如: a "string"def a.runputs "#{self} run" endstr.run # >#string run run方法是特定于a这个对象的,故run方法是a的Singleton方法。 实现上,当…
AD ---- 活动目录的日常管理操作
管理信任关系:什么是信任关系:信任关系是用于确保一个域的用户可以访问和使用另一个域中资源的安全机制 根据传递性分,信任关系可分为可传递信任关系和不可传递信任关系两种 根据域之间关系分,Windows信任关系则可分为四种 信任关系是如何工作的 创建信任关系 删除信任关系 …

07.GitHub实战系列~7.Git之VS2013团队开发(如果不想了解git命令直接学这篇即可)...
GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html —————————————————————————————————————————————————————— 直接实战~(如果你之前安装了git其他版本都可以卸载了~这个就够了…

公开课报名 | 深入浅出理解A3C强化学习
强化学习是一种比较传统的人工智能手段,在近年来随着深度学习的发展,强化学习和深度学习逐渐结合在了一起。这种结合使得很多原来无法想象的工作有了可能,最令我们瞩目的莫过于AlphaGo战胜李世石,以及OpenAI团队的机器人可以在团战…

Hibernate是啥?
1:Hibernate和JDBC、ODBC的作用是一样的、用来访问、操作数据库的。它的优势在哪?没用过、我也不知道。。。不过貌似【数据持久化】是个关键词。[下边是百科里的一段话:对象上数据的修改,Hibernate框架会把这种修改同步到数据库中…

#Java夜未眠# 读书笔记
微博上的蔡学镛是个有趣的家伙,有条微博这样写道: “记得十多年前我的第一本书出版时,我隔几天就到书店微服出巡,看看状况。当看到有人拿起我的书时,我内心的口白:"英明英明,你可真识货呀…

asp.net 控制页面css样式
asp.net 控制页面css样式fontDiv.Style["display"] "none";fontDiv.Style["display"] "";转载于:https://www.cnblogs.com/qiantuwuliang/archive/2009/06/02/1494709.html

腾讯AI Lab负责人张潼离职,张正友或接替其位
来源 | 网易智能 刚刚,据知情人士透露,腾讯人工智能实验室 AI Lab 主任张潼已经从腾讯离职,未来将重返学术界。 关于该消息,腾讯方面目前尚无回应。 网易智能独家获悉,AI Lab接手人是机器人实验室的张正友。 有消息…

频频霸榜的Python,竟遭开发者嫌弃!
在刚刚过去的 2018 年里,要说最热门的科技领域是哪一个?毋庸置疑的是,人工智能必排在前列;而要论编程语言界,最流行的编程语言是谁?那非 Python 莫属。2018 年 8 月,根据一年一度的 IEEE Spectr…

#每天一种设计模式# 观察者模式
系统常常会出现这种情况: 每一个部分需要知道整体的状态。比如Excel中,当你修改了一个单元格的值,可能横列的sum需要改变,纵列的sum需要改变,根据这个单元格做的图需要改变,是否被修改的按钮需要激活... 如…

el-input怎么绑定回车事件
在 Vue 2.0 中,为自定义组件绑定原生事件必须使用 .native 修饰符:<el-input v-model"queryForm.skuName" placeholder"请输入商品名称" keyup.enter.native"skuNameSearch"></el-input> 转载于:https://www.…

DOS命令大全(经典收藏)
http://wuhua.javaeye.com/blog/32374 net use \\ip\ipc$ " " /user:" " 建立IPC空链接 net use \\ip\ipc$ "密码" /user:"用户名" 建立IPC非空链接 net use h: \\ip\c$ "密码" /user:"用户名" 直接登陆后映射对…

Ruby Metaprogramming
Ruby使用者对attr_accessor一定不会陌生。 class Aattr_accessor :num end 等效于: class Adef numnumenddef (value)num valueend end 在类的定义中,attr_accessor定义了num的读写方法,只用了一行代码就生成了两个实例方法,很…

四川大学线下编程比赛第一题:数字填充
四川大学线下编程比赛第一题:数字填充公布公司:有 效 期:CSDN 2014-09-27至2015-09-26 难 度 等 级:答 题 时 长:编程语言要求:120分钟C C Java C#题目详情peter喜欢玩数字游戏。但数独这种游戏对他来说太简…