P2P加速利用计算节点的内网带宽资源,在节点之间分发镜像。P2P加速功能可以提升镜像拉取速度,减少应用部署时间。当大规模容器集群批量下载镜像时,您可以使用P2P加速功能。本文介绍如何在ACK集群和Docker环境使用P2P加速功能。

前提条件

  • 已创建容器镜像服务企业版实例,且您创建的企业版实例必须为标准版或高级版。具体操作,请参见创建企业版实例
  • 已在容器镜像企业版实例中配置ACK集群对应的专有网络。具体操作,请参见配置专有网络的访问控制

背景信息

当大规模容器集群批量下载镜像时,镜像后端存储服务器(OSS)的网络带宽会成为性能瓶颈,导致镜像拉取缓慢。P2P加速功能利用您计算节点的带宽资源,进行节点之间镜像分发,减少对镜像存储后端服务器的压力,可以大幅提升镜像拉取速度,减少应用部署时间。经测试,1000节点规模下拉取1 GB大小的镜像,相比普通镜像拉取方式(OSS带宽10 Gbps),P2P加速方式可以减少约95%以上的镜像拉取时间。

在ACK集群使用P2P加速

步骤一:授予ACR资源的读权限

如果您使用的是ASK集群,需要为您的P2P组件授予访问ACR资源的读权限。
说明 如果您使用的是托管版和专有版集群,无需配置访问ACR资源的权限,默认已开通。
  1. 创建RAM角色。
    创建RAM角色时设置角色类型普通服务角色,受信服务为云服务器。具体操作,请参见创建可信实体为阿里云服务的RAM角色
  2. 设置RAM角色权限策略。
    授予RAM角色AliyunContainerRegistryReadOnlyAccess权限策略。具体操作,请参见为RAM角色授权

步骤二:获取容器镜像实例ID

  1. 登录容器镜像服务控制台
  2. 在顶部菜单栏,选择所需地域。
  3. 在左侧导航栏,选择实例列表
  4. 实例列表页面单击目标企业版实例。
  5. 概览页面左上角查看容器镜像实例ID。

步骤三:安装P2P组件

  1. 登录容器服务管理控制台
  2. 在控制台左侧导航栏中,选择市场 > 应用目录
  3. 应用目录页面搜索ack-acr-acceleration-p2p,找到ack-acr-acceleration-p2p,然后单击ack-acr-acceleration-p2p。
  4. 单击参数页签,设置registryInstances参数为步骤5获取的容器镜像实例ID。
    如果有多个容器镜像实例,则设置registryInstances参数时,中间用英文逗号(,)连接。
    说明 默认占用节点上的65001端口,如果有冲突,请根据实际情况修改。
    p2p:
      ...
      # Port of P2P Agent in host network
      port: 65001
    
      # Id of ACR registry instances, support multi, e.g. "cri-xxx,cri-yyy"
      registryInstances: <ACR instance Id>
  5. 可选:设置controller.ramRole参数为步骤1创建的服务角色名称。
    说明 仅ASK集群需要设置controller.ramRole参数,其他集群可以直接跳过该步骤。
    controller:
      ...
      # Ask cluster setting, in order to accessing ACR OpenAPI(Get*, List*) for ECS
      ramRole: <your ram role name>
  6. 创建面板选择集群,然后单击创建

步骤四:启用P2P加速

