8.4. TAP CNI を使用したカーネルアクセスでのルートレス DPDK ワークロード実行
DPDK アプリケーションは、ログメッセージなどの特定の種類のパケットを処理のためにカーネルに挿入するための例外パスとして virtio-user
を使用できます。この機能の詳細は、例外パスとしての Virtio_user を参照してください。
OpenShift Container Platform バージョン 4.14 以降では、非権限 Pod を使用して、tap CNI プラグインと一緒に DPDK アプリケーションを実行できます。この機能を有効にするには、SriovNetworkNodePolicy
オブジェクト内で needVhostNet
パラメーターを true
に設定して、vhost-net
デバイスをマウントする必要があります。
図8.1 DPDK と TAP の設定例
前提条件
-
OpenShift CLI (
oc
) がインストールされている。 - SR-IOV Network Operator がインストールされている。
-
cluster-admin
権限を持つユーザーとしてログインしている。 すべてのノードで
setsebools container_use_devices=on
が root として設定されていることを確認します。注記Machine Config Operator を使用して、この SELinux ブール値を設定します。
手順
次の例のような内容を含むファイル (
test-namespace.yaml
など) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドを実行して、
Namespace
オブジェクトを新規作成します。oc apply -f test-namespace.yaml
$ oc apply -f test-namespace.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の例のようなコンテンツを含むファイル (
sriov-node-network-policy.yaml
など) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- これは、プロファイルが Mellanox ネットワークインターフェイスコントローラー (NIC) 専用に調整されていることを示します。
- 2
isRdma
をtrue
に設定する必要があるのは、Mellanox NIC の場合のみです。- 3
- これにより、
/dev/net/tun
および/dev/vhost-net
デバイスがコンテナーにマウントされ、アプリケーションがタップデバイスを作成し、タップデバイスを DPDK ワークロードに接続できるようになります。 - 4
- SR-IOV ネットワークデバイスのベンダーの 16 進数コード。値 15b3 は Mellanox NIC に関連付けられています。
- 5
- SR-IOV ネットワークデバイスのデバイスの 16 進数コード。
以下のコマンドを実行して
SriovNetworkNodePolicy
オブジェクトを作成します。oc create -f sriov-node-network-policy.yaml
$ oc create -f sriov-node-network-policy.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の
SriovNetwork
オブジェクトを作成し、YAML をsriov-network-attachment.yaml
ファイルに保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記SriovNetwork
の各オプションに関する詳細は、「SR-IOV の追加ネットワークの設定」セクションを参照してください。オプションのライブラリー
app-netutil
は、コンテナーの親 Pod に関するネットワーク情報を収集するための複数の API メソッドを提供します。以下のコマンドを実行して、
SriovNetwork
オブジェクトを作成します。oc create -f sriov-network-attachment.yaml
$ oc create -f sriov-network-attachment.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の例のような内容を含む、ネットワーク割り当て定義を指定するファイル (
tap-example.yaml
など) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
SriovNetwork
オブジェクトが作成されるのと同じtarget_namespace
を指定します。
次のコマンドを実行して、
NetworkAttachmentDefinition
オブジェクトを作成します。oc apply -f tap-example.yaml
$ oc apply -f tap-example.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 次の例のような内容を含むファイル
(dpdk-pod-rootless.yaml
など) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
SriovNetwork
オブジェクトが作成されるのと同じtarget_namespace
を指定します。Pod を別の namespace に作成する場合は、target_namespace
をPod
仕様とSriovNetwork
オブジェクトの両方で変更します。- 2
- ボリュームにマウントされたディレクトリーおよびそれらのボリューム内に作成されたファイルのグループ所有権を設定します。
- 3
- コンテナーの実行に使用するプライマリーグループ ID を指定します。
- 4
- アプリケーションを含む DPDK イメージとアプリケーションで使用される DPDK ライブラリーを指定します。
- 5
- コンテナーの securityContext からすべての機能 (
ALL
) を削除すると、通常の操作に必要とされる権限以上の権限がコンテナーからなくなります。 - 6
- hugepage の割り当て、システムリソースの割り当て、およびネットワークインターフェイスアクセス用のコンテナー内のアプリケーションに必要な追加機能を指定します。これらの機能は、
setcap
コマンドを使用してバイナリーファイルでも設定する必要があります。 - 7
- Mellanox ネットワークインターフェイスコントローラー (NIC) には、
NET_RAW
機能が必要です。 - 8
- コンテナーの実行に使用するユーザー ID を指定します。
- 9
- この設定で、Pod 内のコンテナー (複数可) にホストシステムへの権限アクセスを許可しないように指定します。
- 10
- この設定を使用すると、コンテナーは、割り当てられている初期の root 以外の権限を超えて権限を昇格できます。
- 11
- また、この設定により、コンテナーは root 以外のユーザーで実行されます。これにより、最小権限の原則が適用され、コンテナーが不正アクセスされる可能性を最小限に抑えるとともに、攻撃対象領域を減少させます。
- 12
- hugepage ボリュームを
/mnt/huge
の下の DPDK Pod にマウントします。hugepage ボリュームは、メディアがHugepages
に指定されている emptyDir ボリュームタイプでサポートされます。 - 13
- オプション: DPDK Pod に割り当てられる DPDK デバイスの数を指定します。このリソース要求および制限は、明示的に指定されていない場合、SR-IOV ネットワークリソースインジェクターによって自動的に追加されます。SR-IOV ネットワークリソースインジェクターは、SR-IOV Operator によって管理される受付コントローラーコンポーネントです。これはデフォルトで有効にされており、デフォルト
SriovOperatorConfig
CR でenableInjector
オプションをfalse
に設定して無効にすることができます。 - 14
- CPU の数を指定します。DPDK Pod には通常、kubelet から排他的 CPU を割り当てる必要があります。これは、CPU マネージャーポリシーを
static
に設定し、Guaranteed
QoS を持つ Pod を作成して実行されます。 - 15
- hugepage サイズ
hugepages-1Gi
またはhugepages-2Mi
を指定し、DPDK Pod に割り当てられる hugepage の量を指定します。2Mi
および1Gi
hugepage を別々に設定します。1Gi
hugepage を設定するには、カーネル引数をノードに追加する必要があります。たとえば、カーネル引数default_hugepagesz=1GB
、hugepagesz=1G
およびhugepages=16
を追加すると、16*1Gi
hugepage がシステムの起動時に割り当てられます。 - 16
- パフォーマンスプロファイルの名前が
cnf-performance profile
でない場合は、その文字列を正しいパフォーマンスプロファイル名に置き換えます。
以下のコマンドを実行して DPDK Pod を作成します。
oc create -f dpdk-pod-rootless.yaml
$ oc create -f dpdk-pod-rootless.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow