Kraken-P2P Docker注册表

2020-11-03 17:43:54

Kraken是一个P2P驱动的Docker注册中心,专注于可伸缩性和可用性。它专为混合云环境中的Docker映像管理、复制和分发而设计。借助可插拔的后端支持,Kraken可以轻松集成到现有的Docker注册表设置中作为分布层。

自2018年初以来,Kraken一直在优步生产。在我们最繁忙的集群中,Kraken每天分发100多万个斑点,其中包括10万个1G+斑点。在峰值生产负载下,Kraken在30秒内分发20K 100MB-1G斑点。

高度可扩展。Kraken能够在每台主机上以最大下载量的50%分发Docker映像(速度限制)。集群大小和映像大小对下载速度没有显著影响。支持任意大的斑点/层。为了获得最佳性能,我们通常将最大大小限制为20G。

可插拔存储选项。Kraken不再管理数据,而是插入可靠的BLOB存储选项,如S3、GCS、ECR、HDFS或其他注册表。存储界面简单,新选项易于添加。

Kraken的高级想法是让少量专用主机向集群中每个主机上运行的代理网络播种内容。

中心组件,跟踪器,将协调网络中的所有参与者以形成伪随机规则图。

这样的图具有高连通性和小直径。因此,即使只有一个种子机,同时有数千个对等点加入,所有参与者在理论上也可以达到最低80%的最大上传/下载速度(当前实现为60%),并且性能不会随着BLOB大小和集群大小的增加而大幅下降。有关更多详细信息,请参阅KubeCon+CloudNativeCon上团队的TechTalk。

以下数据来自一项测试,其中2600台主机同时下载一个2层的3G Docker映像(5200次BLOB下载),所有代理的速度限制为300MB/s(使用5个跟踪器和5个源):

您可以使用我们的示例Helm图表在您的K8S群集上部署Kraken(使用示例HTTP文件服务器后端):

部署后,每个节点都将在localhost上公开一个docker注册表API:30081。有关从Kraken代理拉取图像的Pod规范,请参见示例。

启动带有开发配置的羊群容器(包含源、跟踪器、构建索引和代理)和两个agenttainers:

在笔记本电脑上运行dev-cluster需要Docker-for-Mac。有关devcluster的更多信息,请查看devcluster自述文件。

蜻蜓群集有一个或几个超级节点,它们协调群集中每4MB数据块的传输。

虽然超级节点将能够做出最优决策,但是整个集群的吞吐量受到一个或几个主机的处理能力的限制,并且性能将随着BLOB大小或集群大小的增加而线性下降。

Kraken的跟踪器只帮助协调连接图,并将实际数据传输的协商留给各个同行,因此Kraken使用大的BLOB可以更好地扩展。最重要的是,Kraken是HA并支持跨群集复制,这两者都是可靠的混合云设置所必需的。

Kraken最初是使用BitTorrent驱动程序构建的,但是,我们最终实现了基于BitTorrent协议的P2P驱动程序,以便与存储解决方案更紧密地集成,并更好地控制性能优化。

Kraken的问题空间与BitTorrent的设计目标略有不同。Kraken的目标是在稳定的环境中减少全球最大下载时间和通信开销,而BitTorrent是为不可预测和充满敌意的环境而设计的,因此它需要保留稀缺数据的大部分副本,并防御恶意或不良行为的同行。

尽管有这些不同之处,我们还是会不时地重新检查Kraken的协议,如果它是可行的,我们希望它能再次与BitTorrent兼容。

如果Docker注册表吞吐量不是您部署工作流程中的瓶颈,那么切换到Kraken不会神奇地加快您的Docker获取速度。为了加快扩展坞拉取速度,请考虑在构建时切换到Makisu以提高层的可重用性,或者调整压缩比,因为扩展坞拉取会将大部分时间花在数据解压缩上。

允许变异标签(例如更新最新的标签),但是,有几件事不会起作用:由于Nginx缓存,紧接着的标签查找仍将返回旧值,并且复制可能不会触发。我们正在努力更好地支持这一功能。如果您现在需要标签转换支持,请减少构建索引组件的缓存间隔。如果您还需要在多群集设置中进行复制,请考虑将另一个Docker注册表设置为Kraken sbackend。

从理论上讲,Kraken应该分发任何大小的斑点而不会显著降低性能,但在优步,我们执行20G的限制,不能支持超大型斑点(即100G+)的生产使用。对等点在每个斑点的基础上实施连接限制,如果没有对等点相对较快地成为种子点,则新的对等点可能会缺乏连接。如果您有想要分发的超大块,我们建议您先将它们分成10G块。