认识一下容器网络接口 CNI

news2025/1/12 17:59:57

写在最前,周末写到这篇的时候我就发现可能是给自己挖了很大的坑,整个 Kubernetes 网关相关的内容会非常复杂且庞大。

  • 深入探索 Kubernetes 网络模型和网络通信
  • 认识一下容器网络接口 CNI(本篇)
  • 源码分析:从 kubelet、容器运行时看 CNI 的使用
  • 从 Flannel 学习 Kubernetes VXLAN 网络
  • Cilium CNI 与 eBPF
  • ...

看自己能学到哪一步~


在 《深入探索 Kubernetes 网络模型和网络通信》 文章中,我们介绍了网络命名空间(network namespace) 如何在 Kubernetes 网络模型中工作,通过示例分析 pod 间的流量传输路径。整个传输过程需要各种不同组件的参与才完成,而这些组件与 pod 相同的生命周期,跟随 pod 的创建和销毁。容器的维护由 kubelet 委托给容器运行时(container runtime)来完成,而容器的网络命名空间则是由容器运行时委托网络插件共同完成。

  • 创建 pod(容器)的网络命名空间
  • 创建接口
  • 创建 veth 对
  • 设置命名空间网络
  • 设置静态路由
  • 配置以太网桥接器
  • 分配 IP 地址
  • 创建 NAT 规则
  • ...

上篇我们也提到不同网络插件对 Kubernetes 网络模型有不同的实现,主要集中在跨节点的 pod 间通信的实现上。用户可以根据需要选择合适的网络插件,这其中离不开 CNI(container network interface)。这些网络插件都实现了 CNI 标准,可以与容器编排系统和运行时良好的集成。

runtime-with-cni

CNI 是什么

CNI 是 CNCF 下的一个项目,除了提供了最重要的 规范 、用来 CNI 与应用集成的 库、实行 CNI 插件的 CLI cnitool,以及 可引用的插件。本文发布时,最新版本为 v1.1.2。

CNI 只关注容器的网络连接以及在容器销毁时清理/释放分配的资源,也正因为这个,即使容器发展迅速,CNI 也依然能保证简单并被 广泛支持。

CNI 规范

CNI 的规范涵盖了以下几部分:

  • 网络配置文件格式
  • 容器运行时与网络插件交互的协议
  • 插件的执行流程
  • 将委托其他插件的执行流程
  • 返回给运行时的执行结果数据类型

1. 网络配置格式

这里贴出规范中的配置示例,规范 中定义了网络配置的格式,包括必须字段、可选字段以及各个字段的功能。示例使用定义了名为 dbnet 的网络,配置了插件 bridgetuning,这两个插件。

CNI 的插件一般分为两种:

  • 接口插件(interface plugin):用来创建网络接口,比如示例中的 bridge
  • 链式插件(chained):用来调整已创建好的网络接口,比如示例中的 tuning
{
  "cniVersion": "1.0.0",
  "name": "dbnet",
  "plugins": [
    {
      "type": "bridge",
      // plugin specific parameters
      "bridge": "cni0",
      "keyA": ["some more", "plugin specific", "configuration"],

      "ipam": {
        "type": "host-local",
        // ipam specific
        "subnet": "10.1.0.0/16",
        "gateway": "10.1.0.1",
        "routes": [
            {"dst": "0.0.0.0/0"}
        ]
      },
      "dns": {
        "nameservers": [ "10.1.0.1" ]
      }
    },
    {
      "type": "tuning",
      "capabilities": {
        "mac": true
      },
      "sysctl": {
        "net.core.somaxconn": "500"
      }
    },
    {
        "type": "portmap",
        "capabilities": {"portMappings": true}
    }
  ]
}

2. 容器运行时与网络插件交互的协议

CNI 为容器运行时提供 四个不同的操作:

  • ADD - 将容器添加到网络,或修改配置
  • DEL - 从网络中删除容器,或取消修改
  • CHECK - 检查容器网络是否正常,如果容器的网络出现问题,则返回错误
  • VERSION - 显示插件的版本

