すべてのプロダクト
Search
ドキュメントセンター

Container Registry:P2P 加速機能の使用

最終更新日:Nov 28, 2025

P2P 加速機能は、イメージのプルを高速化して、アプリケーションのデプロイ時間を短縮します。コンテナクラスター内の多くのノードが同時にイメージをプルする必要がある場合、P2P 加速を使用してパフォーマンスを向上させることができます。このトピックでは、P2P 加速機能を使用してイメージのプルを高速化する方法について説明します。

背景情報

コンテナクラスター内の多くのノードが同時にイメージをプルする必要がある場合、コンテナイメージストレージのネットワーク帯域幅がパフォーマンスボトルネックとなり、イメージのプルが遅くなる可能性があります。P2P 加速機能は、計算ノードの帯域幅リソースを活用して、ノード間でイメージを配信します。これにより、コンテナイメージストレージへの負荷が軽減され、イメージのプルが高速化され、アプリケーションのデプロイ時間が短縮されます。テスト結果によると、10 Gbit/s の帯域幅を持つネットワークで 1000 ノードが 1GB サイズのイメージを同時にプルする場合、P2P 加速機能は通常のイメージプルモードと比較してイメージのプル時間を 95% 以上短縮します。さらに、新しい P2P 加速モードは、古い P2P 加速モードと比較してパフォーマンスを 30% から 50% 向上させます。デフォルトでは、Container Registry がオンデマンドでイメージリソースをロードするときに、新しい P2P 加速モードが使用されます。詳細については、「コンテナイメージのリソースをオンデマンドでロードする」をご参照ください。

P2P 加速機能は、次のタイプのクラスターで使用できます:

  • ACK クラスター

  • オンプレミスクラスターおよびサードパーティのクラウド サービス プロバイダー (CSP) のクラスター

前提条件

P2P 加速エージェントがクラスターにインストールされている。

制限事項

P2P 加速機能を有効にすると、P2P 加速エージェントは Webhook を使用して、コンテナイメージのアドレスを P2P 加速イメージのアドレスに置き換えます。たとえば、P2P 加速エージェントは、元のイメージアドレス (test****vpc.cn-hangzhou.cr.aliyuncs.com/docker-builder/nginx:latest) を P2P 加速イメージのアドレス (test****vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65001/docker-builder/nginx:latest) に置き換えます。

さらに、Webhook は P2P 加速イメージをプルするためのイメージプルキーを自動的に生成します。生成されたイメージプルキーは、元のイメージプルキーからコピーされます。イメージプルキーの生成とイメージアドレスの置換は非同期で行われます。したがって、ワークロードを発行する前に、イメージのプルに必要なイメージプルキーを発行するか、手動で作成することをお勧めします。上記の例では、イメージプルキーは test-registry-vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65001 ドメインに作成されます。これにより、イメージアドレスの置換によるイメージのプル失敗を防ぐことができます。

P2P 加速を有効にする

Pod や Deployment などのワークロードに P2P 加速ラベルを追加して、ワークロードの P2P 加速を有効にすることができます。ACK クラスターの名前空間に P2P 加速ラベルを追加することもできます。これにより、名前空間内の加速条件を満たすすべてのワークロードで P2P 加速が有効になります。P2P 加速を有効にするために、ワークロードの YAML ファイルを変更する必要はありません。必要に応じて、P2P 加速ラベルを追加する方法を選択できます。

説明

P2P 加速ラベルの名前は k8s.aliyun.com/image-accelerate-mode で、値は p2p です。

  • ワークロードに P2P 加速ラベルを追加する

    この例では、P2P 加速ラベルが Deployment に追加されます。次のコマンドを実行して、Deployment の YAML ファイルを編集します:

    kubectl edit deploy <Name of the Deployment>

    k8s.aliyun.com/image-accelerate-mode: p2p ラベルを Deployment の YAML ファイルに追加します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test
      labels:
        app: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            # P2P を有効にする
            k8s.aliyun.com/image-accelerate-mode: p2p
            app: nginx
        spec:
          # ACR インスタンスのイメージプルシークレット
          imagePullSecrets:
          - name: test-registry
          containers:
          # ACR インスタンスのイメージ
          - image: test-registry-vpc.cn-hangzhou.cr.aliyuncs.com/docker-builder/nginx:latest
            name: test
            command: ["sleep", "3600"]
  • 名前空間に P2P 加速ラベルを追加する

    • ACK コンソールを使用する

      1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

      2. クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[名前空間とクォータ] をクリックします。

      3. [名前空間] ページで、P2P 加速ラベルを追加する名前空間を見つけ、[アクション] 列の [編集] をクリックします。

      4. [名前空間の編集] ダイアログボックスで、[+名前空間ラベル] をクリックし、[変数キー]k8s.aliyun.com/image-accelerate-mode に、[変数値]p2p に設定してから、[OK] をクリックします。

    • コマンドラインから P2P 加速タグを追加できます。

      kubectl label namespaces <YOUR-NAMESPACE> k8s.aliyun.com/image-accelerate-mode=p2p

