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

Container Registry:P2P アクセラレーション機能を使用する

最終更新日:Feb 22, 2025

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

背景情報

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

P2P アクセラレーション機能は、以下のタイプのクラスタで使用できます。

  • Container Service for Kubernetes (ACK) クラスタ

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

前提条件

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 アクセラレーションを有効にする

ポッドやデプロイメントなどのワークロードに P2P アクセラレーション ラベルを追加して、ワークロードの P2P アクセラレーションを有効にすることができます。また、ACK クラスタの名前空間に P2P アクセラレーション ラベルを追加することもできます。このようにして、名前空間内のアクセラレーション条件を満たすすべてのワークロードに対して P2P アクセラレーションが有効になります。P2P アクセラレーションを有効にするために、ワークロードの YAML ファイルを変更する必要はありません。ビジネス要件に基づいて、P2P アクセラレーション ラベルを追加する方法を選択できます。

説明

P2P アクセラレーション ラベルの名前は k8s.aliyun.com/image-accelerate-mode で、値は p2p です。

  • ワークロードに P2P アクセラレーション ラベルを追加する

    この例では、P2P アクセラレーション ラベルがデプロイメントに追加されます。次のコマンドを実行して、デプロイメントの YAML ファイルを編集します。

    kubectl edit deploy <デプロイメントの名前>

    k8s.aliyun.com/image-accelerate-mode: p2p ラベルをデプロイメントの 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] をクリックします。

    • kubectl を使用する

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

P2P アクセラレーション機能が有効になっているかどうかを確認する

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

重要

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

次のコマンドを実行して、ポッドをクエリします。

kubectl get po <ポッドの名前> -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 アクセラレーション イメージをプルするためのシークレットがポッドに挿入されています。ポッドの 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:
      # ディスク キャッシュ容量 (バイト単位、デフォルトは 4 GB)
      capacity: 4294967296
      # ECS でパフォーマンス専有型ディスク (ESSD PL2/PL3 など) を使用している場合は 1 に設定します
      aioEnable: 0
    exporter:
      # コンポーネント メトリックを収集する場合は true に設定します
      enable: false
      port: 65003

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

P2P アクセラレーション エージェントへのアクセス方法

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 マイクロ秒
# 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: クエリ/秒 (QPS)。

  • DADIP2P_MaxLatency: 待ち時間統計。単位:マイクロ秒。

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

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

タグ

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

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

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

    • download: 原点復帰ルーティング。

    • 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 ConfigMaplogAudit パラメータを true に設定します。

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

監査ログの形式

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

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 パラメータは、単一リクエストの待ち時間を指定します。単位:マイクロ秒。

以下は、一般的な操作コードの一覧です。

  • http:read: 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 マイクロ秒です。
rpc:pread[pathname=mytest][offset=0][size=65536][latency=2]
  ## P2P エージェントが mytest ファイルの [0,65536) データをダウンストリームに返す際の待ち時間は 2 マイクロ秒です。
http:pread[pathname=mytest][offset=0][size=65536][latency=26461]
  ## P2P エージェントが mytest ファイルの [0,65536) データをアップストリームからダウンロードする際の待ち時間は 26461 マイクロ秒です
.

(オプション) イメージのオンデマンド ロードを無効にし、P2P アクセラレーションを有効にする

説明

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

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

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

  3. [ノード] ページで、管理するノードに対応する [名前/IP アドレス/インスタンス ID] 列のインスタンス 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 クラスタ:1,000 ノード

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

  • クラウド ディスクの仕様:200 GB PL1 拡張 SSD (ESSD)

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

テスト シナリオ

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

テスト結果 (P95 時間)

イメージ仕様

消費時間

原点復帰ルーティング (バケット) のピーク スループット (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