K8s-CNI网络模型

背景

跨主机容器间的网络互通已经成为基本要求,更 高的要求包括容器固定IP地址、一个容器多个IP地址、多个子网隔离、 ACL控制策略、与SDN集成等。所以提出了Container Network Interface(CNI)

CNM网络模型

主要组件功能:

  • Network Sandbox:容器内的网络栈,包括网络接口、路由表、DNS等配置
  • Endpoint:用于容器内的Sandbox与外部的网络相连。一个Endpoint只能加入一个Network
  • Network:可以直接互连的Endpoint的集合。可以通过Linux网 桥、VLAN等技术进行实现。一个Network包含多个Endpoint

CNI网络模型

在CNI模型中,只有俩个概念:容器和网络。

  • 容器:拥有独立Linux网络命名空间的环境
  • 网络:一组可以互连的一组实体,这些实体拥有各自独立、唯 一的IP地址,可以是容器、物理机或者其他网络设备(比如路由器) 等。可以将容器添加到一个或多个网络中,也可以从一个或多个网络中 删除。

对容器网络的设置和操作都通过插件(Plugin)进行具体实现, CNI插件包括两种类型:CNI Plugin和IPAM(IP Address Management) Plugin。CNI Plugin负责为容器配置网络资源,IPAM Plugin负责对容器 的IP地址进行分配和管理。IPAM Plugin作为CNI Plugin的一部分,与 CNI Plugin一起工作

容器运行时和CNI插件的关系和工作机制

将容器添加到网络中或者删除某个网络是由容器运行时(runtime) 和CNI插件完成的。下面是一些工作原则:

  1. 容器运行时必须在调用任意插件前为容器创建一个新的网络命名空间
  2. 容器运行时必须确定此容器归属网络(允许多个),以及每个网络必须执行哪个插件
  3. 网络配置为JSON格式,便于文件存储。网络配置包括必 填字段,例如name和type,以及插件(类型)特有的字段。网络配置允 许在调用时更改字段的值。为此,必须在可选字段args中包含需要变更 的信息
  4. 容器运行时必须按照先后顺序为每个网络运行插件将容器添加 到每个网络中
  5. 器生命周期结束后,容器运行时必须以反向顺序(相对于添 加容器执行顺序)执行插件,以使容器与网络断开连接
  6. 容器运行时一定不能为同一个容器的调用执行并行(parallel) 操作,但可以为多个不同容器的调用执行并行操作
  7. 容器运行时必须对容器的ADD和DEL操作设置顺序,以使得 ADD操作最终跟随相应的DEL操作。DEL操作后面可能会有其他DEL操 作,但插件应自由处理多个DEL操作(即多个DEL操作应该是幂等 的)
  8. 容器必须由ContainerID进行唯一标识。存储状态的插件应使用 联合主键(network name、CNI_CONTAINERID、CNI_IFNAME)进行存储
  9. 容器运行时不得为同一个实例(由联合主键network name、 CNI_CONTAINERID、CNI_IFNAME进行标识)调用两次ADD操作 (无相应的DEL操作)。对同一个容器(ContainerID),仅在每次ADD 操作都使用不同的网络接口名称时,才可以多次添加到特定的网络中
  10. 除非明确标记为可选配置,CNI结构中的字段(例如Network Configuration和CNI Plugin Result)都是必填字段

CNI Plugin

CNI Plugin必须是一个可执行程序,由容器管理系统(如 Kubernetes)调用。

主要功能

负责把网络接口插入容器网络名称空间,并在主机上执行必要更改,然后调用适当的IPAM插件,把IP分配给网络接口,并设置正确的路由规则。

CNI Plugin需要支持的操作包括ADD(添加)、DELETE(删 除)、CHECK(检查)和VERSION(版本查询)。这些操作的具体实 现均由CNI Plugin可执行程序完成。

ADD

主要功能

ADD:将容器添加到某个网络中,主要过程为在Container Runtime创建容器时,先创建好容器内的网络命名空间,然后调用CNI插 件为该netns完成容器网络的配置。

ADD操作的参数如下。

  • Container ID:容器ID,为容器的唯一标识。

  • Network namespace path:容器的网络命名空间路径,例 如/proc/[pid]/ns/net。

  • Network configuration:网络配置JSON文档,用于描述容器待 加入的网络。

  • Extra arguments:其他参数,提供了另一种以每个容器为基础 的CNI插件简单配置机制。

  • Name of the interface inside the container:容器内的虚拟网卡名称

