当大规模容器集群批量下载镜像时,P2P加速功能可以提升镜像拉取速度,减少应用部署时间。本文介绍P2P加速功能的基本概念、配置方法、使用方法以及故障排查等。

什么是P2P加速

P2P加速是指在镜像拉取流程中,所有镜像的数据流量都从服务器中统一拉取。当几十台ECS同时拉取镜像时,容器镜像服务企业版提供的服务器可以提供顺畅的拉取能力。但当您的集群达到几百台甚至几千台的规模时,服务器的带宽限制会制约您分发镜像的时间。

说明
  • 当集群规模达到300节点以上时,使用效果会更佳。
  • 推荐使用多可用区VSwitch打散集群ECS节点。
  • 推荐使用本地SSD或者可分配内存较大的ECS实例。
  • 当集群规模较小或可分配内存不足时,可能不会起到加速的效果。

配置P2P加速插件

当前P2P加速插件可以支持Kubernetes、多可用区Kubernetes集群、Kubernetes托管版,暂不支持Serverless Kubernetes。

以下流程需要在Linux/Mac环境下运行,依赖于kubectl的方式连接到Kubernetes集群。如果您可以在命令行中执行kubectl get pod,并看到返回结果,则说明当前环境可以正常安装插件。

推荐您通过SSH登录到集群内任意节点进行操作,如果是Worker节点,请参见通过kubectl连接Kubernetes集群,完成环境中kubectl配置。

建议通过配置dockerd的max-concurrent-downloads字段至适当数值以提升镜像拉取效率,默认值为3层,可以提升至5至20层。详细信息请参考Docker官网文档

具体的安装脚本因实例而异,请登录容器镜像服务控制台,在P2P加速页面中查看具体脚本。

使用P2P方式拉取镜像

您需要通过带有distributed字样的域名拉取镜像,您可以在P2P加速页面的通过安装脚本安装P2P加速区域中查看到域名,例如hello-df-registry-vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65002

默认情况下,该P2P域名会带有65002端口,当您希望使用443端口访问时,您可以在安装P2P加速的时候指定export PORT="443"来指定想要的端口。
说明 该端口默认会在所有节点上被占用。

在拉取镜像之前,您需要登录该镜像仓库,例如执行命令docker login hello-df-registry-vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65002。拉取镜像时,您可以通过docker pull或者kubernetes集群启动应用的方式。例如您希望拉取foo命名空间下bar的镜像仓库,您可以使用docker pull hello-df-registry-vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65002/foo/bar

通过P2P方式拉取镜像时,镜像层数据会在后台预先下载完毕,再传输给Docker Engine。因此镜像拉取的前半段时间,进度条会保持静止状态,后半段时间,进度条会瞬间达到100%。

性能指标

针对300节点(示例规格:ecs.i2.xlarge、4 vCPU、32 GiB内存、本地SSD)并发拉取4层每层512 MB的镜像时,对比非P2P加速模式下减少80% 的数据拉取时间。

故障排查

运行以下命令可以列出当前P2P加速插件的所有Pod:

kubectl get pod -n cr-dfagent -o wide

可按以下情况进行排查。

  • 如果Pod数量与Worker节点数量不一致:
    • 检查未调度Pod节点上是否有taints影响DaemonSet的调度。
    • 尝试重新安装P2P加速插件。
  • 如果部分Pod出现CrashLoopBackOff异常状态时,可以通过kubectl logs命令查看失败的Pod的日志。
    kubectl -n cr-dfagent logs -f POD_NAME df-agent
    kubectl -n cr-dfagent logs -f POD_NAME df-nginx                   

如果无法解决,请登录工单系统提交工单。