掌桥专利:专业的专利平台
掌桥专利
首页

一种基于Kubernetes的Unikernel运行方法及装置

文献发布时间:2024-04-18 19:58:53


一种基于Kubernetes的Unikernel运行方法及装置

技术领域

本发明属于云计算技术领域,特别涉及一种基于Kubernetes的Unikernel运行方法及装置。

背景技术

随着云计算和云服务技术的快速发展,容器技术应运而生,成为云计算领域的一项关键技术。容器技术允许开发者将应用程序及其依赖环境打包在一起,使得应用程序的部署和迁移变得更为方便。同时,容器技术也在提高资源利用率、提升服务伸缩性和微服务架构等方面展现出显著优势。

在此背景下,Kubernetes作为一种开源的容器编排平台,得到了广泛的应用。Kubernetes提供了一套完整的分布式系统支持,帮助开发者和运维人员更好地管理容器化的应用程序。如公开号为CN115599492A的中国专利公开了一种基于kubernetes实现虚拟机和容器同时管理的方法及系统。该方法包括,在kubernetes API服务中增加虚拟机API服务,用于接收外部虚拟机管理请求;在kubernetes集群组件中增加虚拟机控制组件,用于根据接收到的虚拟机请求,生成对应pod;在kubernetes集群节点中增加虚拟机处理组件,用于监视节点上每个虚拟机实例的状态变化;在kubernetes集群节点中增加虚拟机运行组件,对应在pod中管理一个虚拟机,所述虚拟机运行组件与libvirtd通讯,并提供虚拟机生命周期管理。

然而,虽然容器技术带来了诸多好处,但其依赖于操作系统级别的虚拟化,导致容器在隔离性和安全性上有所不足。因此,Unikernel作为一种轻量级的操作系统,它将应用程序和操作系统服务打包在一起,成为了提升容器安全性的一种潜在方案。然而,如何将Unikernel集成到现有的容器生态,尤其是如何将其接入Containerd(一个工业级标准的容器运行时)和Kubernetes,这是一个尚未解决的问题。

目前,最相近的实现方案可能是使用类似于Kata Containers的工具,它将轻量级虚拟机作为一个沙箱,用来运行每个容器。如公开号为CN115113984A的中国专利公开了一种基于轻量化虚拟机的容器安全解决方法、系统、电子设备及计算机可读存储介质,以解决容器安全工具与容器的生命周期不同步的问题,所述容器为Kata容器,所述方法包括:将容器安全工具集成在Kata容器的虚拟机操作系统Guest OS中;在运行容器时,同步运行所述容器对应的Guest OS中的容器安全工具进行容器安全检测,并在容器运行过程中使容器安全工具的生命周期与容器的生命周期同步。以及如公开号为CN113297566A的中国专利公开了一种沙箱实现方法、装置、设备和存储介质,包括:由沙箱进程获取目标动态库文件的目标存储路径;目标动态文件包括调用目标用户态操作系统的通用接口;在根据目标存储路径获取到目标动态库文件的情况下,由沙箱进程通过调用通用接口,在沙箱进程对应的沙箱容器中配置目标用户态操作系统。该申请由沙箱进程通过通用接口,将用户操作的通用调用方法转换为目标用户态操作系统的原生调用方法,实现沙箱进程调用目标用户态操作系统的目的,可以通过一套通用的调用方法,实现不同类型的用户态操作系统在原生操作系统中的操作控制,从而达到了在一个原生操作系统中多种类型用户态操作系统的兼容。

然而,这种方案虽然能提高隔离性和安全性,但仍未能解决Unikernel的接入问题。此外,这种方法在处理vmfunc(vmfunc为虚拟机切换ept页表的指令,ept:extendedpagetables,虚拟化拓展页表,记录虚拟机物理地址到宿主机物理地址映射的信息)技术方面也存在局限性,无法充分利用vmfunc提供的加速通信功能。因此,寻求一种可以解决这些问题的新方案,成为了业界的一项重要任务。

综上所述,目前本领域的现有技术主要存在以下几个缺点:

