CNI:容器网络接口

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 masquerade

  • ipam: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

CNI:容器网络接口相关推荐

  1. 深入理解CNI(容器网络接口)

    原文 CNI简介 容器网络的配置是一个复杂的过程,为了应对各式各样的需求,容器网络的解决方案也多种多样,例如有flannel,calico,kube-ovn,weave等.同时,容器平台/运行时也是多 ...

  2. CNI:容器网络接口详解

    CNI 简介 不管是 docker 还是 kubernetes,在网络方面目前都没有一个完美的.终极的.普适性的解决方案,不同的用户和企业因为各种原因会使用不同的网络方案.目前存在网络方案 flann ...

  3. kubernetes不同的命名空间下的容器能通信吗_超长干货 | Kubernetes命名空间详解

    本文中,我们将探索Kubernetes命名空间,它是集群中组织和管理对象的一种方式. 介 绍 Kubernetes集群可以同时管理大量互不相关的工作负载,而组织通常会选择将不同团队创建的项目部署到共享 ...

  4. kubelet配置cni插件_Kubernetes CNI网络插件

    CNI 容器网络接口,就是在网络解决方案由网络插件提供,这些插件配置容器网络则通过CNI定义的接口来完成,也就是CNI定义的是容器运行环境与网络插件之间的接口规范.这个接口只关心容器的网络连接,在创建 ...

  5. 1.Containerd容器运行时初识与尝试

    0x00 前言简述 1.基础介绍 2.专业术语 3.架构简述 0x01 安装配置 1.Ubuntu安装Containerd.io流程 0x02 简单使用 1.镜像拉取与运行 2.创建和使用网络 3.与 ...

  6. k8s 查看ip地址属于哪个pod_Kubernetes Pod 如何获取 IP 地址

    [编者的话]在学习 Kubernetes 网络模型的过程中,了解各种网络组件的作用以及如何交互非常重要.本文就介绍了各种网络组件在 Kubernetes 集群中是如何交互的,以及如何帮助每个 Pod ...

  7. 追踪 Kubernetes 中的网络流量

    作者 | Addo Zhang 来源 | 云原生指北 译者注: 这篇文章很全面的罗列出了 Kubernetes 中涉及的网络知识,从 Linux 内核的网络内容,到容器.Kubernetes,一一进行 ...

  8. openstack horizon dashboard_OpenStack最新版本:Ussuri发布亮点

    前言 又到了半年一次的OpenStack的发布日期,至今发布已有21个版本,如今已经更加稳定,更加强健.近几年,docker,k8s,serverless等新技术风头之盛可谓一时无两,而OpenSta ...

  9. kubernetes完整学习笔记

    markdown文档笔记下载地址:https://install-data.oss-cn-hongkong.aliyuncs.com/%E7%AC%94%E8%AE%B0/kubernetes%E5% ...

最新文章

  1. android.os.NetworkOnMainThreadException异常
  2. 安装librosa遇到LLVM问题原因是numba问题
  3. Ember——在构建Ember应用程序时,我们会使用到六个主要部件:应用程序(Application)、模型(Model)、视图(View)、模板(Template)、路由(...
  4. 如何获取Oracle数据库中某表及索引、约束、触发器、对象权限的创
  5. .Net轻量状态机Stateless
  6. php只显示一部分文章,typecho同一个页面下调用不同分类的文章但是却只显示一个分类文章...
  7. android image设置adjustviewbounds_探索 Android 平台的 CameraX
  8. AJAX学习笔记(基本使用,请求参数传递,获取服务端响应,错误处理,低版本IE浏览器缓存问题及解决)
  9. Pandas出现KeyError及其分析解决
  10. 不拥抱算法的张小龙,还能带着微信继续避免失败?
  11. 基于multisim的fm调制解调_基于SDR的FM调制与解调器的实现
  12. android应用程序后台运行权限,检查Android应用程序是否在后台运行
  13. 计算机文件丢失系统无法启动,windows7文件丢失无法启动怎么修复_win7系统显示文件丢失无法启动修复方法-win7之家...
  14. 华南理工大学计算机学院创新班,高校纷推创新班揽生源 逐步淘汰冷门专业
  15. Android 拦截音量键并屏蔽系统的音量调节
  16. 计算机英语单词练习五
  17. 月末关账流程和政策规定
  18. 3D音频再现理论研究(一)---3D音频技术历史介绍(转)
  19. 用python进行数据分析葡萄酒,哪里最好
  20. [048量化交易]python获取股票 量比 换手率 市盈率-动态 市净率 总市值 流通市值写入数据库MongoDB

热门文章

  1. 董东 java_Java面向对象程序设计
  2. activiti工作流连接mysql_Activiti工作流 安装myeclipse activiti设计插件并生成数据库表...
  3. 非此即彼的逻辑错误_超全MBA逻辑答题口诀,快收藏!
  4. postgres 显示变量_postgre 查询时 postgres=# 变成 ! ! 要怎么解决?
  5. 施工管理在计算机上的应用论文,【计算机专业毕业论文】关于计算机应用技术在工程项目管理中的应用...
  6. java uiautomation_Java UiAutomation類代碼示例
  7. linux mysql远程链接_Linux下mysql实现远程连接
  8. div 自动换行_js自动打字--autotypejs
  9. 【web】将一个jar包更改成war包
  10. 微信小程序多项选择器_微信小程序三级联动之多列选择器