Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

DPDK vRouter の導入

DPDK の概要

クラウドネイティブのContrail® Networking がデータプレーン開発キット(DPDK)をサポートします。DPDKは、高速パケット処理のためのオープンソースのライブラリとドライバーのセットです。クラウドネイティブのContrail Networkingは、DPDK vRouterテクノロジーでコンテナネットワークを高速化します。DPDK は、ネットワーク インターフェイス カード (NIC) がダイレクト メモリ アクセス (DMA) パケットをアプリケーションのアドレス空間に直接送信できるようにすることで、高速パケット処理を可能にします。このパケット ルーティング方法では、アプリケーションはパケットをポーリングできるため、NIC からの割り込みのオーバーヘッドが防止されます。

DPDKを利用することで、クラウドネイティブのContrail vRouterは、コンテナサービス機能向けのカーネルモジュールDPDKインターフェイスとして実行した場合よりも多くのパケット/秒を処理できます。CN2は、DPDK vRouterの処理能力を活用し、需要の高いコンテナサービス機能に処理能力を活用します。

DPDK を使用して Contrail コンピューティング ノードをプロビジョニングする場合、対応する YAML ファイルで次のように指定します。

  • パケットの転送に使用するCPUコアの数。

  • DPDK に割り当てるヒュージ ページの数。

  • DPDK に使用する UIO ドライバー。

DPDKおよび非DPDKワークロードに対するDPDK vRouterのサポート

コンテナーまたはポッドが DPDK vRouter にアクセスする必要がある場合、次のワークロード タイプが発生します。

  1. 非DPDKワークロード(ポッド):このワークロードには、基盤となるDPDK vRouterを認識しない非DPDKポッドアプリケーションが含まれます。これらのアプリケーションは DPDK 用に設計されておらず、DPDK 機能を使用しません。クラウドネイティブのContrail Networkingでは、このワークロードタイプは通常、DPDK vRouter対応クラスターで機能します。

  2. コンテナー化された DPDK ワークロード: これらのワークロードは、DPDK プラットフォーム上に構築されます。DPDKインターフェイスは、管理および制御機能のデータパスとして機能する(仮想ホスト)vhostプロトコルを使用して起動されます。vhost プロトコルを使用すると、仮想化されたホストデバイスを仮想入出力 (virtio) デバイスにマッピングできます。ポッドは vHost サーバーとして機能し、基盤となる DPDK vRouter は vHost クライアントとして機能します。

  3. 非DPDKワークロードとDPDKワークロードの混在:このポッド内のアプリケーションの管理チャネルまたは制御チャネルは非DPDK(Vethペア)であり、データパスはDPDKインターフェイスです。Veth ペアは、接続された仮想イーサネット・インターフェースのペアです。

非DPDKポッドの概要

仮想イーサネット(Veth)ペアは、非DPDKポッドのネットワーキングを配管します。Veth ペアの一方の端は、ポッドの名前空間にアタッチされます。もう一方の端は、ホストマシンのカーネルに接続します。コンテナネットワークインターフェイス(CNI)は、Vethペアを確立し、IPアドレス管理(IPAM)を使用してIPアドレスを割り当てます。

DPDKポッドの概要

DPDK ポッドには、仮想ホスト インターフェイスと virtio インターフェイスが含まれています。ポッドは、管理目的で vhost インターフェイスを使用し、高スループットのパケット処理アプリケーション用に virtio インターフェイスを使用します。ポッド内の DPDK アプリケーションは、仮想ホスト プロトコルを使用して、ホスト内の DPDK vRouter との通信を確立します。DPDK アプリケーションは、UNIX ソケットのファイル パスを確立する引数を受け取ります。vRouter はこのソケットを使用して、制御チャネルの確立、ネゴシエーションの実行、高速データパス用の共有メモリの巨大なページに対する vring の作成を行います。

非DPDKとDPDKポッドの混在の概要

このポッドには、DPDK 以外のアプリケーションと DPDK アプリケーションが含まれている場合があります。非 DPDK アプリケーションは非 DPDK インターフェイス(Veth ペア)を使用し、DPDK アプリケーションは DPDK インターフェイス(vhost、virtio)を使用します。これら 2 つのワークロードは同時に発生します。

DPDK vRouterのアーキテクチャ

Contrail DPDK vRouter は、Contrail コンピューティング ノード内で実行されるコンテナです。vRouter は、Linux カーネルモジュールまたはユーザー空間 DPDK プロセスとして実行されます。vRouterは、物理デバイス上の仮想ワークロード(テナント、ゲスト)間でパケットを送信する役割を担います。vRouter は、仮想インターフェイスと物理インターフェイス間でパケットも送信します。

