设为首页 收藏本站
查看: 1105|回复: 0

[经验分享] docker的网络-Container network interface(CNI)与Container network model(CNM)

[复制链接]

尚未签到

发表于 2018-1-5 18:13:15 | 显示全部楼层 |阅读模式
Overview
  目前围绕着docker的网络,目前有两种比较主流的声音,docker主导的Container network model(CNM)和社区主导的Container network interface(CNI)。本文就针对两者模型进行分别介绍。

Container Networking Interface

概述
  Container Networking Interface(CNI)提供了一种linux的应用容器的插件化网络解决方案。最初是由rkt Networking Proposal发展而来。也就是说,CNI本身并不完全针对docker的容器,而是提供一种普适的容器网络解决方案。因此他的模型只涉及两个概念:


  • 容器(container) : 容器是拥有独立linux网络命名空间的独立单元。比如rkt/docker创建出来的容器。
  这里很关键的是容器需要拥有自己的linux网络命名空间。这也是加入网络的必要条件。



  • 网络(network): 网络指代了可以相互联系的一组实体。这些实体拥有各自独立唯一的ip。这些实体可以是容器,是物理机,或者其他网络设备(比如路由器)等。
接口及实现
  CNI的接口设计的非常简洁,只有两个接口ADD/DELETE。
  以 ADD接口为例

Add container to network
  参数主要包括:


  • Version. CNI版本号
  • Container>. 这是一个可选的参数,提供容器的id
  • Network namespace path. 容器的命名空间的路径,比如 /proc/[pid]/ns/net。
  • Network configuration. 这是一个json的文档,具体可以参看network-configuration
  • Extra arguments. 其他参数
  • Name of the interface inside the container. 容器内的网卡名
  返回值:


  • IPs assigned to the interface. ipv4或者ipv6地址
  • DNS information. DNS相关信息
调用实现
  CNI的调用方式是通过一个可执行文件进行的。这里以calico为例,说明CNI插件的调用方式。
  首先,calico进行插件注册
mkdir -p /etc/cni/net.d  
$ cat >/etc/cni/net.d/10-calico.conf <<EOF
  
{
  &quot;name&quot;: &quot;calico-k8s-network&quot;,
  &quot;type&quot;: &quot;calico&quot;,
  &quot;etcd_authority&quot;: &quot;<ETCD_IP>:<ETCD_PORT>&quot;,
  &quot;log_level&quot;: &quot;info&quot;,
  
    &quot;ipam&quot;: {
  
        &quot;type&quot;: &quot;calico-ipam&quot;
  
    },
  
    &quot;policy&quot;: {
  
        &quot;type&quot;: &quot;k8s&quot;
  
    }
  
}
  
EOF
  k8s的DefaultCNIDir是/opt/cni/bin。因为注册的type是calico,所以k8s会从/opt/cni/bin中搜索一个calico的可执行文件,然后进行执行。
  执行的时候传递参数有两种方式,一种是通过环境变量进行传递,比如上文中的Version、Container>等;另外一种是通过执行calico作为执行的参数传进去,这个主要就是Network configuration的部分,通过json将其打包传入。
  同样判断是否执行成功,是通过执行文件的返回值获取的。0为成功,1为版本版本不匹配,2为存在不符合的字段。如果执行成功,返回值将通过stdout返回。

Container Network Model

概述
  相较于CNI,CNM是docker公司力推的网络模型。其主要模型如下图:
DSC0000.png


Sandbox
  Sandbox包含了一个容器的网络栈。包括了管理容器的网卡,路由表以及DNS设置。一种Sandbox的实现是通过linux的网络命名空间,一个FreeBSD Jail 或者其他类似的概念。一个Sandbox可以包含多个endpoints。

Endpoint
  一个endpoint将Sandbox连接到network上。一个endpoint的实现可以通过veth pair,Open vSwitch internal port 或者其他的方式。一个endpoint只能属于一个network,也只能属于一个sandbox。

Network
  一个network是一组可以相互通信的endpoints组成。一个network的实现可以是linux bridge,vlan或者其他方式。一个网络中可以包含很多个endpoints。

接口
  CNM的接口相较于CNI模型,较为复杂。其提供了remote plugin的方式,进行插件化开发。remote plugin相较与CNI的命令行,更加友好一些,是通过http请求进行的。remote plugin监听一个指定的端口,docker daemon直接通过这个端口与remote plugin进行交互。
  鉴于CNM的接口较多,这里就不一一展开解释了。这里主要介绍下在进行docker的操作中,docker daemon是如何同CNM插件繁盛交互。

调用过程

Create Network
  这一系列调用发生在使用docker network create的过程中。


  • /IpamDriver.RequestPool: 创建subnetpool用于分配IP
  • /IpamDriver.RequestAddress: 为gateway获取IP
  • /NetworkDriver.CreateNetwork: 创建neutron network和subnet
Create Container
  这一系列调用发生在使用docker run,创建一个contain的过程中。当然,也可以通过docker network connect触发。


  • /IpamDriver.RequestAddress: 为容器获取IP
  • /NetworkDriver.CreateEndpoint: 创建neutron port
  • /NetworkDriver.Join: 为容器和port绑定
  • /NetworkDriver.ProgramExternalConnectivity:
  • /NetworkDriver.EndpointOperInfo
Delete Container
  这一系列调用发生在使用docker delete,删除一个contain的过程中。当然,也可以通过docker network disconnect触发。


  • /NetworkDriver.RevokeExternalConnectivity
  • /NetworkDriver.Leave: 容器和port解绑
  • /NetworkDriver.DeleteEndpoint
  • /IpamDriver.ReleaseAddress: 删除port并释放IP
Delete Network
  这一系列调用发生在使用docker network delete的过程中。


  • /NetworkDriver.DeleteNetwork: 删除network
  • /IpamDriver.ReleaseAddress: 释放gateway的IP
  • /IpamDriver.ReleasePool: 删除subnetpool
CNI与CNM的转化
  CNI和CNM并非是完全不可调和的两个模型。二者可以进行转化。比如calico项目就是直接支持两种接口模型。
  从模型中来看,CNI中的container应与CNM的sandbox概念一致,CNI中的network与CNM中的network一致。在CNI中,CNM中的endpoint被隐含在了ADD/DELETE的操作中。CNI接口更加简洁,把更多的工作托管给了容器的管理者和网络的管理者。从这个角度来说,CNI的ADD/DELETE接口其实只是实现了docker network connect和docker network disconnect两个命令。
  kubernetes/contrib项目提供了一种从CNI向CNM转化的过程。其中原理很简单,就是直接通过shell脚本执行了docker network connect和docker network disconnect命令,来实现从CNI到CNM的转化。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-431981-1-1.html 上篇帖子: Kubernetes1.6发布跟踪 下篇帖子: 五、搭建kube-dns
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表