欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

040.集群网络-CNI网络模型

程序员文章站 2022-03-05 17:17:43
一CNM网络模型 1.1网络模型 生产环境中,跨主机容器间的网络互通已经成为基本要求,更高的要求包括容器固定IP地址、一个容器多个IP地址、多个子网隔离、ACL控制策略、与SDN集成等。目前主流的容器网络模型主要有Docker公司提出的Container Network Model(CNM)模型 ......

一 cnm网络模型

1.1 网络模型

生产环境中,跨主机容器间的网络互通已经成为基本要求,更高的要求包括容器固定ip地址、一个容器多个ip地址、多个子网隔离、acl控制策略、与sdn集成等。目前主流的容器网络模型主要有docker公司提出的container network model(cnm)模型和coreos公司提出的container network interface(cni)模型。

1.2 cnm模型

cnm模型是由docker公司提出的容器网络模型,现在已经被cisco contiv、kuryr、open virtual networking(ovn)、project calico、vmware、weave和plumgrid等项目所采纳。同时,weave、project calico、kuryr和plumgrid等项目也为cnm提供了网络插件的具体实现。
cnm模型主要通过network sandbox、endpoint和network这3个组件进行实现,如下图所示:
040.集群网络-CNI网络模型
network sandbox:容器内部的网络栈,包括网络接口、路由表、dns等配置的管理。sandbox可用linux网络命名空间、freebsd jail等机制进行实现。一个sandbox可以包含多个endpoint。
endpoint:用于将容器内的sandbox与外部网络相连的网络接口。可以使用veth对、openvswitch的内部port等技术进行实现。一个endpoint仅能够加入一个network。
network:可以直接互连的endpoint的集合。可以通过linux网桥、vlan等技术进行实现。一个network包含多个endpoint。

二 cni模型

2.1 cni模型

cni是由coreos公司提出的另一种容器网络规范,现在已经被kubernetes、rkt、apachemesos、cloudfoundry和kurma等项目采纳。另外,contiv networking,project calico、weave、sr-iov、cilium、infoblox、multus、romana、plumgrid和midokura等项目也为cni提供网络插件的具体实现。
040.集群网络-CNI网络模型
如上所示,容器运行环境与各种网络插件通过cni进行连接的模型。
cni定义的是容器运行环境与网络插件之间的简单接口规范,通过一个json schema定义cni插件提供的输入和输出参数。一个容器可以通过绑定多个网络插件加入多个网络中。本节将对kubernetes如何实现cni模型进行详细说明。

2.2 cni规范概述

cni提供了一种应用容器的插件化网络解决方案,定义对容器网络进行操作和配置的规范,通过插件的形式对cni接口进行实现。cni是由rkt networking proposal发展而来的,试图提供一种普适的容器网络解决方案。
cni仅关注在创建容器时分配网络资源,和在销毁容器时删除网络资源,这使得cni规范非常轻巧、易于实现,得到了广泛的支持。在cni模型中只涉及两个概念:容器和网络。
容器(container):是拥有独立linux网络命名空间的环境,例如使用docker或rkt创建的容器。容器需要拥有自己的linux网络命名空间,这是加入网络的必要条件。
网络(network):表示可以互连的一组实体,这些实体拥有各自独立、唯一的ip地址,可以是容器、物理机或者其他网络设备(比如路由器)等。
对容器网络的设置和操作都通过插件(plugin)进行具体实现,cni插件包括两种类型:cni plugin和ipam(ip address management)plugin。cni plugin负责为容器配置网络资源,ipam plugin负责对容器的ip地址进行分配和管理。ipam plugin作为cni plugin的一部分,与cniplugin协同工作。

2.3 cni plugin插件详解

cni plugin包括3个基本接口的定义:添加(add)、删除(delete)、检查(check)和版本查询(version)。这些接口的具体实现要求插件提供一个可执行的程序,在容器网络添加或删除时进行调用,以完成具体的操作。
添加:将容器添加到某个网络。主要过程为在container runtime创建容器时,先创建好容器内的网络命名空间(network namespace),然后调用cni插件为该netns进行网络配置,最后启动容器内的进程。添加接口的参数如下:
    • version:cni版本号。
    • containerid:容器id。
    • network namespace path:容器的网络命名空间路径,例如/proc/[pid]/ns/net。
    • network configuration:网络配置json文档,用于描述容器待加入的网络。
    • extra arguments:其他参数,提供基于容器的cni插件简单配置机制。
    • name of the interface inside the container:容器内的网卡名,返回的信息如下:
      • interfaces list:网卡列表,根据plugin的实现,可能包括sandbox interface名称、主机interface名称、每个interface的地址等信息。
      • ips assigned to the interface:ipv4或者ipv6地址、网关地址、路由信息等。
      • dns information:dns相关的信息。
