kubernetes网络模型介绍

目录:
1、CNM
2、CNI
2.1、CNI Plugin插件详解
2.2、IPAM Plugin插件详解


简介:

目前主流的容器网络模型主要有docker公司提出的CNM(Container Network Model)模型和CoreOS公司提出的CNI(Container Network Interface)模型。

Kubernetes 在处理网络上,没有选择自己再独立创造一个,而是选择了其中的 CNI作为了自己的网络插件。(至于为什么不选择 CNM,可以看看这篇官方的解释:Why Kubernetes doesn’t use libnetwork)。不使用 CNM 最关键的一点,是 k8s 考虑到CNM 在一定程度上和 container runtime 联系相对比较紧密,不好解耦。 有了 k8s 这种巨无霸的选择之后,后来的很多项目都在 CNM 和 CNI 之间选择了 CNI。

下面是两种网络模型的详细对比:

  • CNM:
    CNM 的 api 包含了两部分:IPAM 插件和网络插件。IPAM 插件负责创建/删除 address pools、分配网络地址,network 插件负责创建/删除 networks、以及分配或收回容器的 ip 地址。事实上,这两种插件都可以实现所有的 API,你可以选择用 IPAM,也可以选择用 network,或者同时使用。但是,container runtime 会在不同情况下使用到不同的插件,这带来了复杂性。还有就是,CNM 需要使用分布式存储系统来保存网络配置信息,例如 etcd。

  • CNI:
    CNI 对外暴露了从一个网络里面添加和剔除容器的接口。CNI 使用一个 json 配置文件保存网络配置信息。和 CNM 不一样,CNI 不需要一个额外的分布式存储引擎。


1、CNM:

cnm.png

cnm-libnet.jpeg

Libnetwork是CNM的原生实现。它为Docker daemon和网络驱动程序之间提供了接口。网络控制器负责将驱动和一个网络进行对接。每个驱动程序负责管理它所拥有的网络以及为该网络提供的各种服务,例如IPAM等等。由多个驱动支撑的多个网络可以同时并存。网络驱动可以按提供方被划分为原生驱动(libnetwork内置的或Docker支持的)或者远程驱动 (第三方插件)。原生驱动包括 none, bridge, overlay 以及 MACvlan。驱动也可以被按照适用范围被划分为本地(单主机)的和全局的 (多主机)。


2、CNI:

CNI主要是通过network sandbox、endpoint和network三个模型中的组件完成容器网络的集成和通信。

  • Sandbox:一个Sandbox包含了一个容器网络栈的配置。其中包括了对容器的网卡,路由表以及对DNS设置的管理。通常,一个Sandbox的实现可以是一个Linux Network Namespace,一个FreeBSD Jail或者其他类似的东西。一个Sandbox可以包含多个处于不同Network的Endpoint。
  • Endpoint:Endpoint将一个Sandbox加入一个Network。Endpoint的实现可以是一个veth对,一个Open vSwitch internal port或者其他类似的东西。一个Endpoint只能属于一个Network和一个Sandbox。
  • Network:Network是一个能够互相通信的Endpoint的集合。Network的实现可以是一个Linux网桥,一个VLAN等等。
cni-2.jpg

CNI容器网络接口定义的是”容器运行时“环境与网络插件之间的简单接口规范,简单的说就是通过一个json格式的模板来定义网络插件提供输入输出参数。总结的来说CNI就是一个接口数据格式规范,各种网络插件遵守这种数据规范来实现容器网络的创建和维护。一个容器可以通过绑定多个网络插件加入多个网络中。

CNI Plugin本质上是各种网络操作的工具链,简单的说就是在容器运行时创建相关资源的过程中,使用CNI Plugin(网络工具)对其中网络命名空间资源进行相关的网络配置操作,达到网络的集成和连通。

