ピアツーピア (P2P) アクセラレーションは、イメージのプルを高速化し、アプリケーションのデプロイ時間を短縮します。この機能は、特に大規模なコンテナークラスターでのバッチイメージプルに効果的です。本トピックでは、P2P アクセラレーション機能を使用してイメージのプルを高速化する方法について説明します。
背景情報
大規模なコンテナークラスター内の多数のノードが同時にイメージをプルすると、コンテナイメージレジストリのネットワーク帯域幅がボトルネックとなり、イメージのプルが遅くなる可能性があります。P2P アクセラレーション機能は、コンピュートノードの帯域幅を使用してイメージを配布します。これにより、コンテナイメージレジストリへの負荷が軽減され、イメージのプルが大幅に高速化され、アプリケーションのデプロイ時間が短縮されます。1,000 ノードのクラスターで 1 GB のイメージをプルするテストでは、P2P アクセラレーションにより、10 Gbps のネットワークを介した標準的なイメージのプルと比較して、イメージのプル時間が 95% 以上短縮されました。さらに、新しい P2P アクセラレーションソリューションは、以前のバージョンよりも 30% から 50% 高速です。デフォルトでは、新しいソリューションは、コンテナイメージをオンデマンドで読み込む際の P2P アクセラレーションの使用をサポートしています。詳細については、「コンテナイメージリソースのオンデマンド読み込み」をご参照ください。
P2P アクセラレーションは、以下のシナリオで使用できます。
-
ACK クラスター
-
オンプレミスクラスターまたはサードパーティのクラウドサービスプロバイダーのクラスター
前提条件
P2P アクセラレーションエージェントがインストールされていること。
-
ACK クラスターで P2P アクセラレーションを使用する場合は、「ACKクラスターへのP2P アクセラレーションエージェントのインストール」をご参照ください。
-
オンプレミスクラスターまたはサードパーティのクラウドサービスプロバイダーのクラスターで P2P アクセラレーションを使用する場合は、「オンプレミスクラスターまたはサードパーティのクラウドサービスプロバイダーのクラスターへのP2P アクセラレーションエージェントのインストール」をご参照ください。
P2P アクセラレーションの有効化
バージョン 1.32 以前の ACK クラスターでは、ラベルを追加して P2P アクセラレーションを有効にする必要があります。
バージョン 1.33 以降の ACK クラスター
P2P アクセラレーションスイートがノードプールにインストールされている場合、ワークロードを指定されたノードプールにスケジューリングすることで P2P アクセラレーションを有効にできます。詳細については、「P2P アクセラレーションスイートのインストール」および「指定されたノードプールへのワークロードのスケジューリング」をご参照ください。
バージョン 1.32 以前の ACK クラスター
制約
P2P アクセラレーションを有効にすると、P2P アクセラレーションエージェントは Webhook を使用して、コンテナイメージアドレスを 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 アクセラレーションは、Pod や Deployment などのアプリケーションワークロード、または ACK クラスターの Namespace にラベルを追加することで有効にできます。Namespace に P2P アクセラレーションラベルを追加すると、その Namespace 内のすべての対象となるアプリケーションワークロードで P2P アクセラレーションが有効になります。アプリケーションワークロードの YAML ファイルを変更する必要はありません。次のいずれかの方法を選択して、P2P アクセラレーションラベルを追加します。
ラベル名は k8s.aliyun.com/image-accelerate-mode で、値は p2p です。
-
アプリケーションワークロードに P2P アクセラレーションラベルを追加します。
次の例は、Deployment にラベルを追加する方法を示しています。次のコマンドを実行して Deploymentを編集します。
kubectl edit deploy <Deployment-Name>k8s.aliyun.com/image-accelerate-mode: p2pラベルを Deployment ファイルに追加します。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"] -
Namespace に P2P アクセラレーションラベルを追加します。
-
コンソールを使用して P2P アクセラレーションラベルを追加します。
-
ACK コンソールにログインします。左側のナビゲーションペインで、クラスターリスト をクリックします。
-
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[名前空間とクォータ] をクリックします。
-
名前空間 ページで、対象の Namespace を見つけ、操作 列の 編集 をクリックします。
-
名前空間の編集 ダイアログボックスで [+Labels] をクリックし、変数名 に
k8s.aliyun.com/image-accelerate-modeを、可変値 にp2pを設定し、OK をクリックします。
-
-
CLI を使用して P2P アクセラレーションラベルを追加します。
kubectl label namespaces <YOUR-NAMESPACE> k8s.aliyun.com/image-accelerate-mode=p2p
-
IDC またはサードパーティクラウドサービスプロバイダー
P2P アクセラレーションスイートを有効にする方法と対応する制限は、バージョン 1.32 以前の ACK クラスターの場合と同じです。
P2P アクセラレーションの検証
バージョン 1.33 以降の ACK クラスター
ACK コンソールにログインします。
左側のナビゲーションペインで クラスターリスト をクリックし、対象のクラスターの名前をクリックします。
左側のナビゲーションペインで、 の順にクリックし、P2P アクセラレーションスイートがインストールされているノードプールをクリックします。
ノード タブをクリックし、ノードの ECS インスタンスリンク (例:
i-bp1fjgtm0njvbjd1v2yd) をクリックして、[Instance Details] ページに移動します。アクセラレーションスイートが一部のノードにのみインストールされている場合は、スイートがインストールされているノードの ECS インスタンスリンクをクリックします。
右上隅の 接続 をクリックし、指示に従ってノードのターミナルに接続します。
インテリジェントマネージドノードプールの場合、ターミナルに接続した後、
sudo supermanコマンドを実行してホストにログインします。次のコマンドを実行して、P2P アクセラレーションスイートの実行ステータスを確認します。
systemctl status dadi-p2p期待される出力:
● dadi-p2p.service - DADI P2P service Loaded: loaded (/etc/dadi-p2p/service/dadi-p2p.service; enabled; vendor preset: disabled) Drop-In: /etc/systemd/system.control/dadi-p2p.service.d └─50-CPUQuota.conf, 50-MemoryMax.conf Active: active (running) since Fri 2026-07-31 15:35:04 CST; 56min ago Main PID: 13201 (dadip2p) Tasks: 16 (limit: 48915) Memory: 345.2M (max: 2.0G) CGroup: /system.slice/dadi-p2p.service └─13201 /usr/local/bin/dadip2p /etc/dadi-p2p/config/p2p.yml実行ステータスが
active (running)の場合、アクセラレーションスイートが有効であることを示します。
バージョン 1.32 以前の ACK クラスター
P2P アクセラレーションを有効にすると、P2P コンポーネントは P2P 関連のアノテーション、P2P で高速化されたイメージアドレス、および対応するイメージプル認証情報を Pod に自動的に挿入します。
P2P イメージプル認証情報は、イメージレジストリのドメイン名を除き、元のイメージプル認証情報と同じです。したがって、元のイメージプル認証情報のユーザー情報が正しくない場合、P2P イメージのプルも失敗します。
次のコマンドを実行して Pod を表示します。
kubectl get po <Pod-Name> -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
Pod には、P2P 関連のアノテーション、P2P で高速化されたイメージアドレス、および対応するイメージプル認証情報が挿入されています。これにより、P2P アクセラレーションが有効になっていることが確認できます。
IDC またはサードパーティクラウドサービスプロバイダー
P2P アクセラレーションを検証する方法は、バージョン 1.32 以前の ACK クラスターの場合と同じです。
(オプション) クライアントメトリクス収集の有効化
P2P メトリクス
メトリクスの有効化
メトリクスを有効にするには、エージェントの YAML 設定で 'exporter.enable' を 'true' に設定します。
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: true
port: 65003
# ダウンストリームスループットの制限。
throttleLimitMB: 512
アクセス方法
P2P YAML ファイルの ExporterConfig セクションでメトリクスポートを定義します。
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 Bytes / sec
# 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 Bytes
# 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 (1 秒あたりのクエリ数) 。
-
DADIP2P_MaxLatency:レイテンシ統計。単位:μs。
-
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 リクエストトラフィック:4,248,808,352 バイト。
DADIP2P_Cache{node="11.238.108.XXX:9877",type="used",mode="agent"} 2147487744.000000 1692157615810
エージェントの現在のキャッシュ使用量:2,147,487,744 バイト。
監査ログ
監査ログの有効化
p2p ConfigMap で、[logAudit] フィールドを 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) をアップストリームソースからダウンロードする際のレイテンシは 26,461 μ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) をアップストリームソースからダウンロードする際のレイテンシは 26,461 μs です。
(オプション) オンデマンド読み込みのための P2P の無効化
後続のノードメンテナンス操作によってこの設定が上書きされる可能性があることにご注意ください。
-
ACK コンソールにログインします。左側のナビゲーションペインで、クラスターリスト をクリックします。
-
クラスターリスト ページで、対象のクラスターの名前をクリックします。左側のナビゲーションペインで、 の順にクリックします。
-
ノード ページで、対象ノードの IP アドレスに対応する インスタンス ID をクリックします。
-
インスタンス詳細ページで、接続 をクリックしてノードにログインします。
-
viコマンドを使用して/etc/overlaybd/overlaybd.jsonファイルを編集します。p2pConfig セクションで、enable の値を false に変更します。{ "p2pConfig": { "enable": false, "address": "https://localhost:6****/accelerator" }, ... ... } -
次のコマンドを実行して、オンデマンド読み込みコンポーネントを再起動します。
service overlaybd-tcmu restart
付録
パフォーマンスリファレンス
イメージのプルのパフォーマンス
テストイメージの仕様:
-
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 ノード
-
ECS 仕様:4 vCPU、8 GB メモリ
-
クラウドディスク仕様:200 GB ESSD PL1
-
P2P アクセラレーションエージェント仕様:1 vCPU、1 GB メモリ、4 GB キャッシュ
テストシナリオ
1,000 ノードが同じイメージをプル (イメージのダウンロードと解凍を含む)。
テスト結果 (P95 の所要時間)
|
イメージ仕様 |
時間 |
ピークソーススループット (Gbps) |
|
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 |