pod单元的创建方法、装置、设备及存储介质
技术领域
1.本技术涉及云计算网络技术领域,具体涉及一种pod单元的创建方法、装置、设备及存储介质。
背景技术:2.随着云原生技术的发展,越来越多的应用使用云原生的方式进行构建和部署。现有的kubernetes集群是自动化部署、扩展和管理容器化应用程序的开源系统,是云原生应用首选的部署和管理平台,其中pod单元是kubernetes部署、管理的最小计算单元,pod单元中可以包含一个或多个容器,pod中的容器共享pod单元的网络资源。kubernetes创建的pod单元默认只有一个网卡,而在云原生背景下运营商网络云化的过程中,一个网元的功能可能会由若干个pod单元来承载,pod单元需要配置多个网卡,每个网卡走不同的流量。为解决此问题,出现了给pod单元配置多网卡的容器网络接口(cni),如multus和cni-genie。但这两个cni给pod单元配置多网卡的前提是需要在kubernetes集群中已经安装好需要的cni(如calico、canal、weave等),而目前cni的安装往往需要人工介入,无法实现按需自动安装。
技术实现要素:3.为解决上述技术问题,本技术的实施例提供了一种pod单元的创建方法、装置、设备及存储介质。
4.根据本技术实施例的一个方面,提供了一种pod单元的创建方法,包括:
5.监控kunbernetes集群中的pod单元创建请求,所述pod单元创建请求包括创建pod单元所需使用的目标容器网络接口cni信息;
6.获取数据库中记录的kunbernetes集群中已安装的cni信息,并判断目标cni信息是否记录在所述已安装的cni信息中;
7.若判断为否,则发起目标cni的安装请求,以在所述kunbernetes集群中响应于所述安装请求,进行所述目标cni的安装,并根据安装成功的所述目标cni创建所述pod单元。
8.根据本技术实施例的一个方面,提供了一种pod单元的创建装置,包括:
9.监控模块,用于监控kunbernetes集群中的pod单元创建请求,所述pod单元创建请求包括创建pod单元所需使用的目标容器网络接口cni信息;
10.获取模块,用于获取数据库中记录的kunbernetes集群中已安装的cni信息,并判断目标cni信息是否记录在所述已安装的cni信息中;
11.创建模块,用于若判断为否,则发起目标cni的安装请求,以在所述kunbernetes集群中响应于所述安装请求,进行所述目标cni的安装,并根据安装成功的所述目标cni创建所述pod单元。
12.在本技术的一个实施例中,所述装置还包括:
13.判断模块,所述判断模块用于:
14.判断所述目标cni是否安装成功;
15.若判断为是,则将所述目标cni信息记录为所述kubernetes集群中已安装的cni信息;
16.若判断为否,则重新发起所述目标cni的安装请求。
17.在本技术的一个实施例中,所述创建模块包括:
18.配置子模块,用于在所述选定创建所述pod单元的节点上配置所述目标cni的配置文件;
19.安装子模块,用于基于所述目标cni的配置文件安装所述目标cni对应的插件。
20.在本技术的一个实施例中,所述装置还包括:
21.解析模块,用于解析所述pod单元创建请求,以获得创建所述pod单元所需的目标cni信息和选定创建所述pod单元的节点。
22.在本技术的一个实施例中,所述创建模块还包括:
23.调用子模块,用于通过所述选定创建所述pod单元的节点上的kubelet服务进程调用所述目标cni和对应的容器运行时接口cri来创建所述pod单元。
24.在本技术的一个实施例中,所述创建模块具体用于:
25.通过所述kubelet服务进程,连接所述cri调用相应的服务来创建并启动容器,以及调用所述目标cni对应的插件来配置所述pod单元的网络,以创建所述pod单元。
26.根据本技术实施例的一个方面,提供了一种电子设备,包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述电子设备实现如前所述的pod单元的创建方法。
27.根据本技术实施例的一个方面,提供了一种计算机可读存储介质,其上存储有计算机可读指令,当所述计算机可读指令被计算机的处理器执行时,使计算机执行如上所述的pod单元的创建方法。
28.在本技术的实施例所提供的技术方案中,通过监控kunbernetes集群中的pod单元创建请求,获取得到该pod单元创建所需使用到的目标容器接口cni信息,并在通过查询数据库中记录的kunbernetes集群中已经安装的cni信息中没有所需使用的目标cni信息后,自动发起目标cni的安装请求,并在安装目标cni安装成功后基于该目标cni创建pod单元,以此,不需要人工介入,按照pod单元创建请求中包含的目标cni自动安装,提高了kunbernetes集群系统的工作效率和配置的灵活性。
29.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本技术。
附图说明
30.此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本技术的实施例,并与说明书一起用于解释本技术的原理。显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术者来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
31.图1是本技术的一示例性实施例示出的pod单元的结构示意图;
32.图2是本技术的一示例性实施例示出的在kubernetes集群中创建pod单元的实施
环境示意图;
33.图3是本技术的一示例性实施例示出的pod单元的创建流程图;
34.图4是本技术另一示例性实施例示出的pod单元的创建流程图;
35.图5是通过kubelet创建pod单元的架构图;
36.图6是本技术的另一示例性实施例示出的pod单元的创建的架构图;
37.图7是另一示例性实施例示出的调用kubelet创建container(容器)的示意图;
38.图8是本技术的另一示例性实施例示出的pod单元的创建的流程图;
39.图9示意性地示出了本技术实施例提供的pod单元的创建装置的结构框图;
40.图10示出了适于用来实现本技术实施例的电子设备的计算机系统的结构示意图。
具体实施方式
41.这里将详细地对示例性实施例执行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本技术相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本技术的一些方面相一致的装置和方法的例子。
42.附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
43.附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。
44.在本技术中提及的“多个”是指两个或者两个以上。“和/或”描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
45.首先需要说明的是,kubernetes是一个开源的用于管理云平台中多个主机上的容器化的应用,kubernetes的目标是让部署容器化的应用简单并且高效,kubernetes提供了应用部署,规划,更新,维护的一种机制。传统的应用部署方式是通过插件或脚本来安装应用。这样做的缺点是应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作,当然也可以通过创建虚拟机的方式来实现某些功能,但是虚拟机非常重,并不利于可移植性。新的方式是通过部署容器方式实现,每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系也使容器有更大优势,使用容器可以在build(构建)或release(发行)的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆栈组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚拟机轻量、更“透明”,这更便于监控和管理。
46.如图1所示,pod单元是kubernetes集群中的最小部署单元,请参见图1,pod单元由一个或者多个容器组成,同一个pod单元中容器共享网络命名空间,每个pod单元都有一个
根容器(pause容器)用来管理pod单元中用户业务容器,pod单元是kubernetes集群中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在kubernetes上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展pod单元对象功能的,比如控制器对象是用来管控pod单元对象的,service(访问入口)或者ingress(负载均衡器暴露集群内服务的工具)资源对象是用来暴露pod单元引用对象的,persistentvolume(持久卷)资源对象是用来为pod单元提供存储等等,kubernetes不会直接处理容器而是pod单元,pod单元是由一个或多个container(容器)组成,并且pod单元是kubernetes的最重要概念,每一个pod单元都有一个特殊的被称为”根容器“的pause容器。pause容器对应的镜像属于kubernetes平台的一部分,当然除pause容器,每个pod单元还包含一个或多个紧密相关的用户业务容器。
47.cni(conteinre network interface)是容器网络标准,旨在为容器平台提供网络的标准化。不同的容器平台(比如目前的kubernetes、mesos和rkt)能够通过相同的接口调用不同的网络组件。cni由一组用于配置linux容器的网络接口的规范和库组成,同时还包含了一些插件,它本身并不是实现或者代码,可以理解成一个协议。这个标准是在rkt网络提议的基础上发展起来的,综合考虑了灵活性、扩展性、ip分配、多网卡等因素。在kubernetes集群中已经内置了cni,kubelet通过这个标准的api来调用不同的网络插件以实现不同的网络配置方式,实现了这个接口的就是cni插件,它实现了一系列的cniapi接口。常见的cni插件包括calico、flannel、terway、weave net以及contiv。kubernetes集群通过cni配置文件来决定使用什么cni。
48.请参见图2,图2是本技术的实施例涉及的一种实施环境示意图,在kunbernetes集群中创建一个新的pod单元流程为:用户通过kubectl向apiserver发起一个create pod单元的请求;apiserver接收到pod单元创建请求后,不会去直接创建pod单元,而是生成一个包含创建信息的文件;api server将刚才的文件信息写入etcd数据库。到此为止仅仅是在etcd中添加了一条记录,还没有任何的实质性进展。还需要通过apiserver中的组件scheduler查看kubernetes集群中的api接口,类似于通知机制,通过先判断:pod.spec.node是否为null?若为null,表示这个pod单元请求是新来的,需要创建;因此先进行调度计算,找到最“闲”的node(节点),并将创建新的pod单元的任务分配给这个最闲的“node”。然后将信息etcd数据库中更新分配结果,通过pod.spec.node=nodea(设置一个具体的节点),同样上述操作的各种信息也要写到etcd数据库中,kubelet通过监测etcd数据库(即不停地看etcd中的记录),发现apiserver中有了个新的node;如果这条记录中的node与自己的编号相同(即这个pod单元由scheduler分配给自己);则调用node中的docker api,创建container(容器),由此创建新的pod单元。
49.请参阅图3,图3是本技术的一示例性实施例示出的一种pod单元的创建方法的流程图。参见图3,pod单元的创建方法包括步骤s310至步骤s330,详细介绍如下:
50.步骤s310,监控kunbernetes集群中的pod单元创建请求,pod单元创建请求包括创建pod单元所需使用的目标容器网络接口cni信息。
51.对于kunbernetes集群中的节点而言,一般根据需要输入的pod单元创建请求,在该pod单元创建请求中包括新创建的pod单元所需的多个网卡的信息,cni的全称是container network interface,即容器网络的api接口。它是kunbernetes中标准的一个调
用网络实现的接口。kubelet通过这个标准的api来调用不同的网络插件以实现不同的网络配置方式。实现了这个接口的就是cni插件,它实现了一系列的cni api接口。在实际应用中常见的cni插件包括calico、flannel、terway、weave net以及contiv。
52.示例性地,kubernetes集群中master(集群控制节点)接收到输入的pod单元创建请求,在云原生网络演进应用场景下,一个网元的功能可能由若干个pod单元来承载,pod单元需要配置多个网卡,每个网卡走不同的流量,在kubernetes作为主流的云原生应用部署、管理平台,在kubernetes集群中创建的pod单元默认只有一个网卡,为了给pod单元配置多网卡,一般需要预先安装好需要的cni,在本实施例中获取创建该pod单元所需的cni插件,一般情况下,在pod单元创建请求中包含有创建该pod单元所需的cni插件信息。
53.步骤s320,获取数据库中记录的kunbernetes集群中已安装的cni信息,并判断目标cni信息是否记录在已安装的cni信息中。
54.通过在数据库中获取kubernetes集群中已经安装好的cni信息,其中,可以是通过将kubernetes集群中的cni-controller(cni管理器)从数据库中记录的已经安装好的cni信息,并且与pod单元创建请求中的所需的目标cni信息进行对比,确定kubernetes集群中没有安装的目标cni。由此,得到待安装的目标cni信息。通过cni-controller自动判断创建pod单元所需的目标cni信息是否记录在已安装的cni信息中。
55.示例性的,cni-controller监控kubernetes集群中pod单元创建请求,并获取pod单元创建请求中的创建pod单元所需的目标cni信息,并从数据库中调取kubernetes集群中已经安装的cni信息,判断新建pod单元所需的目标cni信息是否已经安装。例如:cni-controller监控到kubernetes集群中的pod-1安装请求中包括有创建pod-1所需的目标cni:calico、flannel、terway;并从数据库中获取kubernetes集群中已经安装好的cni有:calico、weave net、contiv;由此可以判断出如果要新创建pod-1需要预先安装好:flannel、terway。
56.步骤s330,若判断为否,则发起目标cni的安装请求,以在kunbernetes集群中响应于安装请求,进行目标cni的安装,并根据安装成功的目标cni创建pod单元。
57.若在数据库中保存的kubernetes集群中已经安装的cni信息中不存在创建新的pod单元所需的目标cni时,自动发起目标cni创建的请求,以在kubernetes集群中响应该目标cni创建请求,进行对目标cni的安装,并根据安装成功的目标cni创建新的pod单元,以此,无需人工介入对新创建pod单元所需的cni进行安装。
58.示例性的,在kubernetes集群中当监测到用户发起的创建pod单元的请求时,cni-controller获取该创建pod单元请求中所需要的目标cni信息并与数据库中记录的kubernetes集群中已经安装的cni信息进行对比,得到集群中还未安装的目标cni,主动发起未安装的目标cni的安装请求,以在kubernetes集群中响应该安装请求,进行目标cni的安装。当目标cni安装成功后,基于创建新的pod单元所需的目标cni在kubernetes集群中进行pod单元创建的响应,以进行pod单元的创建。例如:用户通过kubectl发起pod-2的创建请求,cni-controller监控到pod-2创建所需要的目标cni包括:calico、weave net、contiv,在kubernetes集群数据库中记录已经集群中已经安装的cni为:calico、flannel、terway,cni-controller经过对比得到kubernetes集群中还需要安装的目标cni为:weave net、contiv,cni-controller则在kubernetes集群中发起目标cni:weave net、contiv的安装请
求,以在kunbernetes集群中响应于目标cni的安装请求,进行目标cni的安装,并根据安装成功的目标cni创建pod-2。
59.在本实施例中,通过监控kunbernetes集群中的pod单元创建请求,获取得到该pod单元创建所需使用到的目标容器接口cni信息,并在通过查询数据库中记录的kunbernetes集群中已经安装的cni信息中没有所需使用的目标cni信息后,自动发起目标cni的安装请求,并在安装目标cni安装成功后基于该目标cni创建pod单元,以此,不需要人工介入,按照pod单元创建请求中包含的目标cni自动安装,提高了kunbernetes集群系统的工作效率和配置的灵活性。
60.在本技术的另外一个示例性实施例中,请参照图4,图3所示的实施例中在发起目标cni的安装请求之后,该方法还包括如下所示的步骤s340至步骤s360:
61.步骤s340,判断目标cni是否安装成功。
62.由上述内容可知,cni(container network interface)是容器网络接口,它是一种标准设计和库,为了让用户在容器创建或者销毁时都能够更容易的配置容器网络。目前比较流行的cni插件:flannel、calico、weave、canal(技术上是多个插件的组合)。这些插件即可以确保满足kubernetes集群的网络要求,又能为kubernetes集群管理员提供他们所需的某些特定的网络功能。cni规范中用于配置网络的插件接口,可以让容器运行时与插件进行协调,具体机制如下:插件负责为接口配置和管理ip地址,并且同于提供与ip管理、每个容器的ip分配、以及多主机连接相关的功能。容器运行时会调用网络插件,从而在容器启动时分配ip地址并配置网络策略,并在删除容器时再次调用插件以清理这些资源。在kubernetes集群中,kubelet可以在适当的时间调用插件,来为通过kubelet启动的pod单元进行自动的网络配置。检测在kubernetes集群中是否成功安装目标cni,其中,检测方法不限于对目标cni的配置文件是否安装完成。
63.示例性的,根据判断对比kubernetes集群中没有安装创建pod单元所需的目标cni为:flannel相对容易安装和配置。它被打包为单个二进制文件flanneld,许多常见的kubernetes集群部署工具和许多kubernetes集群发行版都可以默认安装flannel。flannel可以使用kubernetes集群的现有etcd集群来使用api存储其状态信息,因此不需要专用的数据存储。flannel配置第三层ipv4 overlay网络。它会创建一个大型内部网络,跨越集群中每个节点。在此overlay网络中,每个节点都有一个子网,用于在内部分配ip地址,在配置pod单元时,每个节点上的docker桥接口都会为每个新容器分配一个地址,同一主机中的pod单元可以使用docker桥接进行通信,而不同主机上的pod单元会使用flanneld将其流量封装在udp数据包中,以便路由到适当的目标。
64.步骤s350,若判断为是,则将目标cni信息记录为kubernetes集群中已安装的cni信息。
65.当检测到目标cni已经安装成功后,即检测到目标cni的配置文件已经安装在kubernetes集群中对应的节点上时,将该已经安装好的cni信息记录在数据库中已经安装的cni信息中,以便于查阅kubernetes集群中已经安装好的cni,并在再次调用的时候自动化调用已经配置好的cni。
66.示例性地,当cni-controller监控到kubernetes集群中新发起的pod-3创建请求时,在pod-3的创建请求中解析出创建pod-3需要的目标cni包括calico、flannel、terway,
根据数据库中记录的创建pod-2时新建的cni:flannel、terway,可知创建pod-3的仅需发起calico的创建即可,由此提高了pod单元的创建效率。
67.步骤s360,若判断为否,则重新发起目标cni的安装请求。
68.当目标cni在kubernetes集群的节点上的安装没有成功时,重新在kubernetes集群中发起目标cni的安装请求,以使得在kubernetes集群中响应目标cni的安装。在本实施例中,判断cni是否安装成功的方案可以是检查kubernetes集群中对应的节点上是否安装该cni对应的插件,本实施例在此不作任何限制。在检测到目标cni在kubernetes集群上没有安装成功后,继续发起目标cni的安装请求直至目标cni在kubernetes集群上安装成功,以保证后续的pod单元能够成功安装。
69.在本实施例中,通过判断目标cni是否安装成功,对已经成功安装的cni记录在数据库的kubernetes集群已经安装完成的cni信息中,对未能成功安装的cni重新发起安装请求,直至安装成功。以此,不仅保证了后续创建新的pod单元可以直接使用安装完成的cni,而且保证了所有需要的目标cni全部安装成功。
70.在本技术的另一个示例性实施例中,图3的实施例中的步骤s330可进一步实现如下所示的步骤s331至步骤s332:
71.步骤s321,在选定创建pod单元的节点上配置目标cni的配置文件。
72.步骤s322,基于目标cni的配置文件安装目标cni对应的插件。
73.请参见图5,在kubernetes集群中对应的节点上搭建安装目标cni的整体框架,并从目标cni的配置文件中获取出必要信息。其中必要的信息一共有两部分组成,第一个是在/etc/cni/net.d下的配置文件会被以标准输出的方式传送给cni,第二个是容器运行时信息会以环境变量的方式由cni使用。从环境变量中获取容器运行时信息,主要包括containerid,netns,ifname(容器内的网卡名),args(从cni_args环境变量中获取的),path(cni的二进制文件地址),stdindata(配置文件的标准输出内容,[]byte类型)。再通过设置etcd客户端实现cni需要实现的podip地址管理功能。创建ip地址管理服务,即除了需要在etcd中设置一个pool(数据池)用来保存网段之外,还在etcd中为每个节点设置了一个用来记录“当前节点已使用的ip”的key(秘钥),以使得当某个节点上又有新的pod单元被创建的时候,就去遍历这个key下已经使用了的所有ip,然后选择最后一个ip+1的ip地址作为当前新pod单元的ip,并将这个ip地址重新写回到这个key下。最后通过veth pair(虚拟网络接口)设备和bridge(桥接)设备实现相互隔离的两个pod单元之间通信,由此即完成了在kubernetes集群中cni的安装。
[0074]
进一步地,基于上述实施例,在本技术另外一个示例性的实施例中,步骤s310之后还包括步骤s3101:
[0075]
步骤s3101,解析pod单元创建请求,以获得创建pod单元所需的目标cni信息和选定创建pod单元的节点。
[0076]
当监控到kubernetes集群中的pod单元创建指令,集群里面创建一个pod单元的时候,首先会通过apiserver将pod单元的配置写入。apiserver的一些管控组件(比如scheduler)会调度到某个具体的节点上去,kubelet监听到这个pod单元的创建之后,会在本地进行一些创建的操作。当执行到创建网络这一步骤时,首先它会读取刚才我们所说的配置目录中的配置文件,配置文件里面会声明所使用的是哪一个cni,然后去执行具体的
cni插件的二进制文件,再由cni插件进入pod单元的网络空间去配置pod单元的网络。配置完成之后,kubelet也就完成了整个pod单元的创建过程,这样这个pod单元就在线了。
[0077]
进一步地,请参见图6,基于上述实施例,在本技术所提供的另一个示例性实施例中,方法还包括:
[0078]
通过选定创建pod单元的节点上的kubelet服务进程调用目标cni和对应的容器运行时接口cri来创建pod单元。
[0079]
由上述内容可知,pod单元是kubernetes集群创建或部署的最小/最简单的基本单位,一个pod单元代表集群上正在运行的一个进程。一个pod单元封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络ip以及管理控制容器运行方式的策略选项。pod单元代表部署的一个单位:kubernetes集群中单个应用的实例,它可能由单个容器或多个容器共享组成的资源。
[0080]
首先kubelet会启动cri runtime,也就是container runtime interface(接口),具体的,就是在kubelet端启动一个grpc的客户端,然后需要有个对应的cri server端,这里一般实现就是containerd(容器虚拟化技术),也就是说containerd会启动一个grpc的服务端,接收来自kubelet的“创建pod单元”的请求。
[0081]
在接到这个请求后,containerd(容器虚拟化技术)会调用“创建sandbox(沙箱)”的接口,所谓创建sandbox就是给pod单元中的容器们提前启动一个具有稳定网络资源以及存储资源的隐藏根pause容器。但是containerd属于“高级运行时”,真正去拉起容器的地方在oci(容器标准open container initiative)中,也叫“低级运行时”,一般实现可能由runc或者kata等小型容器引擎,其中最常用的是runc。然后由于为了给sandbox创建网络资源,会先去/etc/cni/net.d文件夹目录下加载网络配置文件,然后根据配置文件中的type字段,去/opt/cni/bin文件夹目录下找对应的二进制插件,随后把容器的运行时信息作为环境变量,再把配置文件作为标准输出,对这个二进制进行调用。其中,二进制插件调用的过程主要就是要实现三个点:1.pod单元ip的管理,2.通主机pod单元间通信,3.不同主机间pod单元通信。等以上三点都实现后,需要二进制插件在标准输出上打印点东西,cri读取这些信息做后续的操作。
[0082]
进一步地,基于上述实施例,在本技术所提供的另一个示例性实施例中,方法还包括:
[0083]
通过kubelet服务进程,连接cri调用相应的服务来创建并启动容器,以及调用目标cni对应的插件来配置pod单元的网络,以创建pod单元。
[0084]
在kubernetes集群中创建一个pod单元时,首先会通过apiserver将创建该pod单元所需的配置写入。apiserver的一些管控组件(例如scheduler)会调度到某个具体的节点上去,kulebet监听到这个pod单元的创建信息之后,会在本地进行一些创建的操作,当执行到创建网络这一步骤时,它首先会读取到配置目录中的配置文件,其中,配置文件里面会声明所使用的是哪一个cni插件,然后去执行具体的cni插件的二进制文件。
[0085]
请参见图7,kubelet调用下层容器运行时的执行过程,并不会直接调用docker的api,而是通过一组叫作cri(container runtime interface,容器运行时接口)的grpc接口来间接执行的。kubelet实际上就会调用一个叫作genericruntime的通用组件来发起创建pod单元的cri请求。kubernetes集群通过虚拟出一个cri shim(实现了cri接口的容器运行
时通常称为cri shim,)(例如:dockershim)让容器项目能够自主开发,进而为kubernete集群提供一个统一的容器抽象层,使得下层容器运行时可以自由地对接进入kubernetes集群当中。
[0086]
需要说明的是,cri是container runtime interface(容器运行时接口)的简写,cri解耦了kubelet与容器运行时,让kubelet无需重新编译就可以支持多种容器运行时,kubelet将通过cri接口来跟第三方容器运行时进行通信,来操作容器与镜像。实现了cri接口的容器运行时通常称为cri shim,dockershim属于kubelet内置cri shim,其余remote cri shim的创建pod单元调用流程其实与dockershim调用基本一致,只不过是调用了不同的容器引擎来操作容器,但一样由cri shim调用cni来构建pod单元的网络,这是一个grpc server(通信服务器),监听在本地的unix socket通信的路径配置上;而kubelet作为grpc的客户端来调用cri接口,来进行pod单元和容器、镜像的生命周期管理。
[0087]
在kubernetes集群中,每个node都会启动kubelet进程,用来处理master节点下发到本节点的任务,管理pod单元和其中的容器。kubelet会在api server上注册节点信息,定期向master汇报节点资源使用情况,并通过cadvisor监控容器和节点资源。可以把kubelet理解成【server-agent】架构中的agent(代理人),是node上的pod单元管家。
[0088]
kubelet启动时,具体通过network-plugin=cni指令启用cni,通过
‑‑
cni-bin-dir参数指定cni插件所在主机目录(默认为/opt/cni/bin/)、通过
‑‑
cni-conf-dir参数指定cni配置文件所在主机目录(默认为/etc/cni/net.d)在节点上创建pod单元前,会先读取cni配置文件(xxnet.conf),执行安装在主机上的cni二进制插件(xxnet)通过这些api调用网络插件为pod单元配置网络。
[0089]
在本实施例中,通过预创建pod单元的节点上的kubelet调用已经成功安装的目标cni和对应的容器运行接口(cri)创建pod单元,减少了在创建过程中再去安装目标cni的过程,并且直接调用已经已经自动安装成功的目标cni大大提高了pod单元的创建效率。
[0090]
进一步地,基于上述实施例,在本技术所提供的另一个示例性实施例中,还包括:
[0091]
pod单元创建请求中包括多个创建pod单元所需使用的目标cni信息,用以指示在kubernetes集群中进行各目标cni的安装,并根据安装成功的各目标cni创建pod单元。
[0092]
也就是说,在用户发送的创建pod单元的请求中,包括多个创建pod单元需要的目标cni,例如:canal、flannel等。判断pod单元创建请求中包括的目标cni是否在kubernetes集群中已经安装。对没有安装的目标cni进行安装,确定pod单元创建的节点,通过节点上的kubelet调用pod单元创建请求中声明的需要的多个目标cni和容器运行时间接口创建pod单元。
[0093]
请参照图8,图8示出了本技术一个据图实施例提供的pod单元的创建方法的流程图,具体如下:
[0094]
步骤s1.api server接收pod单元创建请求;
[0095]
步骤s2.cni-controller监听到pod单元创建请求;
[0096]
步骤s3.cni-controller加载集群中已安装的cni列表,得出未安装的目标cni;
[0097]
步骤s4.cni-controller构建未安装的目标cni的安装请求发送给api server;
[0098]
步骤s5.api server发送安装目标cni的任务给对应的节点(node),对应的节点拉取安装目标cni所需的资源对所述目标cni进行安装;
[0099]
步骤s6.cni-controller获取到目标cni安装成功,并将安装成功的目标cni信息更新值数据库;
[0100]
步骤s7.对应的节点调用目标cni对pod单元进行创建。
[0101]
用户根据实际需要,在运行的kubernetes集群中api server监控到用户提交pod单元创请求,并在该创建请求中声明创建该pod单元所需的目标cni,cni-controller监听到api server中的pod单元创建请求,并提取到创建该pod单元所需的目标cni,cni-controller从数据库中加载集群已安装的cni列表,判断出未安装的目标cni,cni-controller构建目标cni的安装请求发送给api server,api server将目标cni的安装任务发送到对应的节点(node)上,node接到目标cni安装任务后,拉取安装目标cni所需的资源对目标cni进行安装,cni-controller确认目标cni安装成功后,将目标cni的信息更新到数据库中,并在对应的节点上完成pod单元的创建。
[0102]
示例性的,cni-controller监听到api server上用户提交的pod单元创建请求,并在所提交pod单元创建请求中声明创建该pod单元所需要使用到的canal和flannel两个目标cni,kubernetes集群中的cni-controller从api-server监听到pod单元创建请求,并提取得到创建新的pod单元的canal和flannel两个cni的需求。cni-controller从预置的数据库中加载kubernetes集群已安装的cni列表,与需求的canal和flannel进行对比,得出canal和flannel两个cni都未安装。cni-controller分别构建canal和flannel的安装请求并发送到apiserver,apiserver将canal和flannel的安装任务分配到对应的节点node,node接到canal和flannel的安装任务后,分别拉取安装canal和flannel所需的资源进行安装,cni-controller确认cannel和flannel安装成功能,将canal和flannel的信息更新到数据库中,被选定pod单元创建节点上的kubelet调用cni和cri等资源创建pod单元,完成多网卡pod单元的创建。
[0103]
在本实施例中,通过对pod单元创建请求进监控,并通过在预置数据库中加载创建pod单元请求中声明的所需要的cni是否已经安装在kubernetes集群中,对没有安装的cni发起安装请求,以使在对应的节点上对所需要的cni进行安装,并通过选定创建pod单元的节点上的kubelet调用cni和cri等资源创建pod单元,以此实现多网口pod单元的创建,以此通过自动提取创建pod单元所需的cni信息,自动化地按需安装对应的目标cni避免了人工介入,并预先判断所需的目标cni是否在kubernetes集群中存在,减少了对cni的重复安装,提高了创建pod单元的效率。
[0104]
应当注意,尽管在附图中以特定顺序描述了本技术中方法的各个步骤,但是,这并非要求或者暗示必须按照该特定顺序来执行这些步骤,或是必须执行全部所示的步骤才能实现期望的结果。附加的或备选的,可以省略某些步骤,将多个步骤合并为一个步骤执行,以及/或者将一个步骤分解为多个步骤执行等。
[0105]
图9是本技术一示例性实施例示出的pod单元的创建装置400。该装置可以应用于图2所示的实施环境,并具体配置在kubernetes集群中,该装置也可以适用于其他示例性实施环境,并具体配置在其他设备中,本实施例不对该装置所适用的实施环境进行限制。
[0106]
如图9所示,该示例性的pod单元的创建装置400包括:
[0107]
监控模块410,用于监控kunbernetes集群中的pod单元创建请求,pod单元创建请求包括创建pod单元所需使用的目标容器网络接口cni信息。
[0108]
获取模块420,用于获取数据库中记录的kunbernetes集群中已安装的cni信息,并判断目标cni信息是否记录在已安装的cni信息中。
[0109]
创建模块430,用于若判断为否,则发起目标cni的安装请求,以在kunbernetes集群中响应于安装请求,进行目标cni的安装,并根据安装成功的目标cni创建pod单元。
[0110]
在该示例性的pod单元的创建装置中,自动化地按需安装对应的目标cni避免了人工介入,并预先判断所需的目标cni是否在kubernetes集群中存在,减少了对cni的重复安装,提高了创建pod单元的效率。
[0111]
在本技术的一个实施例中,pod单元的创建装置400还包括:
[0112]
判断模块用于:
[0113]
判断目标cni是否安装成功;
[0114]
若判断为是,则将目标cni信息记录为kubernetes集群中已安装的cni信息;
[0115]
若判断为否,则重新发起目标cni的安装请求。
[0116]
在本技术的一个实施例中,创建模块410包括:
[0117]
配置子模块,用于在选定创建pod单元的节点上配置目标cni的配置文件;
[0118]
安装子模块,用于基于目标cni的配置文件安装目标cni对应的插件。
[0119]
在本技术的一个实施例中,kunbernetes集群中pod单元创建装置400还包括:
[0120]
解析模块,用于解析pod单元创建请求,以获得创建pod单元所需的目标cni信息和选定创建pod单元的节点。
[0121]
在本技术的一个实施例中,创建模块410还包括:
[0122]
调用子模块,用于通过选定创建pod单元的节点上的kubelet服务进程调用目标cni和对应的容器运行时接口cri来创建pod单元。
[0123]
在本技术的一个实施例中,述创建模块410具体用于:
[0124]
通过kubelet服务进程,连接cri调用相应的服务来创建并启动容器,以及调用目标cni对应的插件来配置pod单元的网络,以创建pod单元。
[0125]
需要说明的是,上述实施例所提供的路况刷新装置与上述实施例所提供的路况刷新方法属于同一构思,其中各个模块和单元执行操作的具体方式已经在方法实施例中进行了详细描述,此处不再赘述。上述实施例所提供的路况刷新装置在实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能,本处也不对此进行限制。
[0126]
本技术的实施例还提供了一种电子设备,包括:一个或多个处理器;存储装置,用于存储一个或多个程序,当一个或多个程序被一个或多个处理器执行时,使得电子设备实现上述各个实施例中提供的pod单元的创建方法。
[0127]
图10示出了适于用来实现本技术实施例的电子设备的计算机系统的结构示意图。需要说明的是,图10示出的电子设备的计算机系统1200仅是一个示例,不应对本技术实施例的功能和使用范围带来任何限制。
[0128]
如图10所示,计算机系统1200包括中央处理单元(central processing unit,cpu)1201,其可以根据存储在只读存储器(read-only memory,rom)1202中的程序或者从储存部分1208加载到随机访问存储器(random access memory,ram)1203中的程序而执行各种适当的动作和处理,例如执行上述实施例中的方法。在ram 1203中,还存储有系统操作所
需的各种程序和数据。cpu 1201、rom 1202以及ram 1203通过总线1204彼此相连。输入/输出(input/output,i/o)接口1205也连接至总线1204。
[0129]
以下部件连接至i/o接口1205:包括键盘、鼠标等的输入部分1206;包括诸如阴极射线管(cathode ray tube,crt)、液晶显示器(liquid crystal display,lcd)等以及扬声器等的输出部分1207;包括硬盘等的储存部分1208;以及包括诸如lan(local area network,局域网)卡、调制解调器等的网络接口卡的通信部分1209。通信部分1209经由诸如因特网的网络执行通信处理。驱动器1210也根据需要连接至i/o接口1205。可拆卸介质1211,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1210上,以便于从其上读出的计算机程序根据需要被安装入储存部分1208。
[0130]
特别地,根据本技术的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本技术的实施例包括一种计算机程序产品,其包括承载在计算机可读介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的计算机程序。在这样的实施例中,该计算机程序可以通过通信部分1209从网络上被下载和安装,和/或从可拆卸介质1211被安装。在该计算机程序被中央处理单元(cpu)1201执行时,执行本技术的系统中限定的各种功能。
[0131]
需要说明的是,本技术实施例所示的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质例如可以是电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子可以包括但不限于:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机访问存储器(ram)、只读存储器(rom)、可擦式可编程只读存储器(erasable programmable read only memory,eprom)、闪存、光纤、便携式紧凑磁盘只读存储器(compact disc read-only memory,cd-rom)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本技术中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的计算机程序。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的计算机程序可以用任何适当的介质传输,包括但不限于:无线、有线等等,或者上述的任意合适的组合。
[0132]
附图中的流程图和框图,图示了按照本技术各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。其中,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
[0133]
描述于本技术实施例中所涉及到的单元可以通过软件的方式实现,也可以通过硬
件的方式来实现,所描述的单元也可以设置在处理器中。其中,这些单元的名称在某种情况下并不构成对该单元本身的限定。
[0134]
本技术的另一方面还提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如前的pod单元的创建方法。该计算机可读存储介质可以是上述实施例中描述的电子设备中所包含的,也可以是单独存在,而未装配入该电子设备中。
[0135]
本技术的另一方面还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各个实施例中提供的pod单元的创建方法。
[0136]
上述内容,仅为本技术的较佳示例性实施例,并非用于限制本技术的实施方案,本领域普通技术人员根据本技术的主要构思和精神,可以十分方便地进行相应的变通或修改,故本技术的保护范围应以权利要求书所要求的保护范围为准。