删除:容器销毁时将容器从某个网络中删除。删除接口的参数如下:
    • version:cni版本号。
    • containerid:容器id。
    • network namespace path:容器的网络命名空间路径,例如/proc/[pid]/ns/net。
    • network configuration:网络配置json文档,用于描述容器待加入的网络。
    • extra arguments:其他参数,提供基于容器的cni插件简单配置机制。
    • name of the interface inside the container:容器内的网卡名。
检查:检查容器网络是否正确设置。检查接口的参数如下:
    • version:cni版本号。
    • containerid:容器id。
    • network namespace path:容器的网络命名空间路径,例如/proc/[pid]/ns/net。
    • network configuration:网络配置json文档,用于描述容器待加入的网络。
    • extra arguments:其他参数,提供基于容器的cni插件简单配置机制。
    • name of the interface inside the container:容器内的网卡名
版本查询:查询网络插件支持的cni规范版本号。无参数,返回值为网络插件支持的cni规范版本号。

2.4 ipam plugin插件详解

为了减轻cni plugin对ip地址管理的负担,在cni规范中设置了一个新的插件专门用于管理容器的ip地址(还包括网关、路由等信息),被称为ipam plugin。通常由cni plugin在运行时自动调用ipam plugin完成容器ip地址的分配。
ipam plugin负责为容器分配ip地址、网关、路由和dns,典型的实现包括host-local和dhcp。与cni plugin类似,ipam插件也通过可执行程序完成ip地址分配的具体操作。ipam可执行程序也处理传递给cni插件的环境变量和通过标准输入(stdin)传入的网络配置参数。
如果成功完成了容器ip地址的分配,则ipam插件应该通过标准输出(stdout)返回以下json报文:
  1 {
  2     "cniversion": "0.4.0",
  3     "ips":[
  4           {
  5 
  6                    "version": "<4-or-6>",
  7                     "address": "<ip-and-prefix-in-cidr>",
  8                     "gateway": "<ip-address-of-the-gateway>" (optional)
  9            },
 10            ..........
 11       ],
 12       "routes":[
 13        {
 14           "dst": "<ip-and-prefix-in-cidr>",
 15            "gw": "<ip-of-next-hop>"
 16         },
 17        ........
 18       ]
 19 
 20       "dns":{
 21        "nameservers": <list-of-nameservers> (optional)
 22        "domain": <name-of-local-domain>  (optional)
 23        "search": <list-of-options>  (optional)
 24      }
 25 }
其中包括ips、routes和dns三段内容:
  • ips段:分配给容器的ip地址(也可能包括网关)。
  • routes段:路由规则记录。
  • dns段:dns相关的信息。

2.5 多网络插件

多网络插件参考:https://blog.csdn.net/qq_31136839/article/details/99852616

三 kubernetes网络插件

3.1 kubernetes网络插件

kubernetes目前支持两种网络插件的实现。
cni插件:根据cni规范实现其接口,以与插件提供者进行对接。
kubenet插件:使用bridge和host-local cni插件实现一个基本的cbr0。
为了在kubernetes集群中使用网络插件,需要在kubelet服务的启动参数上设置下面两个参数:
  • --network-plugin-dir:kubelet启动时扫描网络插件的目录。
  • --network-plugin:网络插件名称,对于cni插件,设置为cni即可,无须关注--network-plugin-dir的路径。对于kubenet插件,设置为kubenet,目前仅实现了一个简单的cbr0 linux网桥。
在设置--network-plugin="cni"时,kubelet还需设置下面两个参数。
    • --cni-conf-dir:cni插件的配置文件目录,默认为/etc/cni/net.d。该目录下配置文件的内容需要符合cni规范。
    • --cni-bin-dir:cni插件的可执行文件目录,默认为/opt/cni/bin。
目前已有多个开源项目支持以cni网络插件的形式部署到kubernetes集群中,进行pod的网络设置和网络策略的设置,包括calico、canal、cilium、contiv、flannel、romana、weavenet等。