一、什么是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. 容器编排系统K8s之包管理器helm基础使用(二)

    前文我们介绍了helm的相关术语和使用helm安装和卸载应用,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14305902.html:今天我们来介绍下自定义 ...

  2. Java运算符及包机制

    Java中的运算符及包机制 算术运算符:+ - * / % ++ -- 赋值运算符:=,+=,-=,*=,/= 关系运算符:>,<,>=,<=,==,!=,instanceof ...

  3. 001.IT运维面试问题-Linux基础

    Linux基础 简述Linux主流的发行版? Redhat.CentOS.Fedora.SuSE.Debian.Ubuntu.FreeBSD等. 简述Linux启动过程? ⑴开机BIOS自检,加载硬盘 ...

  4. 向HDFS中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾。

    1 import java.io.FileInputStream; 2 import java.io.IOException; 3 import java.text.SimpleDateFormat; ...

  5. Centos 7 安装 erlang

    https://www.cnblogs.com/swyy/p/11582309.html https://blog.csdn.net/qq_20492999/article/details/81254 ...

  6. python基础学习2 函数变量与赋值

    学习的第一步,就是通常的输出函数:print() 1.基础主要学习了变量的赋值,变量名可以疑字母.数字.下划线(_)进行命名,但是不能以数字开头 变量的赋值:变量名 = 变量值 2.模块的导入,和调用 ...

  7. kubenetes 相关命令(转载)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xingwangc2014/article/details/51204224好久没写博客了,前段时间公 ...

  8. linux下安装 zookeeper-3.4.9并搭建集群环境

    本文主要记录作者在实践过程中实现在centos7环境下安装zookeeper并搭建集群的详细步骤,关于zookeeper本文将不做详细介绍,安装步骤详情如下: 前提准备:3台linux服务器(因为zo ...

  9. hbase远程api调用, 远程连接开发,环境构建相关问题总结

    平时在开发的过程中,都是将hbase的环境装在虚拟机或者双系统上的,开发是直接在unix或者linux上进行的,这样对于使用上,有些繁琐. 下面我将介绍我在使用windows远程开发过程中的一些总结: ...

  10. Java 复习整理day06

    Java api 章节除了一下列的常用类别的用时候查文档 1 package com.it.demo01_api; 2 3 import java.util.Scanner; 4 5 /* 6 案例: ...