在IDC或其他云厂商集群中使用P2P加速

您可以在IDC或其他云厂商集群中使用P2P加速功能提升镜像拉取速度,减少应用部署时间。本文介绍如何在IDC或其他云厂商集群中使用P2P加速功能。

前提条件

  • 已创建容器镜像服务企业版实例,且您创建的企业版实例必须为标准版或高级版。更多信息,请参见创建企业版实例

  • IDC或其他云厂商集群需要通过公网网络访问企业版实例,请确保已开启公网访问并添加白名单,更多信息,请参见配置公网的访问控制

  • 已在执行命令的环境中安装以下工具:

    • 安装Helm包管理工具,更多信息,请参见Helm

    • 安装kubectl客户端,并且能够使用kubectl访问集群。

操作步骤

  1. 执行以下命令,通过Helm方式安装P2P组件。

    export ACR_INSTANCE_REGION="<region of acr instance >"
    export ACR_INSTANCE_ID="<id of acr instance >"
    export ALIYUN_AK="<aliyun access key>"
    export ALIYUN_SK="<aliyun access key secret >"
    export P2P_CHART="https://aliacs-k8s-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/app/charts-incubator/ack-acr-acceleration-p2p-0.2.3.tgz"
    
    helm install ack-acr-acceleration-p2p $P2P_CHART -n aliyun-acr-acceleration --create-namespace \
      --set region=$ACR_INSTANCE_REGION \
      --set accessKey=$ALIYUN_AK \
      --set accessKeySecret=$ALIYUN_SK \
      --set p2p.registryInstances=$ACR_INSTANCE_ID \
      --set pullImageInternet=true \
      --set p2p.plusMode.enable=true

    安装时,可根据实际需求增加以下参数配置。

    # registry-mirror缓存数据保留时间,默认24h,根据您节点磁盘容量适当调整。
    --set p2p.plusMode.cacheTTL=<custom time>
    
    # registry-mirror缓存数据保留的宿主机路径.。
    # 若不设置, 缓存会在registry-mirror容器重启时丢失。
    --set p2p.plusMode.cacheHostPath=<host path>
    
    # 回源下载时切换到oss的公网传输加速链路,适用于公网跨海、跨地域等公网链路不稳定的场景。
    # 需要确保事先在oss控制台开启该加速能力。
    --set p2p.plusMode.ossInternetAccelerate=true
    
    # 节点上的P2P agent直接从registry-mirror或者云上registry下载,此时不会安装P2P调度组件。
    --set p2p.plusMode.downloadPattern=source
    
    # 部署scheduler和registry-mirror到指定的节点上
    # 需要您事先为指定的节点打上标签:`k8s.aliyun.com/p2p-plus-node=true`
    --set p2p.plusMode.nodeSelectorEnable=true
  2. 启用P2P加速。

    您可以通过添加标签的方式启用P2P加速,可以为应用负载添加P2P加速标签,例如Pod、Deployment等。也可以为集群的命名空间设置P2P加速标签。为命名空间设置P2P加速标签后,该命名空间内的所有符合加速条件的应用负载都会启用P2P加速,无需再修改应用负载的YAML文件。根据实际情况选择任一方式添加P2P加速标签。

    说明

    标签的名称为k8s.aliyun.com/image-accelerate-mode,值为p2p

    • 为应用负载添加P2P加速标签。

      以下以Deployment为例设置标签。执行以下命令,为Deployment设置标签。

      kubectl edit deploy <Deployment名称>

      在Deployment文件中添加标签k8s.aliyun.com/image-accelerate-mode: p2p

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: test
        labels:
          app: nginx
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              # enable P2P
              k8s.aliyun.com/image-accelerate-mode: p2p
              app: nginx
          spec:
            # your ACR instance image pull secret
            imagePullSecrets:
            - name: test-registry
            containers:
            # your ACR instance image
            - image: test-registry-vpc.cn-hangzhou.cr.aliyuncs.com/docker-builder/nginx:latest
              name: test
              command: ["sleep", "3600"]
    • 为命名空间添加P2P加速标签

      执行以下命令,为命名空间添加P2P加速标签。

      kubectl label namespaces <your-namespace> k8s.aliyun.com/image-accelerate-mode=p2p
  3. 验证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加速成功。

  4. 可选:执行以下命令,可以根据实际需求更新P2P组件参数。

    helm upgrade ack-acr-acceleration-p2p $P2P_CHART -n aliyun-acr-acceleration \
      --set p2p.plusMode.cacheTTL=72h
  5. 可选:执行以下命令,可以删除P2P组件。

    helm uninstall ack-acr-acceleration-p2p -n aliyun-acr-acceleration