p2p如何拯救k8s镜像分发的阿喀琉斯之踵

2020 年 3 月 30 日

p2p如何拯救k8s镜像分发的阿喀琉斯之踵

k8s的出现为PaaS行业的发展打了一针兴奋剂,Docker+k8s的技术路线已经成为了容器云的主流。尤其针对大流量、大弹性的应用场景来说,k8s将其从繁杂的运维、部署工作中彻底拯救出来。然而事情往往没有那么简单而美好,当我们使用k8s去管理一些大规模集群的时候,我们会发现有很多问题等待我们解决。


比如,当集群中的所有节点同时去镜像仓库拉取镜像的时候,这种大规模并发很有可能阻塞仓库的出口,导致大家的下载速度都慢得难以忍受,这就是 k8s 镜像分发的阿喀琉斯之踵。我们当然可以采取镜像仓库集群化的方法来缓解这个瓶颈,然而这种做法始终是治标不治本,此外还会造成维护成本升高,以及镜像同步时效性差等问题。


那么如何解决这个让人困扰的问题呢?


p2p 看起来是一个好办法,去中心化的做法,不但可以降低对仓库节点的依赖,同时也可以为用户节省宝贵的外网流量。但是在 k8s 集群中拉取镜像的场景内使用 p2p 技术要面对一系列困难,包括节点间数据安全性的问题、无预热前提下的大规模并发拉取、非侵入式将集群改造成 p2p 网络等。经过不断的探索与实验,华为云容器镜像服务,终于摸索出了一套在 k8s 集群中完美整合 p2p 下载的方案。该方案的提出有效的解决了我们遇到的实际问题,提高了镜像下载速度,并为客户节省了大量带宽资源。


p2p 改造后的集群下载测试结果



如上图所示,我们限制了镜像仓库的下载带宽,并测试了 200 节点与 500 节点情况下,不同下载方式的状况。随着节点数量的增大,并发量触及到镜像仓库下载瓶颈的可能性也随之增大。然而使用了 p2p 下载方式改造的 k8s 集群并没有受到该瓶颈的制约,表现远强于传统下载方式。尤其是对于较大的镜像,差距更为明显。


我们是如何把 p2p 下载整合到 k8s 集群内的呢?


在华为云容器镜像服务中我们是这样做的,我们改变了所有集群节点去镜像仓库拉取镜像的传统做法。在用户节点中注入 peer 客户端,使用 peer 客户端截取 docker client 的拉取镜像请求,并将请求重定向。经过修改后只有部分节点(约 10%)真正到达镜像仓库去获取镜像数据,剩余节点转为自集群内的其它节点获取镜像。要实现这个方案,主要的开发点有三处:需要对镜像仓库进行改造,部署并改造新的 tracker 服务器,以及在用户节点注入 peer 客户端。



对镜像仓库的改造


要想实现集群的 p2p 下载功能,所下载的文件必须包含有种子,因此要对已有的镜像仓库进行改造。当用户 push 镜像到镜像仓库时,仓库自动计算镜像所有 layer 的 SHA 值,并为每一个 layer 生成一个种子文件。


为了保证集群的安全性验证,仓库为每个接入的 peer 下发由仓库私钥签名的 jwt token,这个 token 将会进入集群网络,并保证集群节点的认证安全。


部署改良后的 tracker 服务器


传统的 Tracker 服务器的主要功能是为所有 peer 客户端提供 peer 列表。针对 k8s 集群场景,我们所搭建的 Tracker 服务器除了负责分发 peer 列表外,还增加了许多其它特性。


  • 1.判断peer节点的集群归属,因为tracker服务器可能对多个集群进行服务,而每个集群中的节点网络相对独立,因此tracker负责记录peer节点的集群归属信息很有必要,这样可以避免分发出网络不互通的peer列表。

  • 2.Tracker服务器负责监控每个peer的状态,自动将部分下载完成的peer节点资源释放,因为集群节点属于客户资源,一旦完成任务应该尽快将资源释放出去。当Tracker判断当前集群中完成节点比例已足够支撑下载时,会指示部分已完结节点终结任务释放资源,并将其移除出任务列表。当所有peer节点均已完成下载,而且一段时间内没有新的下载请求进入,那么Tracker会指示将全部集群节点资源释放。

  • 3.Tracker按比例(约10%)指定部分peer节点到镜像仓库下载,以此将数据带入整个集群网络。

  • 4.Tracker提供peer节点的安全性验证,保证同属于一个集群并下载同一个资源的peer节点有获取peer列表的权限。


