P2P 加速機能は、イメージのプルを高速化して、アプリケーションのデプロイ時間を短縮します。コンテナクラスター内の多くのノードが同時にイメージをプルする必要がある場合、P2P 加速を使用してパフォーマンスを向上させることができます。このトピックでは、P2P 加速機能を使用してイメージのプルを高速化する方法について説明します。
背景情報
コンテナクラスター内の多くのノードが同時にイメージをプルする必要がある場合、コンテナイメージストレージのネットワーク帯域幅がパフォーマンスボトルネックとなり、イメージのプルが遅くなる可能性があります。P2P 加速機能は、計算ノードの帯域幅リソースを活用して、ノード間でイメージを配信します。これにより、コンテナイメージストレージへの負荷が軽減され、イメージのプルが高速化され、アプリケーションのデプロイ時間が短縮されます。テスト結果によると、10 Gbit/s の帯域幅を持つネットワークで 1000 ノードが 1GB サイズのイメージを同時にプルする場合、P2P 加速機能は通常のイメージプルモードと比較してイメージのプル時間を 95% 以上短縮します。さらに、新しい P2P 加速モードは、古い P2P 加速モードと比較してパフォーマンスを 30% から 50% 向上させます。デフォルトでは、Container Registry がオンデマンドでイメージリソースをロードするときに、新しい P2P 加速モードが使用されます。詳細については、「コンテナイメージのリソースをオンデマンドでロードする」をご参照ください。
P2P 加速機能は、次のタイプのクラスターで使用できます:
ACK クラスター
オンプレミスクラスターおよびサードパーティのクラウド サービス プロバイダー (CSP) のクラスター
前提条件
P2P 加速エージェントがクラスターにインストールされている。
ACK クラスターに P2P 加速エージェントをインストールする方法の詳細については、「ACK クラスターに P2P 加速エージェントをインストールする」をご参照ください。
オンプレミスクラスターまたはサードパーティのクラウドサービスプロバイダーのクラスターに P2P 加速エージェントをインストールする方法の詳細については、「オンプレミスクラスターまたはサードパーティのクラウドサービスプロバイダーのクラスターに 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 コンソールを使用する
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
クラスター ページで、目的のクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[名前空間とクォータ] をクリックします。
[名前空間] ページで、P2P 加速ラベルを追加する名前空間を見つけ、[アクション] 列の [編集] をクリックします。
[名前空間の編集] ダイアログボックスで、[+名前空間ラベル] をクリックし、[変数キー] を
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 操作によって変更が上書きされる場合があります。この場合、ノードの構成を再変更する必要があります。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[ノード] ページで、管理するノードの IP アドレスの下にある [インスタンス ID] をクリックします。
インスタンスの詳細ページで、[リモート接続] を使用してノードにログインします。
viコマンドを実行して/etc/overlaybd/overlaybd.jsonファイルの p2pConfig フィールドを編集し、enable の値を false に変更します。{ "p2pConfig": { "enable": false, "address": "https://localhost:6****/accelerator" }, ... ... }次のコマンドを実行して、オンデマンドでイメージリソースを再ロードします:
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 |