CNI

CNI 网络模型

Container Network Interface,CNI 提供了一种应用容器插件化网络解决方案,定义对容器网络进行操作和配置的规范,通过插件(plugin)的形式对CNI接口进行实现,CNI 仅仅关注在容器创建时分配网络资源及在销毁容器时删除网络资源。

CNI 模型中只涉及两个概念:

  • 容器(Container) :容器是拥有独立Linux网络命名空间的环境,如使用Docker或rkt创建的容器。
  • 网络(Network):网络表示可以互连的实体,这些实体拥有各自独立,唯一的IP地址。这些实体可以是容器,物理机或者其他网络设备。

对容器网络的设置和操作都通过插件(Plugin)进行具体实现,CNI插件包括两种类型:

  • CNI Plugin :负责为容器配置网络资源,它包括两个基本的接口:
  1. 配置网络: AddNetwork(net NetworkConfig, rt RuntimeConf) (types.Result, error)
  2. 清理网络: DelNetwork(net NetworkConfig, rt RuntimeConf) error
  • IPAM Plugin(IP Address Management) :负责对容器的IP地址进行分配 ,作为CNI Plugin的一部分与 CNI Plugin 一起工作,为了减轻CNI Plugin 对IP地址管理的负担,CNI规范中设置了一个新的插件,专门用于管理容器的IP地址(还包括网关、路由等信息)被称为IPAM Plugin,典型的实现有host-local和dhcp。通常由CNI Plugin在运行时自动调用 IPAM Plugin 完成IP地址、网关、路由、DNS的分配。IPAM 类似 CNI Plugin 也可以通过可执行程序完成IP地址分配,处理传递给CNI的环境变量和通过标准输入(stdin)传入网络配置参数,如果完成了容器IP地址的分配,IPAM通过标准输出(stdout)返回含有具体信息的json报文。

cni插件的使用方式

kubernetes配置了cni网络插件后,其容器网络创建流程为:

  • kubelet先创建pause容器生成对应的network namespace
  • 调用网络driver,因为配置的是CNI,所以会调用CNI相关代码,识别CNI的配置目录为/etc/cni/net.d
  • CNI driver根据配置调用具体的CNI插件,二进制调用,可执行文件目录为/opt/cni/bin,项目
  • CNI插件给pause容器配置正确的网络,pod中其他的容器都是用pause的网络

可以在此查看社区中的CNI实现,https://github.com/containernetworking/cni

使用CNI插件时,需要做三个配置:

  1. kubelet启动参数中networkPlugin设置为cni
    image

  2. 在/etc/cni/net.d中增加cni的配置文件,配置文件中可以指定需要使用的cni组件及参数
    image

  3. 将需要用到的cni组件(二进制可执行文件)放到/opt/cni/bin目录下
    image

Flannel网络模型实现剖析

posted @ 2024-08-26 11:01  XIN-0808  阅读(21)  评论(0编辑  收藏  举报