(1)虽然容器技术在提高部署和迁移效率、提升服务伸缩性等方面具有优势,但其在隔离性和安全性上存在不足,尤其是在面对复杂和不断变化的安全威胁时。

(2)目前的实现方案,如Kata Containers,虽然提高了容器的隔离性和安全性,但仍未能解决Unikernel的接入问题,导致无法充分利用Unikernel轻量化、安全性高等优点。

(3)现有的容器运行时管理和优化方案在处理vmfunc技术方面存在局限性,无法充分利用vmfunc提供的加速通信功能。

发明内容

本发明的目的在于提供一种基于Kubernetes的Unikernel运行方法及装置,可以将Unikernel接入Containerd并且接入Kubernetes以提高容器的隔离性和安全性。

本发明提供如下技术方案:

一种基于Kubernetes的Unikernel运行方法,所述运行方法包括:

(1)解析配置文件并创建Unikernel结构体,保存状态信息;

(2)根据步骤(1)保存的状态信息启动Unikernel的守护进程,然后给守护进程发送暂停信号以供后续恢复;

(3)恢复对应Unikernel的守护进程后,使用保存的状态信息启动Unikernel进程;

(4)在Unikernel进程启动后,使守护进程等待Unikernel进程退出;

(5)Unikernel进程退出后,删除保存的状态信息。

在步骤(1)中,所述配置文件包括Unikernel的启动命令、环境变量、文件系统、挂载和命名空间,所述Unikernel结构体包括Unikernel的id,所述Unikernel的类型保存到配置文件中。

在步骤(2)中,所述守护进程启动后进行如下操作:

(2-1)根据Unikernel的类型使用IOCTL系统调用来获取Unikernel的扩展页面表指针信息;

(2-2)进行环境配置:准备Unikernel的网络环境、准备Unikernel的文件系统环境和准备Unikernel的启动命令。

在步骤(2-2)中,所述环境配置的方法包括:

(2-2-1)准备Unikernel的网络环境:将Unikernel进程加入kubernetes中容器网络的API接口提供的网络命名空间中;

(2-2-2)准备Unikernel的文件系统环境:检查根目录文件夹下的格式是否正确,并且处理对应的挂载项;

(2-2-3)准备Unikernel的启动命令:启动命令包括Unikernel的内核镜像文件、文件挂载、网络端口和资源限制。

其中,所述IOCTL(input/output control)系统用于与设备进行交互,在本申请中是指创建了一个内核设备,然后使用ioctl就可以获取到内核中的信息了,例如扩展页面表指针信息。

其中,容器网络的API接口为CNI插件,全称是Container Network Interface,即容器网络的API接口,是K8s中标准的一个调用网络实现的接口。

在步骤(2)中,启动命令准备完成后,守护进程接收到命令来暂停Unikernel进程的启动,随后保存Unikernel的状态信息、守护进程的进程id和Unikernel对应的扩展页面表指针信息。

由于步骤(1)保存的状态信息不完整,在步骤(2)中需要对状态信息进行补充完善。

在步骤(3)中,守护进程启动Unikernel进程的方法为:根据Unikernel的id获取到对应Unikernel的状态信息,从状态系信息中恢复到对应的结构体,然后通过发送命令给对应的守护进程来恢复对应的Unikernel进程,此时真正的Unikernel进程启动;其中,所述状态信息包括步骤(1)和步骤(2)保存的状态信息。

在步骤(4)中,当守护进程等待Unikernel进程退出时,所述守护进程对所有运行中的Unikernel的状态信息进行保存,具体方法为:遍历所有Unikernel的状态信息,通过状态信息得到所有Unikernel的状态信息后进行保存。

在步骤(4)中,在Unikernel进程退出过程中,需要进行如下操作:停止Unikernel相关的子进程、给Containerd发送子进程被停止的信号、处理Unikernel服务注销的逻辑。

