迈向更可靠,更可用的基于Docker的容器云外文翻译资料

 2022-12-20 18:45:26

英语原文共 7 页,剩余内容已隐藏,支付完成后下载完整资料


迈向更可靠,更可用的基于Docker的容器云

Mudit Verma Mohan Dhawan

IBM Research IBM Research

摘要:操作系统级虚拟化技术或众所周知的容器代表了轻量级虚拟化的下一代产品,主要由Docker代表。 但是,Docker目前的设计却没有从基于Docker的容器云计算中获得SLA,从而保证了可靠性和高可用性。 容器和Docker守护程序之间的紧密耦合由于故障或升级而导致守护程序无法访问时容器的正常运行时间被证明是致命的。 我们介绍了从根本上设计和实施HYDRA将容器与正在运行的守护程序隔离。 我们的评估表明,HYDRA甚至只施加适度的开销在负载下,同时实现更高的容器可用性。

  1. 简介

基于容器或基于操作系统的虚拟化正变得越来越流行,以便为应用程序提通过利用相同的底层操作系统内核[18-20]。虽然存在几个商业容器实现[4,10,12,13],但Docker [4]提供了一种易于使用的应用程序打包和分发机制,越来越受欢迎,以及几个基于Docker的内容来自Google [8],IBM [5],微软[17],Joyent [6]等的云计算产品。

虽然这些基于Docker的云服务提供严格的服务SLA承诺可靠性和可用性,就像基于VM的云,现有的Docker架构本身成为一种障碍。具体来说,生成的容器是Docker守护程序的直接后代(请参阅图1),负责容器创建,状态管理,监督和沟通容器。守护进程和容器之间的这种紧密耦合使得守护进程成为单点失败,从而导致守护进程不可用影响容器的正常运行时间。虽然,容器(以及他们的应用程序)不需要守护进程的存在以实现其功能,Docker仍然会中止守护进程重启,崩溃或升级时的所有容器。

最近[1-3]在容器云的背景下, 已经讨论了Docker守护进程的可靠性。 Kubernetes报告了几个Docker守护进程崩溃Docker漏洞,内存不足/磁盘错误,破坏了Docker拉等等,立即中止所有容器。在IBM的容器云,必须中止所有正在运行的容器在每次Docker升级时,经常发生。

以上问题是如何单一的一个例子故障点影响整个系统。虽然它有在其他情况下已经解决了,问题是相关的对于今天基于Docker的容器云,服务器上运行的不同容器可能属于相同或不同的客户端,可能托管高可用性或无状态服务。在这种情况下,一个容器由诸如守护进程之类的外部因素引起的停机时间死亡/升级,是非常不受欢迎的。

我们提出设计(sect;2)和实施(sect;3)HYDRA,解耦Docker守护进程和容器不影响任何功能。具体来说,HYDRA重新组织了流程依赖关系在守护进程和容器之间运行,容器和守护进程是进程树中的兄弟,即使在守护程序不可用的情况下也不会受到影响。

我们已经构建了HYDRA的原型,我们的评估(第4节)显示HYDRA允许升级到守护进程没有中止任何容器。此外,使用500个Redis和200个Tomcat容器,HYDRA将启动延迟提高了约53%(或800毫秒)和〜33%(或190毫秒),分别超过vanilla Dokcer。另外,Docker守护进程的驻留内存利用率HYDRA,与集装箱的数量成比例地增加守护进程的内存使用量仅增加10 MB 20 MB甚至500 Redis容器,即节省比vanilla Dokcer好92%。

  1. HYDRA

我们确定了高可靠性的广泛设计目标可用容器架构如下:

图1 Docker进程树 图2 HYDRA进程树 图3 l-HYDRA进程树

(1)最小容器停机时间:守护程序不可用不得影响容器的正常运行时间,容器应用程序必须继续正常运行。

(2)高守护进程可用性:守护进程必须具有停机时间最短。 如果发生崩溃,它必须迅速恢复其先前的状态。

(3)低开销:可靠性和可靠性的提高可用性不得对控制平面产生不利影响守护进程和容器之间的操作。最后,虽然希望无缝地进行使用上述内容改进现有的Docker部署属性,我们不把它作为这项工作的重点。

2.1 设计