P2P 加速の検証

Pod の P2P 加速を有効にすると、P2P エージェントは P2P 加速アノテーション、P2P 加速イメージのアドレス、および P2P 加速イメージをプルするためのシークレットを Pod に自動的に挿入します。

重要

P2P 加速イメージをプルするためのシークレットと元のイメージをプルするためのシークレットは、イメージリポジトリのドメイン名のみが異なります。シークレットの他の構成は同じです。元のイメージをプルするためのシークレットのユーザー情報が無効な場合、P2P 加速イメージのプルは失敗します。

次のコマンドを実行して Pod をクエリします:

kubectl get po <Name of the pod> -oyaml

期待される出力:

apiVersion: v1
kind: Pod
metadata:
  annotations:
    # P2P アノテーションを自動的に挿入
    k8s.aliyun.com/image-accelerate-mode: p2p
    k8s.aliyun.com/p2p-config: '...'
spec:
  containers:
   # イメージを P2P エンドポイントに挿入
   - image: test-registry-vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65001/docker-builder/nginx:latest
  imagePullSecrets:
  - name: test-registry
  # P2P エンドポイント用のイメージプルシークレットを挿入
  - name: acr-credential-test-registry-p2p

上記のコードでは、P2P 加速アノテーション、P2P 加速イメージのアドレス、および P2P 加速イメージをプルするためのシークレットが Pod に挿入されます。Pod で P2P 加速が有効になっています。

(オプション) クライアントでの加速メトリック収集の有効化

P2P 加速メトリックの説明

メトリック収集機能を有効にする

P2P 加速エージェントをインストールするときに、メトリック収集機能を有効にします。

p2p:

  v2:
    # P2P v2 のコンポーネント
    image: registry-vpc.__ACK_REGION_ID__.aliyuncs.com/acs/dadi-agent
    imageTag: v0.1.2-72276d4-aliyun

    # 各ノードプロキシによってダウンロードされるレイヤーの同時実行制限数
    proxyConcurrencyLimit: 128

    # P2P ノードと通信するためのサーバーポート
    p2pPort: 65002

    cache:
      # ディスクキャッシュ容量 (バイト単位)、デフォルトは 4GB
      capacity: 4294967296
      # ECS でパフォーマンス専有型ディスク (例: ESSD PL2/PL3) を使用している場合は 1 に設定
      aioEnable: 0
    exporter:
      # コンポーネントメトリックを収集する場合は true に設定
      enable: false
      port: 65003

    # ダウンストリームスループットの制限
    throttleLimitMB: 512

アクセス方法

P2P YAML ファイルの exporter フィールドは、メトリックを収集するためのポートを定義します。

ExporterConfig:
  enable: true # メトリック収集機能を有効にするかどうかを指定します。
  port: 65006 # リッスンポートを指定します。
  standaloneExporterPort: true # スタンドアロンポートを公開するかどうかを指定します。このパラメーターを false に設定すると、スループットは HTTP サービスポート経由になります

curl 127.0.0.1:$port/metrics コマンドを実行します。次のメトリックが返されます。

# HELP DADIP2P_Alive 
# TYPE DADIP2P_Alive gauge
DADIP2P_Alive{node="192.168.69.172:65005",mode="agent"} 1.000000 1692156721833

# HELP DADIP2P_Read_Throughtput バイト/秒
# TYPE DADIP2P_Read_Throughtput gauge
DADIP2P_Read_Throughtput{node="192.168.69.172:65005",type="pread",mode="agent"} 0.000000 1692156721833
DADIP2P_Read_Throughtput{node="192.168.69.172:65005",type="download",mode="agent"} 0.000000 1692156721833
DADIP2P_Read_Throughtput{node="192.168.69.172:65005",type="peer",mode="agent"} 0.000000 1692156721833
DADIP2P_Read_Throughtput{node="192.168.69.172:65005",type="disk",mode="agent"} 0.000000 1692156721833
DADIP2P_Read_Throughtput{node="192.168.69.172:65005",type="http",mode="agent"} 0.000000 1692156721833