CNI插件包括两种类型: CNI Plugin和IPAM(IP Address Management)Plugin,这两种插件都是可
执行的二进制文件。

  • CNI Plugin:负责为容器配置网络资源;
  • IPAM Plugin:负责对容器的IP地址进行分配和管理。 IPAM Plugin作为CNI Plugin的一部分, 与CNI Plugin一起工作;
2.1、CNI Plugin插件详解:

CNI Plugin包括3个基本接口的定义: 添加(ADD) 、 删除(DELETE) 、 检查(CHECK) 和版本查询(VERSION) 。 这些接口的具体实现要求插件提供一个可执行的程序, 在容器网络添加或删除时进行调用, 以完成具体的操作。

(1) 添加: 将容器添加到某个网络。 主要过程为在Container Runtime创建容器时, 先创建好容器内的网络命名空间(Network Namespace) , 然后调用CNI插件为该netns进行网络配置, 最后启动容器内的进程。
添加接口的参数如下。

  • Version: CNI版本号。
  • Container ID: 容器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相关的信息。

(2) 删除: 容器销毁时将容器从某个网络中删除。删除接口的参数如下。

  • Version: CNI版本号。
  • Container ID: 容器ID。
  • Network namespace path: 容器的网络命名空间路径, 例如/proc/[pid]/ns/net。
  • Network configuration: 网络配置JSON文档, 用于描述容器待加入的网络。
  • Extra arguments: 其他参数, 提供基于容器的CNI插件简单配置机制。
  • Name of the interface inside the container: 容器内的网卡名。

(3) 检查: 检查容器网络是否正确设置。检查接口的参数如下。

  • Container ID: 容器ID。
  • Network namespace path: 容器的网络命名空间路径, 例如/proc/[pid]/ns/net。
  • Network configuration: 网络配置JSON文档, 用于描述容器待加入的网络。
  • Extra arguments: 其他参数, 提供基于容器的CNI插件简单配置机制。
  • Name of the interface inside the container: 容器内的网卡名。

(4)CNI插件环境变量:

  • CNI插件支持通过环境变量和标准输入传入参数,其支持环境变量如下
  • CNI_COMMAND: 接口方法, 包括ADD、 DEL和VERSION。
  • CNI_CONTAINERID: 容器ID。
  • CNI_NETNS: 容器的网络命名空间路径, 例如/proc/[pid]/ns/net。
  • CNI_IFNAME: 待设置的网络接口名称。
  • CNI_ARGS: 其他参数, 为key=value格式, 多个参数之间用分号分隔, 例如"FOO=BAR; ABC=123"。
  • CNI_PATH: 可执行文件的查找路径, 可以设置多个。网络配置参数则由一个JSON报文组成, 以标准输入(stdin) 的方式传递给可执行程序。

网络配置参数如下:
◎cniVersion(string):CNI版本号。
◎ name(string):网络名称, 应在一个管理域内唯一。
◎ type(string):CNI插件的可执行文件的名称。◎ args(dictionary) : 其他参数。
◎ ipMasq(boolean):是否设置IP Masquerade(需插件支持),适用于主机可作为网关的环境中。
◎ ipam:IP地址管理的相关配置。
-type(string):IPAM可执行的文件名。
◎ dns:DNS服务的相关配置。
-nameservers(list of strings):名字服务器列表, 可以使用IPv4或IPv6地址。
-domain(string):本地域名, 用于短主机名查询。
-search(list of strings):按优先级排序的域名查询列表。
-options(list of strings):传递给resolver的选项列表。

例如一个网络插件遵守CNI接口规范创建网络配置如下:


cni-json.jpg
2.2、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报文:

{
    "cniVersion": "0.4.0",
    "ips":[
          {

                   "version": "<4-or-6>",
                    "address": "",
                    "gateway": "" (optional)
           },
           ..........
      ],
      "routes":[
       {
          "dst": "",
           "gw": ""
        },
       ........
      ]

      "dns":{
       "nameservers":  (optional)
       "domain":   (optional)
       "search":   (optional)
     }
}

你可能感兴趣的:(kubernetes网络模型介绍)