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 アクセラレーション エージェントがクラスタにインストールされていること。
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 アクセラレーションを有効にする
ポッドやデプロイメントなどのワークロードに 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 コンソールを使用する
ACK コンソール にログインします。左側のナビゲーション ウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて、その名前をクリックします。左側のナビゲーション ウィンドウで、[名前空間とクォータ] をクリックします。
[名前空間] ページで、P2P アクセラレーション ラベルを追加する名前空間を見つけて、[アクション] 列の [編集] をクリックします。
[名前空間の編集] ダイアログ ボックスで、[ラベル] パラメータの [変数キー] パラメータを
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 ConfigMap
の logAudit パラメータを 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 アクセラレーションを有効にするには、次の操作を実行します。
ACK コンソール にログインします。左側のナビゲーション ウィンドウで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて、その名前をクリックします。左側のナビゲーション ウィンドウで、 を選択します。
[ノード] ページで、管理するノードに対応する [名前/IP アドレス/インスタンス ID] 列のインスタンス 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 クラスタ: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 |