# HELP DADIP2P_QPS 
# TYPE DADIP2P_QPS gauge
DADIP2P_QPS{node="192.168.69.172:65005",type="pread",mode="agent"} 0.000000 1692156721833
DADIP2P_QPS{node="192.168.69.172:65005",type="download",mode="agent"} 0.000000 1692156721833
DADIP2P_QPS{node="192.168.69.172:65005",type="peer",mode="agent"} 0.000000 1692156721833
DADIP2P_QPS{node="192.168.69.172:65005",type="disk",mode="agent"} 0.000000 1692156721833
DADIP2P_QPS{node="192.168.69.172:65005",type="http",mode="agent"} 0.000000 1692156721833

# HELP DADIP2P_MaxLatency us
# TYPE DADIP2P_MaxLatency gauge
DADIP2P_MaxLatency{node="192.168.69.172:65005",type="pread",mode="agent"} 0.000000 1692156721833
DADIP2P_MaxLatency{node="192.168.69.172:65005",type="download",mode="agent"} 0.000000 1692156721833
DADIP2P_MaxLatency{node="192.168.69.172:65005",type="peer",mode="agent"} 0.000000 1692156721833
DADIP2P_MaxLatency{node="192.168.69.172:65005",type="disk",mode="agent"} 0.000000 1692156721833
DADIP2P_MaxLatency{node="192.168.69.172:65005",type="http",mode="agent"} 0.000000 1692156721833

# HELP DADIP2P_Count バイト
# TYPE DADIP2P_Count gauge
DADIP2P_Count{node="192.168.69.172:65005",type="pread",mode="agent"} 0.000000 1692156721833
DADIP2P_Count{node="192.168.69.172:65005",type="download",mode="agent"} 0.000000 1692156721833
DADIP2P_Count{node="192.168.69.172:65005",type="peer",mode="agent"} 0.000000 1692156721833
DADIP2P_Count{node="192.168.69.172:65005",type="disk",mode="agent"} 0.000000 1692156721833
DADIP2P_Count{node="192.168.69.172:65005",type="http",mode="agent"} 0.000000 1692156721833

# HELP DADIP2P_Cache 
# TYPE DADIP2P_Cache gauge
DADIP2P_Cache{node="192.168.69.172:65005",type="allocated",mode="agent"} 4294967296.000000 1692156721833
DADIP2P_Cache{node="192.168.69.172:65005",type="used",mode="agent"} 4294971392.000000 1692156721833

# HELP DADIP2P_Label 
# TYPE DADIP2P_Label gauge

メトリックの説明

メトリック名

  • DADIP2P_Alive: サービスが稼働しているかどうかを示します。

  • DADIP2P_Read_Throughtput: P2P サービスのスループット。単位: バイト/秒。

  • DADIP2P_QPS: 1 秒あたりのクエリ数 (QPS)。

  • DADIP2P_MaxLatency: レイテンシー統計。単位: μs。

  • DADIP2P_Count: トラフィック統計。単位: バイト。

  • DADIP2P_Cache: 単一のサーバーで使用されるキャッシュ。単位: バイト。

タグ

  • node: P2P エージェントまたはルートのサービス IP アドレスとポート番号。

  • type: メトリックのタイプ。

    • pread: ダウンストリームリクエストを処理します。

    • download: back-to-origin ルーティング。

    • peer: P2P ネットワーク配信。

    • disk: ディスクを処理します。

    • http: HTTP リクエストを処理します。

    • allocated: キャッシュに割り当てられたスペース。

    • used: キャッシュによって使用されるスペース。

メトリックの例

DADIP2P_Count{node="11.238.108.XXX:9877",type="http",mode="agent"} 4248808352.000000 1692157615810
エージェントサービスによって処理される合計 HTTP リクエストトラフィック: 4248808352 バイト。

DADIP2P_Cache{node="11.238.108.XXX:9877",type="used",mode="agent"} 2147487744.000000 1692157615810
エージェントによって使用されるキャッシュ: 2147487744 バイト。

監査ログ

監査ログを有効にする

p2p configmap[audit] フィールドを true に設定します。

DeployConfig:
  mode: agent
  logDir: /dadi-p2p/log
  logAudit: true
  logAuditMode: stdout # ログはコンソールに収集されます。このパラメーターを file に設定すると、ログは /dadi-p2p/log/audit.log ディレクトリに収集されます

監査ログのフォーマット

次のコードは、監査ログのフォーマットを示しています。このコードは、リクエストの受信から結果の返却までの処理時間を示します。単位: μs。