关键想法。 HYDRA重新构建了流程依赖关系,以消除容器之间的强耦合守护进程。具体来说,HYDRA利用了自然采用孤立的Linux进程的观察通过顶级INIT流程。因此,HYDRA脱钩在产生容器的第一个进程之后,来自守护进程的容器进程,例如容器

并且守护进程成为进程层次结构中的兄弟。

在HYDRA中,在接收客户端请求时创建一个容器,守护进程首先产生一个容器监视进程,随后生成容器。容器进程启动后,监视器将替换本身(使用UNIX exec)具有超轻量级代码,其主要职责是协助容器和守护进程之间的通信。 HYDRA然后守护监视器,即守护进程和监视器之间的父子关系被解耦,其后是孤立的监视器(以及它的容器)由顶级INIT采用。图2显示HYDRA的流程层次结构。

      1. 每个容器监视进程

HYDRA的每个容器监视器是无状态的。 但是,它负责将容器的状态传达给守护进程,并管理它与Docker的交互客户。 显示器必须与容器通信(a)pid(当产生容器时),以及(b)退出状态(当容器完成执行时),状态守护进程内的管理。 为了重现所有Docker功能,监视器必须启用机制来将I / O流附加和重定向到客户端。

      1. 守护进程 - 容器通信

Docker目前利用父子层次结构守护进程和容器之间的通信。对于例如,守护进程对容器执行等待在单独的线程中处理以确定其执行状态。但是,随着这个过程的重组HYDRA中的层次结构,守护程序和容器之间的这些控制平面通信通道不再存在。为了保留现有的Docker功能,HYDRA便于所有控制平面操作利用守护进程和每个容器监视进程之间的带外通信机制。

  1. 守护进程的容器:守护进程的容器沟通是由监督过程调节的。一旦容器终止,等 待监视器就会HYDRA中的监视进程
  2. 将退出状态写入文件中
  3. 发送一个特殊信号(如SIGRTMIN - SIGRTMAX,SIGUSR1,SIGUSR2)守护进程读取文件

(iii)退出自身。如果守护程序不可用或已死,则在a后续重启,守护进程从中读取保存的状态文件并执行必要的状态管理。

(2)守护进程到容器:守护进程通信与容器通过直接信号。 percontainer监视器进 程通知守护进程容器的pid在它发布时,其后是daemon可以发送管理指令到con使用 像这样的信号进行简化(即停止,暂停,终止,继续)SIGTERM,SIGSTP,SIGKILL, SIGCONT等

(3)控制平面I / O:HYDRA利用进程间管道重定向所有I / O流(stdin,stdout和

stderr)在Docker客户端和容器之间。

2.2 可用性和可靠性

如果守护程序重新启动,则在崩溃或升级后,Docker会重新启动与该守护程序关联的所有先前执行的容器。但是,HYDRA不会终止任何正在运行的容器,因为容器未绑定到特定的守护程序实例。因此,HYDRA在设计上避免了容器停机造成的守护程序不可用。解耦守护进程的父子关联和容器允许每容器监视进程与守护进程的任何实例进行通信,因为与现有的Docker实现不同,没有特定的守护进程拥有HYDRA中的容器。因此,原则上,这种分布式关联将帮助HYDRA实现守护进程本身的高可用性扩展相同/不同的守护进程实例主机和分布式负载均衡来自CLI或远程API的请求。

从监视器崩溃中恢复。HYDRA并没有消除容器停机的可能性。虽然监控过程本身可能会无意中终止,但它只会影响一个容器。在监视器崩溃的情况下,INIT采用孤立容器,并且在没有停机时间的情况下继续正常运行。但是,守护程序无法控制/与此类容器交互。 H YDRA的守护进程通过以下方式克服了这个问题:(a)维护监视器和容器的pid列表,以及(b)在专用线程中定期轮询监视器进程。当守护进程检测到一个活的但是孤立的容器(基于pid关联)时,它会强制执行取下并重新启动容器,从而保持与监视器和容器的连接。

2.3 Lazy-HYDRA(l-HYDRA)

