kubernetes网络模型介绍

2020-10-17  本文已影响0人  Feel_狗焕

目录:
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。

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


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三个模型中的组件完成容器网络的集成和通信。

cni-2.jpg

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

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

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

2.1、CNI Plugin插件详解:

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

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

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

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

(4)CNI插件环境变量:

网络配置参数如下:
◎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": "<ip-and-prefix-in-CIDR>",
                    "gateway": "<ip-address-of-the-gateway>" (optional)
           },
           ..........
      ],
      "routes":[
       {
          "dst": "<ip-and-prefix-in-cidr>",
           "gw": "<ip-of-next-hop>"
        },
       ........
      ]

      "dns":{
       "nameservers": <list-of-nameservers> (optional)
       "domain": <name-of-local-domain>  (optional)
       "search": <list-of-options>  (optional)
     }
}

上一篇 下一篇

猜你喜欢

热点阅读