本文介绍 P2P 加速功能的基本概念、配置方法、使用方法以及故障排查。

什么是 P2P 加速

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

镜像服务企业版提供了 P2P 加速的能力,可以在大规模容器集群批量下载镜像的场景中,提升容器镜像分发能力,享受极速镜像拉取速度,减少应用部署时间。

说明
  • 当集群规模达到 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 4C32G 本地 SSD ECS,并发拉取 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
    					

如果无法解决,请提交工单处理。