CN2 vRouterは、以下のカプセル化プロトコルをサポートしています。

  • MPLS over UDP(MPLSoUDP)

  • MPLS over GRE(MPLSoGRE)

  • VXLAN(仮想拡張LAN)

従来のLinuxカーネル導入と比較して、vRouterをユーザースペースDPDKプロセスとして展開すると、vRouterアプリケーションのパフォーマンスと処理速度が大幅に向上します。このパフォーマンスの向上は、次の要因の結果です。

  • ユーザー空間で動作する仮想ネットワーク機能(VNF)は、DPDK向けに構築されており、DPDKのパケット処理能力を活用するように設計されています。

  • DPDK のポーリング モード ドライバー (PMD) は、Linux カーネルの割り込みベースのドライバーではなく、VM のホストの物理インターフェイス (NIC) を使用します。NICのレジスタはユーザー空間で動作するため、DPDKのPMDからアクセスできます。

その結果、Linux OSはNICのレジスタを管理する必要がありません。つまり、DPDK アプリケーションは、NIC のすべてのパケット ポーリング、パケット処理、およびパケット転送を管理します。DPDK アプリケーションは、I/O 割り込みが発生するのを待つ代わりに、常にパケットをポーリングし、これらのパケットを受信するとすぐに処理します。

コンテナのDPDKインターフェイスのサポート

DPDK の利点とアーキテクチャは、通常、VM ネットワークを最適化します。クラウドネイティブのContrail Networkingにより、Kubernetesコンテナでこれらの機能を最大限に活用できます。Kubernetes では、コンテナ化された DPDK ポッドには通常、2 つ以上のインターフェイスが含まれます。次のインターフェイスは、DPDK ポッドのバックボーンを形成します。

  • 仮想ホスト ユーザー プロトコル(管理用): vhost ユーザー プロトコルは、ホストとインターフェイスするバックエンド コンポーネントです。クラウドネイティブのContrail Networkingでは、仮想ホスト インターフェイスは、ポッドと vRouter 間の管理および制御機能のためのデータパスとして機能します。このプロトコルは、次の 2 つのプレーンで構成されています。
    • コントロールプレーンは、Unixソケットを介してポッドとvRouter間の情報(DMAのメモリマッピング、データプレーンの確立と終了のための機能ネゴシエーション)を交換します。

    • データ プレーンはダイレクト メモリ アクセスによって実装され、ポッドと vRouter の間でデータ パケットを送信します。

  • Virtioインターフェイス(高スループットアプリケーション向け): 大まかに言うと、virtio はポッドと vRouter の間でパケットを送信する仮想デバイスです。virtio インターフェイスは、ポッドが DPDK ライブラリと機能にアクセスできるようにする共有メモリ (shm) ソリューションです。

これらのインターフェイスにより、DPDK vRouter はポッド間でパケットを送信できます。このインターフェイスにより、ポッドは vRouter が提供する高度なネットワーク機能(ヒュージ ページ、ロックレス リング バッファー、ポーリング モード ドライバー)にアクセスできます。これらの機能の詳細については、「 仮想ホストユーザーの領域への旅」を参照してください。

アプリケーションは DPDK を使用して仮想ホストと virtio インターフェイスを作成します。その後、アプリケーションまたはポッドは DPDK ライブラリを直接使用して、Unix ドメイン ソケットを使用して制御チャネルを確立します。インターフェイスは、共有メモリ vring を使用してポッドと vRouter 間のデータパスを確立します。

DPDK vRouter ホストの前提条件

