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

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

最終更新日:Jan 05, 2025

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アクセラレーションエージェントがクラスタにインストールされています。

制限事項

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コンソールの使用

      1. ACK コンソールにログインします。

      2. 左側のナビゲーションペインで、[クラスター] をクリックします。

      3. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、クラスターの [操作] 列で [詳細] をクリックします。

      4. [クラスター情報] ページの左側のナビゲーションウィンドウで、[名前空間とクォータ] をクリックします。

      5. 名前空間ページで、P2Pアクセラレーションラベルを追加する名前空間を見つけ、[操作] 列の [編集] をクリックします。

      6. [名前空間の編集] ダイアログボックスで、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 ConfigMaplogAuditパラメーターを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アクセラレーションを無効にする

  1. にログインします。Container Service for Kubernetesサービスコンソール.

  2. 左側のナビゲーションペインで、[クラスター] をクリックします。

  3. [クラスター] ページで、管理するクラスターの名前をクリックします。

  4. 左側のナビゲーションウィンドウで、[ノード] > [ノード] を選択します。

  5. [ノード] ページで、管理するノードを見つけ、管理するノードの [インスタンスID] をクリックします。

  6. [インスタンスの詳細] タブで、[インスタンスの詳細] ページの右上隅にある [接続] をクリックしてノードに接続します。

  7. 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"
    }
  8. 次のコマンドを実行して、オンデマンドでイメージリソースをリロードします。

    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