一、什么是CNI?

CNI-容器网络接口,CNI(容器网络接口)是Cloud Native Computing Foundation项目,由一个规范和库(用于编写用于在Linux容器中配置网络接口的插件)以及许多受支持的插件组成。CNI仅涉及容器的网络连接以及删除容器时删除分配的资源。由于这种关注,CNI具有广泛的支持,并且该规范易于实现。

规范外,此存储库还包含一个Go语言源代码,该库用于将CNI集成到应用程序中,以及一个示例命令行工具,用于执行CNI插件。一个单独的存储库包含参考插件和用于制作新插件的模板。

模板代码可以直接为现有的容器网络项目创建CNI插件。CNI还为从头创建新的容器网络项目提供了一个良好的框架。

二、为什么开发CNI?

Linux上的应用程序容器是一个快速发展的领域,在该领域内,由于高度特定于环境,因此无法很好地解决网络问题。我们相信,许多容器运行时和协调器将寻求解决使网络层可插入的相同问题。

为避免重复,我们认为在网络插件和容器执行之间定义一个通用接口是谨慎的:因此,我们提出了该规范,以及Go库和一组插件。

三、谁在使用CNI?

容器运行时

第三方插件

CNI团队还在单独的存储库中维护了一些核心插件

四、接口参数

网络插件是独立的可执行文件,被上层的容器管理平台调用。网络插件只有两件事情要做:把容器加入到网络以及把容器从网络中删除。调用插件的数据通过两种方式传递:环境变量和标准输入。一般插件需要三种类型的数据:容器相关的信息,比如 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 协议的内容还在不断更新,请到官方文档获取当前的信息。

五、kubernets中的使用

CNI 目前已经在 kubernetes 中开始使用,也是目前官方推荐的网络方案,具体的配置方法可以参考kubernetes 官方文档

kubernetes 使用了 CNI 网络插件之后,工作过程是这样的:

  • kubernetes 先创建 pause 容器生成对应的 network namespace
  • 调用网络 driver(因为配置的是 CNI,所以会调用 CNI 相关代码)
  • CNI driver 根据配置调用具体的 cni 插件
  • cni 插件给 pause 容器配置正确的网络
  • pod 中其他的容器都是用 pause 的网络

【原创】kubernetes之CNI理解的更多相关文章

  1. 【原创】我所理解的自动更新-APP发布与后台发布

    发布后台 创建渠道:添加新的渠道,设置渠道名称,自动生成渠道id.    查看渠道:查看渠道基本信息,渠道app版本号,资源版本号,是否开启更新.    创建/更新APP:选择打包ios,androi ...

  2. 【原创】我所理解的自动更新-外网web服务器配置

    ClientDownload和ClientUpdate共享渠道配置信息: channel-0.php //以appstore的渠道为例 <?php define('APPNAME', 'TOKE ...

  3. Kubernetes重要概念理解

    Kubernetes重要概念理解 kubernetes是目前最主流的容器编排工具,是下一代分布式架构的王者.2018年的kubernetes第一个版本1.10已经发布.下面整理一下,kubernete ...

  4. 转 Kubernetes 入门 概念理解

    你闺女也能看懂的插画版Kubernetes指南 原创  2016-06-30 作者 周小璐 译 编者按:Matt Butcher是Deis的平台架构师,热爱哲学,咖啡和精雕细琢的代码.有一天女儿走进书 ...

  5. Kubernetes系列之理解K8s Service的几种模式

    今天给大家介绍下k8s的service的几种访问模式. 概述 我们知道pod的ip不是固定的,是根据所在宿主机的docker0网卡生成的,每次重启,更新,调度等情况IP都会变,那pod与pod之间需要 ...

  6. 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.创建启 ...

  7. kubernetes/k8s CNI分析-容器网络接口分析

    关联博客:kubernetes/k8s CSI分析-容器存储接口分析 kubernetes/k8s CRI分析-容器运行时接口分析 概述 kubernetes的设计初衷是支持可插拔架构,从而利于扩展k ...

  8. 第十章 Kubernetes的CNI网络插件--flannel

    1.简介 1.1前言 Kubernetes设计了网络模型,但却将它的实现讲给了网络插件,CNI网络插件最重要的功能就是实现Pod资源能够跨主机通信 常见的CNI网络插件如下: Flannel: Cac ...

  9. kubernetes dns 初步理解和使用 dnsmasq dns服务器跟host机器同步

    1.安装DNS后,pod就可以通过dns来解析service,从而实现通信 2.创建一个dns测试工具pod apiVersion: extensions/v1beta1 kind: Deployme ...

随机推荐

  1. toad for oracle自定义快捷sql

    View--->Toad Options--->Behavior--->Auto replace--->

  2. LuoguP5488 差分与前缀和

    题意 给定一个长为\(n\)的序列\(a\),求出其\(k\)阶差分或前缀和.结果的每一项都需要对\(1004535809\)取模. 打表找规律 先看前缀和,设\(n=5\),\(k=4\),按照阶从 ...

  3. 关于SQL Server 镜像数据库快照的创建及使用

    从SQL Server 2005 SP 起,SQL 开始支持数据库镜像.它的设计目的是试图为SQL Server 提供一个具有实时性数据同步的灾难恢复技术,即能够提供数据冗余备份,切换起来比较方便.每 ...

  4. Java基础复习4

    选择排序(擂台排序): public class demo1 {     public static void main(String[] args) {          // TODO Auto- ...

  5. Java 8中字符串拼接新姿势:StringJoiner

    介绍 StringJoiner是java.util包中的一个类,用于构造一个由分隔符分隔的字符序列(可选),并且可以从提供的前缀开始并以提供的后缀结尾.虽然这也可以在StringBuilder类的帮助 ...

  6. Linux下双网卡双ip-双外网网关-电信联通双线主机设置

    1.实现:通过运营商提供的智能DNS,把电信用户访问时,数据进电信的网卡,出来时也从电信的网关出来,访问联通时,从联通网卡时,联通网卡出.这样速度就会快,实现双线主机的功能. 2.网卡信息:电信IP( ...

  7. YARN运行流程

  8. php artisan db:seed 报错

    在laravel 5中执行,要执行数据填充时报如下错误 php artisan db:seed 错误: [ReflectionException]                        Cla ...

  9. Serverless对研发效能的变革和创新 云托管和Serverless应用差异

    https://mp.weixin.qq.com/s/J4RXtKanh3IMr4fY7t0nyQ Serverless对研发效能的变革和创新 杨皓然(不瞋) 阿里巴巴中间件 2020-10-23

  10. Service Mesh架构的持续演进 单体模块化 SOA 微服务 Service Mesh

    架构不止-严选Service Mesh架构的持续演进 网易严选 王育松 严选技术团队 2019-11-25 前言同严选的业务一样,在下层承载它的IT系统架构一样要生存.呼吸.增长和发展,否则过时的.僵 ...