您可以通过添加标签的方式启用P2P加速,可以为应用负载添加P2P加速标签,例如Pod、Deployment等。也可以为ACK集群的命名空间设置P2P加速标签。为命名空间设置P2P加速标签后,该命名空间内的所有符合加速条件的应用负载都会启用P2P加速,无需再修改应用负载的YAML文件。根据实际情况选择任一方式添加P2P加速标签。
说明 标签的名称为k8s.aliyun.com/image-accelerate-mode,值为p2p
  • 为应用负载添加P2P加速标签。
    以下以Pod为例设置标签。执行以下命令,为Pod设置标签。
    kubectl edit pod <Pod名称>
    在Pod文件中添加标签k8s.aliyun.com/image-accelerate-mode=p2p
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        # enable P2P
        k8s.aliyun.com/image-accelerate-mode: p2p
      name: test
    spec:
      containers:
       # your ACR instacne image
       - image: test-registry-vpc.cn-hangzhou.cr.aliyuncs.com/docker-builder/nginx:latest
         name: test
         command: ["sleep", "3600"]
      # your ACR instacne image pull secret
      imagePullSecrets:
      - name: test-registry
  • 为命名空间添加P2P加速标签
    • 通过控制台添加P2P加速标签。
      1. 登录容器服务管理控制台
      2. 在控制台左侧导航栏中,单击集群
      3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
      4. 在集群管理页面单击命名空间
      5. 命名空间页面单击目标命名空间操作列的编辑
      6. 编辑命名空间对话框中设置标签变量名称k8s.aliyun.com/image-accelerate-mode标签变量值p2p,然后单击确定
    • 通过命令行添加P2P加速标签。
      kubectl label namespaces <your-namespace> k8s.aliyun.com/image-accelerate-mode=p2p

验证P2P加速

启用P2P加速后,P2P组件会自动为Pod注入P2P相关annotation、P2P加速镜像地址以及对应的镜像拉取凭证。
注意
  • 若您原有应用负载YAML中不存在ACR企业版实例的镜像,或者没有配置对应的非P2P加速域名地址的镜像拉取凭证,P2P组件会跳过Pod的自动注入。
  • P2P镜像拉取凭证与您原先配置的非P2P镜像地址拉取凭证仅镜像仓库域名不一样,其他凭证信息一致。因此,若您原先镜像拉取凭证用户信息配置错误,也会导致P2P镜像拉取失败。

执行以下命令,查看Pod。

kubectl get po <Pod的名称> -oyaml

预期输出:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    # inject p2p-annotations automatically
    k8s.aliyun.com/image-accelerate-mode: p2p
    k8s.aliyun.com/p2p-config: '...'
spec:
  containers:
   # inject image to p2p endpoint
   - image: test-registry-vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65001/docker-builder/nginx:latest
  imagePullSecrets:
  - name: test-registry
  # inject image pull secret for p2p endpoint
  - name: acr-credential-test-registry-p2p

可以看到,Pod已注入P2P相关annotation、P2P加速镜像地址以及对应的镜像拉取凭证,说明启用P2P加速成功。

在Docker环境使用P2P加速

  1. 登录ECS实例,具体操作,请参见使用SSH密钥对连接Linux实例
  2. 执行以下命令,下载P2P组件安装包。
    docker run --rm -v /var/lib/aliyun-acr/p2p:/var/lib/aliyun-acr/p2p registry.cn-hangzhou.aliyuncs.com/acr-toolkit/p2p-installer-manual:v1.0.6-b6b9f5f9-aliyun
  3. 配置P2P组件。
    /var/lib/aliyun-acr/p2p/scripts/01-init.sh --ak <aliyun-ak> --sk <aliyun-sk> --port 65001 --instance <acr-ee-instance-id>
    根据实际情况替换命令行中的AccessKey ID、AccessKey Secret、ACR企业版实例ID和P2P组件端口,P2P组件端口默认为65001。
    说明 AccessKey ID和AccessKey Secret仅用于配置初始化过程中获取容器镜像企业版实例信息。
    配置成功后,生成/var/lib/aliyun-acr/p2p目录。
  4. 执行以下命令,启动P2P组件。
    说明 若您有多台ECS需要安装P2P组件,您需要复制步骤3的配置目录至其他机器,再执行启动P2P组件命令。
    /var/lib/aliyun-acr/p2p/scripts/02-run.sh
  5. 执行以下命令,登录P2P加速域名镜像仓库。
    docker login <加速域名镜像仓库地址>
    加速域名镜像仓库地址格式为<容器镜像企业版实例名称>-registry-vpc.distributed.<容器镜像企业版实例所在地域>.cr.aliyuncs.com:<P2P组件端口>。
  6. 执行以下命令,使用P2P加速域名拉取域名。
    docker pull <加速域名镜像仓库地址>/test/busybox:latest
  7. 可选:执行以下命令,卸载P2P加速组件。
    /var/lib/aliyun-acr/p2p/scripts/03-uninstall.sh