在惰性的HYDRA中,新产生的监视器(以及他们的容器最初是守护进程的直接子进程,就像当前的Docker实现一样。 但是,在守护程序失败时(由于崩溃或升级),所有监视器(以及它们正在运行的容器)都会变成孤立状态,并由顶级INIT进程自然采用。 图3显示了l-HYDRA的过程树。虽然在功能上相当于HYDRA,但是l-HYDRA设计具有较少的同质性,目前已经产生作为当前守护程序实例的后代附加的监视器(以及容器1和2),以及连接到INIT进程的孤立监视器以及容器3和4(由于先前的守护程序崩溃)。

  1. 实现

我们增强了vanilla Docker v1.8.0以构建HYDRA的原型(根据sect;2.1)。我们在下面描述了我们实现的主要功能。

bull;监视器创建: 在每个新容器生成时,HYDRA守护程序双重分叉Docker二进制文件。最后一个分叉的Docker进程进一步产生容器进程作为其后代,随后用一个轻量级监视器代码替换自己(使用UNIX exec)。

bull;进程层次结构重组: 监视器创建完成后,监视器将终止其父进程,即分叉的中间过程,使用ppid和UNIX杀戮,从而躲避自己。监视器(沿着然后由INIT采用其容器),从而完成流程层次结构的重组。

bull;带外通信: 监视器在线程中对其后代容器进程执行等待,并通过以下方式将容器的退出状态提供给守护程序:(a)在预先写入特定文件(由containerId命名)容器中定义的路径工作区,以及(b)发送特殊信号SIGRTMIN 10从保留信号池SIGRTMIN - SIGTMAX到守护进程,在收到此信号后,读取从指定文件退出状态。在另一个线程中,监视器实现了一个监听的API服务器它自己的唯一套接字(containerId.sock)。守护进程维护并提供此套接字信息Docker客户端,客户端之后直接连接到监视器以进行容器I / 0重定向。

HYDRA需要对~1300 LOC进行修改25个文件,仅影响40个Docker命令1中的12个。上述变化仅占Docker的1% LOC的代码库,以及lt;3%的代码库总文件。因此,只需要很少的改变显着提高了可靠性和可用性容器。我们还按照第2.1节中的描述实现了l-H YDRA。 l-HYDRA利用了HYDRA的大部分代码库,除了它需要单个fork(而不是上面描述的双分支),并且不需要后续监视器的守护程序。

4.评估

在第4.1节中,我们展示了HYDRA在不同条件下提供的可靠性,并量化了影响守护程序,容器和应用程序中的守护程序崩溃。 在第4.2节中,我们测量了感知的最终用户延迟为HYDRA。 最后,在第4.3节中,我们比较了可扩展性HYDRA对阵vanilla Dokcer。

实验步骤。所有实验均在配置有16个核心的虚拟机上执行2.0 GHz,32 GB RAM,运行64位Ubuntuv14.04。 我们比较H YDRA和-HYDRA香草Docker v1.8.0。 除非说明,我们评估l - HYDRA考虑到一个没有突然崩溃的守护进程,即新的容器连接到守护进程的层次结构。 此外,所有实验(第4.3节除外)都假设没有先前运行的容器,并使用官方的,未修改的容器图像。

___________________________

1受影响的Docker命令是attach, exec, kill, pause, restart, run, start, stats, stop, top, unpause, 和 wait.

(a)恢复守护进程时间 (b) 恢复运行容器时间 (c) vanilla Docker的应用程序停机时间

图4 HYDRA与l-H YDRA对vanilla Docker的可靠性比较

4.1可靠性

守护进程重启需要

  1. 恢复守护进程状态,

(ii)重新启动所有以前运行的容器,并重新启动

(iii)初始化容器应用程序他们运作。

在下面的实验中,我们首先启动一个应用程序容器,然后杀死它守护进程。然后我们计算两个HYDRA和l-HYDRA在守护进程上的vanilla Docker上通过测量恢复守护进程和控制的时间重新启动,以及完成应用程序初始化的时间(在容器恢复后)。我们也测量了由于Docker升级导致应用程序中断。

(I)守护进程重启。 Redis是一种轻量级的应用程序运行很少进程并且有初始化率低的时间,而Tomcat是一个重量级的应用程序有几个进程和高初始化时间。因此,两者

Redis和Tomca

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[19660],资料为PDF文档或Word文档,PDF文档可免费转换为Word

您需要先支付 30元 才能查看全部内容!立即支付

课题毕业论文、外文翻译、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。