ADD操作的结果信息包含以下参数

  • Interfaces list:网络接口列表,根据Plugin的实现,可能包括 Sandbox Interface名称、主机Interface名称、每个Interface的地址等信 息。
  • Interfaces list:网络接口列表,根据Plugin的实现,可能包括 Sandbox Interface名称、主机Interface名称、每个Interface的地址等信 息。
  • IP configuration assigned to each interface:分配给每个网络接口 的IPv4或IPv6地址、网关地址和路由信息。
  • DNS information:DNS相关信息,包括域名服务器(name server)、域名信息(domain)、搜索后缀(search domains)、DNS选 项(options)

DEL

主要功能

DEL:在容器销毁时将容器从某个网络中删除。

DEL操作的 参数如下

  • Container ID:容器ID

  • Network namespace path:容器的网络命名空间路径,例 如/proc/[pid]/ns/net。

  • Network configuration:网络配置JSON文档,用于描述容器待 加入的网络。

  • Extra arguments:其他参数。

  • Name of the interface inside the container:容器内的网卡名。

执行DEL操作时需要注意如下事项

  • 所有参数都必须与执行ADD操作时相同。
  • DEL操作应该释放容器(ContainerID)占用的所有网络资源。
  • 如果前一个操作是ADD,则应在网络插件的配置文件JSON中 补充prevResult字段,以标明前一个操作的结果(容器运行时可能会缓 存ADD的结果)。
  • 如果没有提供CNI_NETNS或prevResult,则CNI Plugin应该尽 可能释放容器相关的所有网络资源(例如释放通过IPAM分配的IP地 址),并返回成功。
  • 如果容器运行时对ADD结果进行了缓存,则在执行DEL操作后 必须删除之前的缓存内容。
  • CNI Plugin在执行DEL操作后通常应返回成功,即使在某些资 源缺失的情况下。例如,当容器的网络命名空间不存在时,IPAM插件 也应该对执行IP地址释放返回成功

CHECK

检查容器网络是否正确设置,其结果为空(表示成 功)或错误信息(表示失败)。

CHECK操作的参数如下

  • Container ID:容器ID。
  • Network namespace path:容器的网络命名空间路径,例 如/proc/[pid]/ns/net。
  • Network configuration:网络配置JSON文档,用于描述容器待 加入的网络,必须通过prevResult字段将其设置为前一个ADD操作的结果
  • Extra arguments:其他参数。
  • Name of the interface inside the container:容器内的网卡名。

执行CHECK操作时需要注意如下事项

  • 必须设置prevResult字段,标明需要检查的网络接口和网络地 址。
  • 插件必须允许插件链中靠后的插件对网络资源进行修改,例如 修改路由规则。
  • 如果prevResult中的某个资源(如网络接口、网络地址、路 由)不存在或者处于非法状态,则插件应该返回错误。
  • 如果未在Result中跟踪的其他资源(例如防火墙规则、流量整 形(traffic shaping)、IP保留等)不存在或者处于非法状态,则插件应 该返回错误。
  • 如果插件得知容器不可达,则应该返回错误。
  • 插件应该在执行ADD操作后立刻执行CHECK操作。
  • 插件应该在执行其他代理插件(例如IPAM)后立刻执行 CHECK操作,并将错误的结果返回给调用者。
  • 容器运行时不得在调用ADD操作前调用CHECK操作,也不得 在调用DEL操作后再调用CHECK操作。
  • 如果在网络配置中明确设置了“disableCheck”,则容器运行时 不得调用CHECK操作。
  • 容器运行时应在调用ADD操作后,在网络配置中补充 prevResult信息。
  • 容器运行时可以选择在一个插件链中某一个插件返回错误时停 止执行CHECK操作。
  • 容器运行时可以在成功执行ADD操作后立刻执行CHECK操作。
  • 容器运行时可以假设一次失败的CHECK操作意味着容器永远 处于错误配置状态

Version

主要功能

VERSION:查询网络插件支持的CNI规范版本号,无参数, 返回值为网络插件支持的CNI规范版本号

需要传入的环境变量参数如下

  • CNI_CONTAINERID:容器ID。
  • CNI_NETNS:容器的网络命名空间路径,例 如/proc/[pid]/ns/net。
  • CNI_IFNAME:待设置的网络接口名称。
  • CNI_ARGS:其他参数,为key=value格式,多个参数之间用分 号分隔,例如”FOO=BAR;ABC=123”。
  • CNI_PATH:可执行文件的查找路径,可以设置多个

错误返回码说明