容器化的 peer 客户端


在这个解决方案中,我们创造性的将 peer 客户端容器化,并通过华为云容器引擎(CCE)的插件功能,将 peer 容器分发给整个集群。peer 容器可以通过修改 docker 客户端代理的方式,拦截下载镜像请求的相关接口,将从镜像仓库下载操作转化为 p2p 网络下载操作,并把获取到的镜像数据归还给 docker 客户端,以此快速的把镜像数据分发到整个集群网络。该 peer 客户端还具有以下特性:


  • 1.根据tracker的分配,修改下载地址,小部分从镜像仓库下载,大部分从集群网络中下载。

  • 2.在peer客户端的tcp握手协议中注入jwt token安全校验,保证节点数据安全,防止假冒节点盗取数据。

  • 3.Peer客户端采用优先级下载方式,能够保证在下载过程中就可以将数据传输给docker客户端,而不是当数据全部下载完全后再传输给docker,以此最大限度的节省下载实际。


本文转载自 华为云产品与解决方案 公众号。


原文链接:https://mp.weixin.qq.com/s/FiwoU4RnAYTC1AtMsWR-nA


2020 年 3 月 30 日 10:46200

评论

发布
暂无评论
发现更多内容

水滴石穿之Java学习之路

孟旬

Java 学习 后端

伯克利:serverless是下一代计算范式

华为云开发者社区

云计算 服务

Spring Cloud 微服务实践(8) - 部署

xiaoboey

Docker zookeeper 微服务 Spring Cloud actuator

看这里!带你快速体验MindSpore V1.0(For ubuntu 18.04)

华为云开发者社区

华为 AI 技术

Java 未捕获异常处理

朱华

Java Exception

技术分享丨华为鲲鹏架构Redis知识二三事

华为云开发者社区

redis 鲲鹏

Minds Factory 2020 HUAWEI HiCar 创新活动

Jessie

物联网 创新 智能 汽车 大赛

Github资源在线加速下载

xcbeyond

GitHub 工具类网站

Java之父都需要的《Effective Java中文版(第3版)》到底有多牛

Java成神之路

Java 程序员 面试 编程语言

链表反转的两种实现方法,后一种击败了100%的用户

小Q

Java 程序员 数据结构 算法 开发

MySQL-技术专题-mysql的联合索引

李浩宇/Alex

链表反转的两种实现方法,后一种击败了100%的用户!

王磊

Java 数据结构 算法

LeetCode题解:83. 删除排序链表中的重复元素,HashMap,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

惊艳!阿里出产的MyCat性能笔记,带你领略什么叫细节爆炸

周老师

Java 编程 程序员 架构 面试

关于GO语言,这篇文章讲的很明白

华为云开发者社区

go 编程语言 语言

程序员的美丽假期(并不)

Learun

程序员 敏捷开发 软件设计

九面成功定级阿里资深架构师,拿到180W年薪+15000股,学习一下大神的成长之路!

Java架构追梦

Java 学习 架构 面试 微服务

解密360容器云平台的Harbor高可用方案

博文视点Broadview

容器 高可用 云原生 k8s Harbor

对象的实例化内存布局与访问定位

朱华

Java 对象初始化

头条终面:写个消息中间件

yes的练级攻略

消息队列 面试技巧

中国首个“芯片大学”即将落地;生成对抗网络(GAN)的数学原理全解

京东智联云开发者

技术 网络 GAN 芯片

MySQL-技术专题-事务实现原理

李浩宇/Alex

英特尔为北京2022年冬奥会打造智慧新体验

intel001

c++笔记——类

菜鸟小sailor 🐕

c++

《谛听说智能》迎来圆满落幕,企业降本增效新指南

Geek_e670ab

MySQL-技术专题-解决死锁问题

李浩宇/Alex

DB-Engines 10月数据库排名:“三大王”无人能敌,PostgreSQL紧随其后

华章IT

数据库 postgresql Clickhouse MySQ

滴滴导航若干关键功能的技术突破与实践

滴滴技术

人工智能 滴滴技术 滴滴导航

不走寻常路

滴滴技术

招聘 滴滴技术 地图与公交事业群分享月

违规内容屡屡曝光下,企业如何自救

Geek_e670ab

使用 Flutter 快速实现聊天应用

LeanCloud

flutter 后端 聊天

p2p如何拯救k8s镜像分发的阿喀琉斯之踵-InfoQ