规范对操作的输入和输出内容进行了定义。主要几个核心的字段有:

  • CNI_COMMAND:上面的四个操作之一
  • CNI_CONTAINERID:容器 ID
  • CNI_NETNS:容器的隔离域,如果用的网络命名空间,这里的值是网络命名空间的地址
  • CNI_IFNAME:要在容器中创建的接口名,比如 eth0
  • CNI_ARGS:执行参数时传递的参数
  • CNI_PATH:插件可执行文件的朝招路径

3. 插件的执行流程

CNI 将容器上网络配置的 ADDDELETECHECK 操作,成为附加(attachment)。

容器网络配置的操作,需要一个或多个插件的共同操作来完成,因此插件有一定的执行顺序。比如前面的示例配置中,要先创建接口,才能对接口进行调优。

ADD 操作为例,首先执行的一般是 interface plugin,然后在执行 chained plugin。以前一个插件的 输出 PrevResult 与下一个插件的配置会共同作为下一个插件的 输入。 如果是第一个插件,会将网络配置作为输入的一部分。插件可以将前一个插件的 PrevResult 最为自己的输出,也可以结合自身的操作对 PrevResult 进行更新。最后一个插件的输出 PrevResult 作为 CNI 的执行结果返回给容器运行时,容器运行时会保存改结果并将其作为其他操作的输入

DELETE 的执行与 ADD 的顺序正好相反,要先移除接口上的配置或者释放已经分配的 IP,最后才能删除容器网络接口。DELETE 操作的输入就是容器运行时保存的 ADD 操作的结果。

cni-plugin-execution-flow

除了定义单次操作中插件的执行顺序,CNI 还对操作的并行操作、重复操作等进行了说明。

4. 插件委托

有一些操作,无论出于何种原因,都不能合理地作为一个松散的链接插件来实现。相反,CNI 插件可能希望将某些功能委托给另一个插件。一个常见的例子是 IP 地址管理(IP Adress Management,简称 IPAM),主要是为容器接口分配/回收 IP 地址、管理路由等。

CNI 定义了第三种插件 -- IPAM 插件。CNI 插件可以在恰当的时机调用 IPAM 插件,IPAM 插件会将执行的结果返回给委托方。IPAM 插件会根据指定的协议(如 dhcp)、本地文件中的数据、或者网络配置文件中 ipam 字段的信息来完成操作:分配 IP、设置网关、路由等等。

"ipam": {
  "type": "host-local",
  // ipam specific
  "subnet": "10.1.0.0/16",
  "gateway": "10.1.0.1",
  "routes": [
      {"dst": "0.0.0.0/0"}
  ]
}

5. 执行结果

插件可以返回一下三种结果之一,规范对 结果的格式 进行了定义。

  • Success:同时会包含 PrevResult 信息,比如 ADD 操作后的 PrevResult 返回给容器运行时。
  • Error:包含必要的错误提示信息。
  • Version:这个是 VERSION 操作的返回结果。

CNI 的库是指 libcni,用于 CNI 和应用程序集成,定义了 CNI 相关的接口和配置。

type CNI interface {  
   AddNetworkList(ctx context.Context, net *NetworkConfigList, rt *RuntimeConf) (types.Result, error)  
   CheckNetworkList(ctx context.Context, net *NetworkConfigList, rt *RuntimeConf) error  
   DelNetworkList(ctx context.Context, net *NetworkConfigList, rt *RuntimeConf) error  
   GetNetworkListCachedResult(net *NetworkConfigList, rt *RuntimeConf) (types.Result, error)  
   GetNetworkListCachedConfig(net *NetworkConfigList, rt *RuntimeConf) ([]byte, *RuntimeConf, error)  

   AddNetwork(ctx context.Context, net *NetworkConfig, rt *RuntimeConf) (types.Result, error)  
   CheckNetwork(ctx context.Context, net *NetworkConfig, rt *RuntimeConf) error  
   DelNetwork(ctx context.Context, net *NetworkConfig, rt *RuntimeConf) error  
   GetNetworkCachedResult(net *NetworkConfig, rt *RuntimeConf) (types.Result, error)  
   GetNetworkCachedConfig(net *NetworkConfig, rt *RuntimeConf) ([]byte, *RuntimeConf, error)  

   ValidateNetworkList(ctx context.Context, net *NetworkConfigList) ([]string, error)  
   ValidateNetwork(ctx context.Context, net *NetworkConfig) ([]string, error)  
}