DPDK vRouterを展開するには、ホストノードで次の大規模なページとNICを設定する必要があります。ヒュージページを使用すると、OSはデフォルトの4KBよりも大きいメモリページを使用できます。

  • ヒュージ・ページ構成: DPDKヒュージ・ページ用に予約するホスト・メモリーの割合を指定します。次のコマンドラインは、2MBに設定された巨大なページを示しています。

    次の例では、4 つの 1GB ヒュージ・ページと 1024 個の 2MB ヒュージ・ページを割り当てます。

    メモ:

    巨大なページサイズに1GBを割り当てることをお勧めします。

  • hugepagesz=1G hugepages=4 hugepagesz=2M hugepages=1024"
  • 有効 (入出力メモリ管理ユニット (IOMMU): DPDK アプリケーションには IOMMU サポートが必要です。IOMMU 設定を構成し、BIOS から IOMMU を有効にします。次のフラグをブート パラメーターとして適用して、IOMMU を有効にします。

  • カーネル ドライバーがホストの NIC のポート フォワード 0 (ポート 0) に読み込まれていることを確認します。DPDK PMD ドライバーがホストの NIC のポート フォワード 1 (ポート 1) に読み込まれていることを確認します。

    メモ:DPDK とカーネル ドライバーの両方が共通の NIC の異なるポートを使用する環境では、カーネル ドライバーが NIC のポート 0 にバインドされた DPDK ノードを展開することを強くお勧めします。さらに、その NIC のポート 1 にバインドされた DPDK PMD ドライバーを展開することをお勧めします。他のポート割り当て構成によって、パフォーマンスの問題が発生する可能性があります。詳細については、次の DPDK ドキュメントのセクション 24.9.11 を参照してください: I40E ポーリング モード ドライバー
  • PCI ドライバー (vfio-pci、uio_pci_generic): NIC の種類に基づいて、使用する PCI ドライバーを指定します。

    メモ:

    vfio-pci は内蔵されています。

    • 必要に応じて、uio_pci_genericモジュールを手動で取り付けます。

    • uio_pci_genericモジュールがインストールされていることを確認します。

DPDK vRouterを使用したKubernetesクラスタのコンピューティングノードへの導入

クラウドネイティブのContrail Networkingは、DPDK導入機能を利用して、DPDKと互換性のあるKubernetesクラスターを起動します。この導入者はライフサイクル管理機能を実行し、DPDK vRouter の前提条件を適用します。DPDK vRouter のカスタム リソース(CR)は、導入機能のサブセットです。CR には次のものが含まれます。

  • クラウドネイティブのContrail Networkingリソースを展開するためのコントローラ

  • vRouter 用の組み込みコントローラ ロジック

DPDK デプロイヤー YAML ファイルを適用し、次のコマンドを使用して agentModeType: dpdk DPDK vRouter CR を展開します。

CR YAML ファイルを適用した後、デプロイヤーは vRouter の デーモンセット を作成します。このデーモンは、DPDKコンテナでポッドを回転させます。

エラーメッセージが表示された場合は、次のコマンドを使用して、クラスターに vRouter のカスタムリソース定義 (CRD) があることを確認します。

受信する出力の例を次に示します。

クラスタに CRD が存在しない場合は、次のコマンドを使用してデプロイ機能を確認します。

コンテナーで使用されている contrail-k8s-crdloader イメージを確認します。このイメージは、デプロイヤーが使用する最新のイメージである必要があります。イメージを更新し、新しいポッドでこのイメージが使用されていることを確認します。

新しいポッドで最新のイメージが実行されていることを確認したら、次のコマンドを使用して、vRouter の CRD が存在することを確認します。

vRouter の CRD が存在することを確認したら、次のコマンドを使用して vRouter CR を適用します。

DPDK vRouterのカスタムリソース設定

vRouter の CR の以下の設定を構成できます。

  • service_core_mask: サービス コア マスクを指定します。サービス コア マスクを使用すると、サービスに CPU コアを動的に割り当てることができます。

  • 以下の入力書式を入力できます。

    • 16 進数 (例:0xf)

    • コンマで区切られたCPUのリスト(例:1、2、4)

    • ダッシュで区切られた CPU の範囲 (1-4 など)

    メモ:

    PMD では、パケット処理に使用可能な CPU コアの大部分が必要です。そのため、および dpdk_ctrl_thread_maskにはservice_core_mask最大 1 から 2 個の CPU コアを予約することをお勧めします。これらの2つのコアはCPUパワーを共有します。

  • cpu_core_mask: CPU コア マスクを指定します。DPDKのPMDは、これらのコアを高スループットのパケット処理アプリケーションに使用します。

    サポートされている入力形式は次のとおりです。

    • 16 進数 (例:0xf)

    • コンマで区切られたCPUのリスト(例:1、2、4)

    • ダッシュで区切られた CPU の範囲 (1-4 など)

  • dpdk_ctrl_thread_mask: コントロール スレッド マスクを指定します。DPDK は、これらのコア スレッドを内部処理に使用します。

    サポートされている入力形式は次のとおりです。

    • 16 進数 (例:0xf)

    • コンマで区切られたCPUのリスト(例:1、2、4)

    • ダッシュで区切られた CPU の範囲 (1-4 など)

    メモ:

    PMD では、パケット処理に使用可能な CPU コアの大部分が必要です。そのため、および dpdk_ctrl_thread_maskにはservice_core_mask最大 1 から 2 個の CPU コアを予約することをお勧めします。これらの2つのコアはCPUパワーを共有します。

  • dpdk_command_additional_args: デフォルト設定ではない DPDK vRouter 設定を指定します。ここで入力した引数は、DPDK PMD コマンド ラインに追加されます。

    引数の例を次に示します。--yield_option 0