P2Pアクセラレーション機能は、イメージプルを加速して、アプリケーションのデプロイに必要な時間を短縮できます。 コンテナークラスター内の多数のノードが同時にイメージをプルする必要がある場合は、P2Pアクセラレーション機能を使用してイメージプルを高速化できます。 このトピックでは、P2Pアクセラレーション機能を使用してイメージプルを高速化する方法について説明します。
背景情報
コンテナクラスター内の多数のノードが同時にイメージをプルする必要がある場合、コンテナイメージストレージのネットワーク帯域幅がパフォーマンスのボトルネックになる可能性があります。 P2P高速化機能は、計算ノードの帯域幅リソースを使用して、ノード間で画像を分散します。 これにより、コンテナーイメージストレージへの負荷が軽減され、イメージプルが高速化され、アプリケーションの展開に必要な時間が短縮されます。 テスト結果は、1000のノードが10 Gbit/sの帯域幅を持つネットワークで1GBサイズの画像を同時にプルする場合、P2P高速化機能は、通常の画像プルモードと比較して95% を超えて画像プル時間を短縮することを示しています。 加えて、新しいP2P加速モードは、古いP2P加速モードと比較して、50% に30% することによって性能を改善する。 デフォルトでは、Container Registryがオンデマンドでイメージリソースをロードするときに、新しいP2Pアクセラレーションモードが使用されます。 詳細については、「コンテナーイメージのリソースをオンデマンドで読み込む」をご参照ください。
P2Pアクセラレーション機能は、次のタイプのクラスターで使用できます。
Container Service for Kubernetes (ACK) クラスター
オンプレミスクラスターとサードパーティのクラウドサービスプロバイダーのクラスター
前提条件
P2Pアクセラレーションエージェントがクラスタにインストールされています。
ACKクラスターにP2Pアクセラレーションエージェントをインストールする方法については、「ACKクラスターにP2Pアクセラレーションエージェントをインストールする」をご参照ください。
オンプレミスクラスターまたはサードパーティクラウドサービスプロバイダーのクラスターにP2Pアクセラレーションエージェントをインストールする方法については、「オンプレミスクラスターまたはサードパーティクラウドサービスプロバイダーのクラスターにP2Pアクセラレーションエージェントをインストールする」をご参照ください。
制限事項
P2Pアクセラレーション機能を有効にすると、P2Pアクセラレーションエージェントはwebhookを使用して、コンテナイメージのアドレスをP2P-acceleratedイメージのアドレスに置き換えます。 たとえば、P2Pアクセラレーションエージェントは、P2P-acceleratedイメージのアドレス (test **** vpc.cn-hangzhou.cr.aliyuncs.com/docker-builder/nginx:latest
) を使用して、元のイメージアドレス (test **** vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65001/docker-builder/nginx:latest
) を置き換えます。
さらに、webhookは自動的に画像をプルするための画像プルキーを生成しP2P-accelerated。 生成された画像プルキーは、元の画像プルキーからコピーされる。 イメージプルキーの生成とイメージアドレスの置換は非同期である。 したがって、ワークロードを発行する前に、イメージプルキーを発行するか、イメージプルに必要なイメージプルキーを手動で作成することをお勧めします。 上記の例では、イメージプルキーは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アクセラレーションラベルがDeploymentに追加されています。 次のコマンドを実行して、デプロイのYAMLファイルを編集します。
kubectl edit deploy <Name of the Deployment>
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: # enable P2P k8s.aliyun.com/image-accelerate-mode: p2p app: nginx spec: # your ACR instacne image pull secret imagePullSecrets: - name: test-registry containers: # your ACR instacne image - image: test-registry-vpc.cn-hangzhou.cr.aliyuncs.com/docker-builder/nginx:latest name: test command: ["sleep", "3600"]
P2Pアクセラレーションラベルを名前空間に追加する
ACKコンソールの使用
ACK コンソールにログインします。
左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、クラスターの [操作] 列で [詳細] をクリックします。
[クラスター情報] ページの左側のナビゲーションウィンドウで、[名前空間とクォータ] をクリックします。
名前空間ページで、P2Pアクセラレーションラベルを追加する名前空間を見つけ、[操作] 列の [編集] をクリックします。
[名前空間の編集] ダイアログボックスで、Labelパラメーターの [変数キー] パラメーターを
k8s.aliyun.com/image-accelerate-mode
に設定し、Labelパラメーターの [変数値] パラメーターをp2p
に設定します。 次に、[OK] をクリックします。
kubectlを使う
kubectl label namespaces <YOUR-NAMESPACE> k8s.aliyun.com/image-accelerate-mode=p2p
P2Pアクセラレーション機能が有効かどうかを確認する
ポッドのP2Pアクセラレーションを有効にすると、P2Pエージェントは、P2Pアクセラレーションアノテーション、P2P-acceleratedイメージのアドレス、およびP2P-acceleratedイメージをポッドに取り込むためのシークレットを自動的に挿入します。
P2P-acceleratedイメージをプルするためのシークレットと、オリジナルイメージをプルするためのシークレットとは、イメージリポジトリのドメイン名のみが異なる。 秘密の他の構成は同一である。 ユーザ情報が、オリジナル画像をプルするための秘密において無効である場合、P2P-accelerated画像はプルされない。
次のコマンドを実行してポッドを照会します。
kubectl get po <Name of the pod> -oyaml
期待される出力:
apiVersion: v1
kind: Pod
metadata:
annotations:
# inject p2p-annotations automatically
k8s.aliyun.com/image-accelerate-mode: p2p
k8s.aliyun.com/p2p-config: '...'
spec:
containers:
# inject image to p2p endpoint
- image: test-registry-vpc.distributed.cn-hangzhou.cr.aliyuncs.com:65001/docker-builder/nginx:latest
imagePullSecrets:
- name: test-registry
# inject image pull secret for p2p endpoint
- name: acr-credential-test-registry-p2p
上記のコードでは、P2P加速注釈、P2P-accelerated画像のアドレス、およびP2P-accelerated画像をプルするためのシークレットがポッドに挿入されます。 ポッドのP2Pアクセラレーションが有効になっています。
(オプション) クライアントでの加速メトリック収集の有効化
P2Pアクセラレーションメトリックの説明
メトリック収集機能の有効化
P2Pアクセラレーションエージェントをインストールするときに、メトリック収集機能を有効にします。
p2p:
v2:
# Component for P2P v2
image: registry-vpc.__ACK_REGION_ID__.aliyuncs.com/acs/dadi-agent
imageTag: v0.1.2-72276d4-aliyun
# Concurrency limit number of layers downloading by each node proxy
proxyConcurrencyLimit: 128
# The server port to communicate with P2P nodes
p2pPort: 65002
cache:
# Disk cache capacity in bytes, default 4GB
capacity: 4294967296
# Set to 1 if you are using high-performance disks on your ECS, e.g. ESSD PL2/PL3
aioEnable: 0
exporter:
# Set to true if you want to collect component metrics
enable: false
port: 65003
# limit for downstream throughput
throttleLimitMB: 512
P2Pアクセラレーションエージェントへのアクセス方法
P2PアクセラレーションエージェントのYAMLファイルのエクスポータ関連のパラメーターは、メトリックを収集するためのポートを定義します。
ExporterConfig:
enable: true # Specifies whether to enable the metrics collection feature.
port: 65006 # Specifies the listening port.
standaloneExporterPort: true # Specifies whether to expose a standalone port. If you set this parameter to false, throughput is over the HTTP service port
.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: サービスが有効かどうかを示します。
DADIP2 P_Read_Throughtput: P2Pサービスのスループット。 単位: byte/s。
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
The total HTTP request traffic that is processed by the agent service: 4248808352 bytes.
DADIP2P_Cache{node="11.238.108.XXX:9877",type="used",mode="agent"} 2147487744.000000 1692157615810
The cache that is currently used by the agent: 2147487744 bytes.
監査ログ
監査ログの有効化
P2P ConfigMap
のlogAuditパラメーターをtrue
に設定します。
DeployConfig:
mode: agent
logDir: /dadi-p2p/log
logAudit: true
logAuditMode: stdout # Logs are collected to the console. If you set this parameter to file, logs are collected to the /dadi-p2p/log/audit.log directory
.監査ログの形式
次のコードは、監査ログの形式を示しています。 コードは、要求を受け取ってから結果を返すまでの処理時間を示します。 単位: μ 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]
主なパラメータには、time、AUDIT、スレッドポインタ、およびオペレーションコード [pathname=][size=][latency=] が含まれます。
AUDITおよびスレッドポインターパラメーターは無視できます。 sizeパラメーターは、1つのリクエスト内のログのサイズを指定します。 このパラメーターの値が負の数の場合、例外が発生します。 latencyパラメーターは、1つのリクエストのレイテンシを指定します。 単位: μ s。
一般的なオペレーションコードを次に示します。
http: read: HTTPプロキシは出力データ要求を処理します。
rpc:stat: P2Pエージェントがファイルサイズを取得します。
rpc:pread: P2Pエージェントは、出力データ要求を処理する。
download: P2Pエージェントはアップストリームからデータをダウンロードします。
filewrite: P2Pエージェントは、現在のデータシャードをキャッシュに書き込みます。
fileread: P2Pエージェントはキャッシュからデータシャードを読み取ります。
ログの例
download[pathname=mytest][offset=0][size=65536][latency=26461]
## The latency when the P2P agent downloads the [0,65536) data of the mytest file from the upstream is 26461 μs.
rpc:pread[pathname=mytest][offset=0][size=65536][latency=2]
## The latency when the P2P agent returns the [0,65536) data of the mytest file to the downstream is 2 μs.
http:pread[pathname=mytest][offset=0][size=65536][latency=26461]
## The latency when the P2P agent downloads the [0,65536) data of the mytest file from the upstream is 26461 μs
.(オプション) イメージリソースをオンデマンドでロードするときにP2Pアクセラレーションを無効にする
左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。
左側のナビゲーションウィンドウで、
を選択します。[ノード] ページで、管理するノードを見つけ、管理するノードの [インスタンスID] をクリックします。
[インスタンスの詳細] タブで、[インスタンスの詳細] ページの右上隅にある [接続] をクリックしてノードに接続します。
vi
コマンドを実行して、/etc/overlaybd/overlaybd.json
ファイルのp2pConfigフィールドを編集し、enableの値をfalseに変更します。{ "logConfig": { "logLevel": 1, "logPath": "/var/log/overlaybd.log" }, "cacheConfig": { "cacheType": "file", "cacheDir": "/opt/overlaybd/registry_cache", "cacheSizeGB": 4 }, "gzipCacheConfig": { "enable": true, "cacheDir": "/opt/overlaybd/gzip_cache", "cacheSizeGB": 4 }, "credentialConfig": { "mode": "file", "path": "/var/lib/aliyun-acr/.acceleration-suite/config.json" }, "ioEngine": 0, "download": { "enable": true, "delay": 600, "delayExtra": 30, "maxMBps": 100 }, "p2pConfig": { "enable": false, "address": "https://localhost:6****/accelerator" }, "exporterConfig": { "enable": false, "uriPrefix": "/metrics", "port": 9863, "updateInterval": 60000000 }, "enableAudit": true, "auditPath": "/var/log/overlaybd-audit.log" }
次のコマンドを実行して、オンデマンドでイメージリソースをリロードします。
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のキャッシュ
テストシナリオ
千のノードが同じイメージをプルし、イメージはダウンロード後に解凍されます。
テスト結果 (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 |