本发明还提供了一种基于Kubernetes的Unikernel运行装置,包括存储器和一个或多个处理器,所述存储器中存储有可执行代码,所述一个或多个处理器执行所述可执行代码时,用于实现上述基于Kubernetes的Unikernel运行方法。

本发明还提供了一种计算机可读存储介质,其上存储有程序,该程序被处理器执行时,用于实现上述基于Kubernetes的Unikernel运行方法。

与现有技术相比,本发明具有以下优异效果:

(1)本发明提供的运行方法和装置能将轻量级操作系统的Unikernel接入Containerd并且接入Kubernetes,以充分利用Unikernel的优势,提高容器的隔离性和安全性。

(2)本发明提供的运行方法和装置中的运行时环境能够管理所有的Unikernel并使其适应服务网络的架构,进一步提高容器服务的效率和稳定性。

(3)本发明提供的运行方法和装置能够优化运行时环境,使其支持vmfunc通信技术,从而加速Unikernel间的通信效率,提高整体的运行效率。

附图说明

图1为本发明提供的一种基于Kubernetes的Unikernel运行方法的流程图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

如图1所示,本发明提供的基于Kubernetes的Unikernel运行方法包括以下步骤:

(1)解析配置文件并创建Unikernel结构体,保存Unikernel的状态信息;

(2)根据步骤(1)保存的状态信息启动Unikernel的守护进程,然后给守护进程发送暂停信号以供后续恢复;

(3)恢复对应Unikernel的守护进程后,使用保存的状态信息启动Unikernel进程;

(4)在Unikernel进程启动后,使守护进程等待Unikernel进程退出;

(5)Unikernel进程退出后,删除保存的状态信息。

在具体实施例中,为Unikraft实现了一个名为Runu的CRI运行时来实现上述运行方法,它可以处理Unikernels的生命周期,并允许它们部署在Kubernetes环境中;Runu可以理解为一个管理Go开发的客户端运行时的工具,主要功能是封装QEMU来管理Unikernel的创建和删除;此外,runu实现了IOCTL中间件,用于管理与Unikernel相关的EPTP信息以便Unikernel使用vmfunc技术。

具体的运行方法包括以下步骤:

步骤1:Runu create会解析配置文件并且创建一个包含所有信息的Unikernel结构体,然后保存状态信息以供后面使用。

Runu的创建命令包括自定义的Unikernel的id,配置文件中会保存Unikernel的类型供后面kvm分配EPTP的时候使用。

同时配置文件config.json符合oci标准,其中包括Unikernel的具体启动命令、环境变量、文件系统、挂载、命名空间等重要信息。

步骤2:Runu会根据步骤1保存的状态信息启动Unikernel的守护进程,这个守护进程负责Unikernel的启动以及各种环境的配置,然后给守护进程发送暂停信号以供后续恢复。

具体来说,守护进程会先根据Unikernel的类型使用IOCTL系统调用,然后将信息传入一个中间件内核模块,这个内核模块起到中转的作用,它直接调用kvm中的函数去分配EPTP index并且返回给中间件模块从而返回给Runu。这个index是每个Unikernel独有的,这样就能保证每个Unikernel的EPTP index不会重复,从而保证vmfunc的使用。

在获取到EPTP index后,守护进程开始准备启动Unikernel,其过程包括:

准备Unikernel的网络环境,将进程加入kubernetes中cni插件提供的网络命名空间中,从而使得Unikernel接入到kubernetes中使用。

准备Unikernel的文件系统环境,检查根目录文件夹下的格式是否正确,并且处理对应的挂载项。

准备Unikernel的启动命令,通常来说会包括:Unikernel的内核镜像文件、文件挂载、网络端口、资源限制等。

准备过程后,Runu会通过cmd启动命令,并且在启动命令后给守护进程发送kill-19也就是SIGSTOP命令去暂停Unikernel的启动,随后Runu会把Unikernel的状态进行保存,并且把守护进程的进程id、Unikernel对应的EPTP index也保存下来。

步骤3:Runu start会根据提供的Unikernel id启动对应的Unikernel。