2022/08/30 15:44:52|AUDIT|th=00007FBA247C5280|download[pathname=/https://cri-pi840la*****-registry.oss-cn-hangzhou.aliyuncs.com/docker/registry/v2/blobs/sha256/dd/dd65726c224b09836aeb6ecebd6baf58c96be727ba86da14e62835569896008a/data][offset=125829120][size=2097152][latency=267172]
....
2022/08/30 15:44:55|AUDIT|th=00007FBA2EFEAEC0|http:pread[pathname=/https://cri-pi840lacia*****-registry.oss-cn-hangzhou.aliyuncs.com/docker/registry/v2/blobs/sha256/dd/dd65726c224b09836aeb6ecebd6baf58c96be727ba86da14e62835569896008a/data][offset=127467520][size=65536][latency=21]

主要なパラメーターには、時間、AUDIT、スレッドポインター、および操作コード [pathname=][size=][latency=] が含まれます。

AUDIT およびスレッドポインターパラメーターは無視できます。size パラメーターは、単一のリクエストにおけるログのサイズを指定します。このパラメーターの値が負の数の場合、例外が発生します。latency パラメーターは、単一のリクエストのレイテンシーを指定します。単位: μs。

次のリストは、一般的な操作コードについて説明しています:

  • http:pread: HTTP プロキシは出力データリクエストを処理します。

  • rpc:stat: P2P エージェントはファイルサイズを取得します。

  • rpc:pread: P2P エージェントは出力データリクエストを処理します。

  • download: P2P エージェントはアップストリームからデータをダウンロードします。

  • filewrite: P2P エージェントは現在のデータシャードをキャッシュに書き込みます。

  • fileread: P2P エージェントはキャッシュからデータシャードを読み取ります。

ログの例

download[pathname=mytest][offset=0][size=65536][latency=26461]
  ## P2P エージェントがアップストリームから mytest ファイルの [0,65536) データをダウンロードするときのレイテンシーは 26461 μs です。
rpc:pread[pathname=mytest][offset=0][size=65536][latency=2]
  ## P2P エージェントが mytest ファイルの [0,65536) データをダウンストリームに返すときのレイテンシーは 2 μs です。
http:pread[pathname=mytest][offset=0][size=65536][latency=26461]
  ## プロキシがアップストリームから mytest ファイルの [0,65536) データをダウンロードするときのレイテンシーは 26461 μs です。

(オプション) オンデマンドでのイメージのロードを無効にし、P2P 加速を有効にする

説明

クラスター内の単一ノードの構成を変更して、オンデマンドでのイメージのロードを無効にし、P2P 加速を有効にすることができます。ノードに対する後続の O&M 操作によって変更が上書きされる場合があります。この場合、ノードの構成を再変更する必要があります。

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターの名前をクリックします。左側のナビゲーションウィンドウで、[ノード] > [ノード] を選択します。

  3. [ノード] ページで、管理するノードの IP アドレスの下にある [インスタンス ID] をクリックします。

  4. インスタンスの詳細ページで、[リモート接続] を使用してノードにログインします。

  5. vi コマンドを実行して /etc/overlaybd/overlaybd.json ファイルの p2pConfig フィールドを編集し、enable の値を false に変更します。

    {
         "p2pConfig": {
            "enable": false,
            "address": "https://localhost:6****/accelerator"
        },
    ... ...
    }
  6. 次のコマンドを実行して、オンデマンドでイメージリソースを再ロードします:

    service overlaybd-tcmu restart

付録

P2P 加速効果の参考

異なる仕様のイメージのプル

テストで使用されたイメージ仕様

  • 4 GB (512 MB × 8 レイヤー)

  • 10 GB (10 GB × 1 レイヤー)

  • 20 GB (4 GB × 5 レイヤー、10 GB × 2 レイヤー、512 MB × 40 レイヤー、20 GB × 1 レイヤー、2 GB × 10 レイヤー)

テスト環境

  • ACK クラスター: 1000 ノード

  • Elastic Compute Service (ECS) インスタンスの仕様: 4 vCPU および 8 GB のメモリ

  • クラウドディスクの仕様: 200 GB PL1 エンハンスド SSD (ESSD)

  • P2P エージェントの仕様: 1 vCPU、1 GB のメモリ、および 4 GB のキャッシュ

テストシナリオ

1000 ノードが同じイメージをプルし、ダウンロード後にイメージが解凍されます。

テスト結果 (P95 時間)

イメージ仕様

消費時間

back-to-origin ルーティング (バケット) のピークスループット (Gbit/s)

512 MB × 8 レイヤー

116 秒

2

10 GB × 1 レイヤー

6 分 20 秒

1.2

4 GB × 5 レイヤー

9 分 15 秒

5.1

10 GB × 2 レイヤー

9 分 50 秒

6.7

512 MB × 40 レイヤー

7 分 55 秒

3.8

20 GB × 1 レイヤー

11 分

2.5

2 GB × 10 レイヤー

8 分 13 秒

3.2