以添加网络的部分代码为例:

func (c *CNIConfig) addNetwork(ctx context.Context, name, cniVersion string, net *NetworkConfig, prevResult types.Result, rt *RuntimeConf) (types.Result, error) {  
   ...
   return invoke.ExecPluginWithResult(ctx, pluginPath, newConf.Bytes, c.args("ADD", rt), c.exec)  
}

执行的逻辑简单来说就是:

  1. 查找可执行文件
  2. 加载网络配置
  3. 执行 ADD 操作
  4. 结果处理

总结

这篇学习了 CNI 规范的内容、网络插件的执行流程,对 CNI 抽象的网络管理接口有了大致的了解。

下一篇将结合源码的分析,了解 kubelet、容器运行时、CNI 网络插件之间如何进行交互。

参考

  • https://www.tigera.io/learn/guides/kubernetes-networking/kubernetes-cni/
  • https://github.com/containernetworking/cni
  • https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/

    关注"云原生指北"微信公众号 (转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/74913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ubuntu StartUML安装教程

1. 前言 开发工作中,要经常画流程图,时序图等,Ubuntu下推荐超级好用的工具StartUML,也用过Dia这款工具,对比使用之后还是觉得StartUML更香一点,本篇文章记录一下安装破解过程。 2. 安装 2.1 官网下载 地址&#xff1a…

SpringSecurity主要流程及扩展实现

解析主流的SpringSecurity安全框架,结合若依框架进行分析。 文章目录概述登录流程分析SecurityConfig配置类设置过滤请求添加过滤器注册认证provider/获取用户详情服务关键过滤器源码分析SpringSecurity实现若依token生成逻辑创建令牌设置用户代理信息刷新令牌有效期…

青春,不过几届世界杯系列1 —— 我经历的2002 ~ 2022年五届世界杯速览

1. 前言: 应 SoftwareTeacher, 邹欣老师在CSDN上的关于世界杯的邀约,在此回顾我目前经历的五届世界杯的点点滴滴。 2. 正文: 我是从2002年韩日世界杯,开始看世界杯的。现在算来,我已经经历了5届世界杯,而…

智慧水务平台建设方案全流程管控方案 智慧水务信息化系统的意义_管理_数据_设备

平升电子智慧水务平台建设方案全流程管控方案/智慧水务信息化系统/水务综合运营管理平台/智慧水务平台,综合水务公司对管网地理信息在线、供水调度SCADA、各环节数据互联互通、工单执行过程监督、运营情况分析等管理需求,建立了一套面向基层执行者、中层…

java计算机毕业设计ssm校园舆情监控系统tgv13(附源码、数据库)

java计算机毕业设计ssm校园舆情监控系统tgv13(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

说反话

目录 1009:说反话 输入格式: 输出格式: 输入样例: 输出样例: 代码长度限制: 时间限制 内存限制 思路: 1.数组 1.2代码: 2.拷贝单词 2.2代码: 总代码: 时间复杂度: 总结: 题目链接: 1009:说反话 给定一句英语&#x…

RocketMq使用(5.0)

RocketMq使用(5.0) 基础概念 这一部分我们可以结合一下管理控制台,先来理解下RocketMQ的一些重要的基础概念: 官方文档-消息发送领域模型:https://rocketmq.apache.org/zh/docs/domainModel/01main 整个消息流程&am…

【强化学习论文合集】十四.2018神经信息处理系统大会论文(NIPS2018)

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…

倍福:通过FB_EcCoeSdoWrite功能块写入第三方伺服的COE参数

本文介绍通过PLC写入第三方伺服的COE参数。例如力矩等信息 功能块介绍 首先需要用到的功能块为FB_EcCoeSdoWrite,该参数是写入COE online中的数据。 PLC程序编写 首先扫描程序配置,并链接好NC变量如下所示 然后再COEOnline中确定需要写入的变量的地址如下所示: 确定所在…

Hello erupt-cloud-node

前言 cloud-node我们可以用来封装某些场景下使用的功能集。不启动不用,启动了就用,方便得很。后台管理突然就变成了搭积木。 搭建项目 这个项目的基础设施我们都使用和主项目相同的。所以,我们这里就先搭建项目来看一下。先说目录结构&…

网络属性设置函数 setsockopt (设置绑定地址快速重用)

setsockopt 函数可以设置应用层、传输层、网络层的一些属性,比如 应用层:绑定地址快速重用、允许广播、传输层:设置TCP最大数据段大小网络层:设置IP首部选项、服务类型、生存时间目录 1、setsockopt 参数和返回值解析 2、使用s…

重点| 系统集成项目管理工程师考前50个知识点(3)

本文章总结了系统集成项目管理工程师考试背记50个知识点!!! 帮助大家更好的复习,希望能对大家有所帮助 比较长,放了部分,需要可私信!! 19、项目管理计划的主要内容: &…

RNN--学习笔记

RNN引入“记忆”的概念,即输出需要依赖于之前的输入序列,并把关键输入记住。循环2字来源于其每个元素都执行相同的任务;并⾮刚性地记忆所有固定⻓度的序列,而是通过隐藏状态来存储之前时间步的信息。不同类型的RNN:One…

SpringBoot的自动配置原理

目录 一、关于SpringBoot的启动原理 二、源码分析 SpringBootConfiguration ComponentScan EnableAutoConfiguration Import(AutoConfigurationImportSelector.class) AutoConfigurationPackage 三、总结 一、引言 要理解SpringBoot自动配置原理,首先要从S…

java计算机毕业设计ssm校园二手平台交易系统11w7i(附源码、数据库)

java计算机毕业设计ssm校园二手平台交易系统11w7i(附源码、数据库) 项目运行 环境配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#…

【计算机视觉】Deep SORT多目标跟踪算法讲解(图文解释 超详细)

觉得有帮助请点赞关注收藏~~~ 一、目标跟踪简介 目标跟踪算法可以进行轨迹特征的分析和提取,以弥补目标检测的不足;有效地去除误检,提高检测精度,为进一步的行为分析提供基础。例如,在自动驾驶系统中,目标跟…

4 - 线程池 Java内置的线程池 - ScheduledExecutorService

ScheduledExecutorService ScheduledExecutorService是ExecutorService的子接口,具备了延迟运行或定期执行任务的能力。 1、常用获取方式 (注:还是通过 Executors. 的方式进行调用) 1)static ScheduledExecutorSer…

5702开发板用户手册

一、 底板简介 1.1 产品简介 在这里,对这款 MP5702 开发板底板进行简单的功能介绍。本公司相关核心板都可与其对接,型号如 MP5652(请详见用户手册)。底板核心板的模式来设计组成完整的开发。底板和核心板之间使用高速板间连接器连…

EMCC 中 运用SQL 优化的建议

1. 性能中心 关于SQL的执行信息 2. 优化SQL: ------整个过程SQL 实现---------------------- DECLARE my_task_name VARCHAR2(30); my_sqltext CLOB; BEGIN my_sqltext : SELECT * || FROM sales || WHERE prod_id 10 AND || cust_id …

Android穿戴设备新功能Compose for Wear OS 1.1

Todoist的增长率提高了50%,因为为Wear 3和Outdooractive重建了他们的应用程序,将开发时间缩短了30%,并显着提高了开发人员的生产力和更好的设计/开发人员协作: “Compose 使 UI 代码更易于编写和阅读,使我们能够在设计…