具体来说,Runu会根据id获取到对应Unikernel之前保存的状态信息(包括步骤1和步骤2保存的状态信息),并且从状态信息恢复到对应的结构体,获取到结构体后对之前保存的Unikernel对应的守护进程发送kill-18也就是SIGCONT命令去恢复对应的Unikernel进程,这样以来真正的Unikernel进程会启动。

在启动后,Unikernel的守护进程会等待Unikernel进程退出,不管是被人为停止还是自己退出都能触发守护进程的下一步操作。

Runu能够通过list命令去获取所有运行的中Unikernel,具体原理是去遍历所有Unikernel的状态信息,通过状态信息可以得到所有Unikernel的状态,进而返回给终端或者Containerd等接口。

步骤4:Runu kill会使得对应的Unikernel优雅退出,处理进程退出前后的一系列信息。

具体而言,Runu kill会首先解析命令行参数中的信号量,通过信号量发送给Unikernel进程,如果是将Unikernel进程退出了,那么Unikernel对应的守护进程会开始善后工作,具体包括停止所有Unikernel相关的子进程、给Containerd-shim进程发送子进程被停止的信号SIGCHLD、处理Unikernel服务注销的逻辑。

处理Unikernel服务注销的原因是如果Unikernel启动时会向注册中心通过vmfunc发送服务注册请求,那么如果Unikernel崩溃的时候没有及时向注册中心发送注销请求的话会导致服务注册中心的数据不一致。所以此时需要Runu给服务的注册中心发送http数据包,其中携带Unikernel的EPTP index,这样的话注册中心就能及时注销掉相关的Unikernel服务。

步骤5:Runu delete会把对应的Unikernel彻底删除,包括状态信息等信息。

这样经过Runu的五个步骤就可以完整的管理Unikernel的生命周期,保证vmfunc功能的正常使用,同时拥有接入Containerd以及kubernetes的能力。

本发明通过上述运行方法,能够有效地管理Unikernel的生命周期,保证vmfunc功能的正常使用,同时拥有接入Containerd以及Kubernetes的能力。

本发明实施例还提供了一种基于Kubernetes的Unikernel运行装置,包括一个或多个处理器,存储器中存储有可执行代码,处理器执行可执行代码时,用于实现上述实施例中的基于Kubernetes的Unikernel运行方法。以软件实现为例,作为一个逻辑意义上的装置,是通过其所在任意具备数据处理能力的设备的处理器将非易失性存储器中对应的计算机程序指令读取到内存中运行形成的从硬件层面而言,除处理器、内存、网络接口、以及非易失性存储器之外,实施例中装置所在的任意具备数据处理能力的设备通常根据该任意具备数据处理能力的设备的实际功能,还可以包括其它硬件,对此不再赘述。

本发明实施例还提供一种计算机可读存储介质,其上存储有程序,该程序被处理器执行时,实现上述实施例中的基于Kubernetes的Unikernel运行方法:计算机可读存储介质可以是前述任一实施例所述的任意具备数据处理能力的设备的内部存储单元,例如硬盘或内存。所述计算机可读存储介质也可以是任意具备数据处理能力的设备,例如所述设备上配备的插接式硬盘、智能存储卡(Smart Media Card,SMC)、SD卡、闪存卡(Flash8 Card)等。进一步的,所述计算机可读存储介质还可以既包括任意具备数据处理能力的设备的内部存储单元也包括外部存储设备。所述计算机可读存储介质用于存储所述计算机程序以及所述任意具备数据处理能力的设备所需的其它程序和数据,还可以用于暂时地存储已经输出或者将要输出的数据。

以上所述仅为本发明的实施例而已,并不用于限制本发明。对于本领域技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本发明的权利要求范围之内。

相关技术
  • 一种基于Kubernetes构建的容器云安全防护方法与系统
  • 一种列车运行监控装置的自动测试系统、方法及装置
  • 一种基于Unikernel的云端Android运行环境构建方法
  • 一种基于Kubernetes的旁路无侵入式应用运行中的全行为监测方法及系统
技术分类

06120116513958