14.2.3. 定義済みの DPDK チェックアップを実行する
DPDK チェックアップを使用すると、ノードが Data Plane Development Kit (DPDK) ワークロードを使用して仮想マシンをパケットロスなしで実行できることを確認できます。
14.2.3.1. CLI を使用した DPDK 検査の実行 リンクのコピーリンクがクリップボードにコピーされました!
事前定義されたチェックアップを使用して、OpenShift Container Platform クラスターノードが Data Plane Development Kit (DPDK) ワークロードがある仮想マシン (VM) をパケット損失ゼロで実行できるか確認します。DPDK チェックアップは、トラフィックジェネレーターと、テスト DPDK アプリケーションを実行している仮想マシン間でトラフィックを実行します。
次の手順で DPDK チェックアップを実行します。
- DPDK チェック用のサービスアカウント、ロール、およびロールバインディングを作成します。
- config map を作成し、チェックアップを実行して結果を保存するための入力を行います。
- チェックアップを実行するジョブを作成します。
- config map で結果を確認します。
- オプション: チェックアップを再実行するには、既存の config map とジョブを削除し、新しい config map とジョブを作成します。
- 完了したら、DPDK チェックリソースを削除します。
前提条件
-
OpenShift CLI (
oc) がインストールされている。 - クラスターは DPDK アプリケーションを実行するように設定されています。
- プロジェクトは DPDK アプリケーションを実行するように設定されています。
手順
DPDK チェック用の
ServiceAccount、Role、およびRoleBindingマニフェストを作成します。例14.3 サービスアカウント、ロール、ロールバインディングマニフェストファイルの例
--- apiVersion: v1 kind: ServiceAccount metadata: name: dpdk-checkup-sa --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: kiagnose-configmap-access rules: - apiGroups: [ "" ] resources: [ "configmaps" ] verbs: [ "get", "update" ] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: kiagnose-configmap-access subjects: - kind: ServiceAccount name: dpdk-checkup-sa roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: kiagnose-configmap-access --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: kubevirt-dpdk-checker rules: - apiGroups: [ "kubevirt.io" ] resources: [ "virtualmachineinstances" ] verbs: [ "create", "get", "delete" ] - apiGroups: [ "subresources.kubevirt.io" ] resources: [ "virtualmachineinstances/console" ] verbs: [ "get" ] - apiGroups: [ "" ] resources: [ "configmaps" ] verbs: [ "create", "delete" ] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: kubevirt-dpdk-checker subjects: - kind: ServiceAccount name: dpdk-checkup-sa roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: kubevirt-dpdk-checkerServiceAccount、Role、RoleBindingマニフェストを適用します。$ oc apply -n <target_namespace> -f <dpdk_sa_roles_rolebinding>.yamlチェックアップの入力パラメーターを含む
ConfigMapマニフェストを作成します。入力 config map の例
apiVersion: v1 kind: ConfigMap metadata: name: dpdk-checkup-config labels: kiagnose/checkup-type: kubevirt-dpdk data: spec.timeout: 10m spec.param.networkAttachmentDefinitionName: <network_name>1 spec.param.trafficGenContainerDiskImage: "quay.io/kiagnose/kubevirt-dpdk-checkup-traffic-gen:v0.4.02 spec.param.vmUnderTestContainerDiskImage: "quay.io/kiagnose/kubevirt-dpdk-checkup-vm:v0.4.0"3 ターゲット namespace に
ConfigMapマニフェストを適用します。$ oc apply -n <target_namespace> -f <dpdk_config_map>.yamlチェックアップを実行する
Jobマニフェストを作成します。ジョブマニフェストの例
apiVersion: batch/v1 kind: Job metadata: name: dpdk-checkup labels: kiagnose/checkup-type: kubevirt-dpdk spec: backoffLimit: 0 template: spec: serviceAccountName: dpdk-checkup-sa restartPolicy: Never containers: - name: dpdk-checkup image: registry.redhat.io/container-native-virtualization/kubevirt-dpdk-checkup-rhel9:v4.19.0 imagePullPolicy: Always securityContext: allowPrivilegeEscalation: false capabilities: drop: ["ALL"] runAsNonRoot: true seccompProfile: type: "RuntimeDefault" env: - name: CONFIGMAP_NAMESPACE value: <target-namespace> - name: CONFIGMAP_NAME value: dpdk-checkup-config - name: POD_UID valueFrom: fieldRef: fieldPath: metadata.uidJobマニフェストを適用します。$ oc apply -n <target_namespace> -f <dpdk_job>.yamlジョブが完了するまで待ちます。
$ oc wait job dpdk-checkup -n <target_namespace> --for condition=complete --timeout 10m次のコマンドを実行して、チェックアップの結果を確認します。
$ oc get configmap dpdk-checkup-config -n <target_namespace> -o yaml出力 config map の例 (成功)
apiVersion: v1 kind: ConfigMap metadata: name: dpdk-checkup-config labels: kiagnose/checkup-type: kubevirt-dpdk data: spec.timeout: 10m spec.param.NetworkAttachmentDefinitionName: "dpdk-network-1" spec.param.trafficGenContainerDiskImage: "quay.io/kiagnose/kubevirt-dpdk-checkup-traffic-gen:v0.4.0" spec.param.vmUnderTestContainerDiskImage: "quay.io/kiagnose/kubevirt-dpdk-checkup-vm:v0.4.0" status.succeeded: "true"1 status.failureReason: ""2 status.startTimestamp: "2023-07-31T13:14:38Z"3 status.completionTimestamp: "2023-07-31T13:19:41Z"4 status.result.trafficGenSentPackets: "480000000"5 status.result.trafficGenOutputErrorPackets: "0"6 status.result.trafficGenInputErrorPackets: "0"7 status.result.trafficGenActualNodeName: worker-dpdk18 status.result.vmUnderTestActualNodeName: worker-dpdk29 status.result.vmUnderTestReceivedPackets: "480000000"10 status.result.vmUnderTestRxDroppedPackets: "0"11 status.result.vmUnderTestTxDroppedPackets: "0"12 - 1
- チェックアップが成功したか (
true)、失敗したか (false) を示します。 - 2
- チェックアップが失敗した場合の失敗の理由。
- 3
- チェックアップが開始した時刻 (RFC 3339 時刻形式)。
- 4
- チェックアップが完了した時刻 (RFC 3339 時刻形式)。
- 5
- トラフィックジェネレーターから送信されたパケットの数。
- 6
- トラフィックジェネレーターから送信されたエラーパケットの数。
- 7
- トラフィックジェネレーターが受信したエラーパケットの数。
- 8
- トラフィックジェネレーター仮想マシンがスケジュールされたノード。
- 9
- テスト対象の仮想マシンがスケジュールされたノード。
- 10
- テスト対象の仮想マシンで受信したパケットの数。
- 11
- DPDK アプリケーションによって破棄された入力トラフィックパケット。
- 12
- DPDK アプリケーションから破棄された出力トラフィックパケット。
以下のコマンドを実行して、以前に作成したジョブおよび config map を削除します。
$ oc delete job -n <target_namespace> dpdk-checkup$ oc delete config-map -n <target_namespace> dpdk-checkup-configオプション: 別のチェックアップを実行する予定がない場合は、
ServiceAccount、Role、RoleBindingマニフェストを削除します。$ oc delete -f <dpdk_sa_roles_rolebinding>.yaml
14.2.3.1.1. DPDK チェックアップ config map パラメーター リンクのコピーリンクがクリップボードにコピーされました!
次の表は、クラスターの DPDK 準備状況チェックアップを実行するときに、入力 ConfigMap マニフェストの data スタンザに設定できる必須および任意のパラメーターを示しています。
| パラメーター | 説明 | 必須かどうか |
|---|---|---|
|
| チェックアップが失敗するまでの時間 (分単位)。 | True |
|
|
接続されている SR-IOV NIC の | True |
|
| トラフィックジェネレーターのコンテナーディスクイメージ。 | True |
|
| トラフィックジェネレーター仮想マシンがスケジュールされるノード。DPDK トラフィックを許可するようにノードを設定する必要があります。 | False |
|
| 1 秒あたりのパケット数 (キロ (k) または 100 万 (m) 単位)。デフォルト値は 8m です。 | False |
|
| テスト対象の仮想マシンのコンテナーディスクイメージ。 | True |
|
| テスト対象の仮想マシンがスケジュールされるノード。DPDK トラフィックを許可するようにノードを設定する必要があります。 | False |
|
| トラフィックジェネレーターが実行される期間 (分単位)。デフォルト値は 5 分です。 | False |
|
| SR-IOV NIC の最大帯域幅。デフォルト値は 10Gbps です。 | False |
|
|
| False |
14.2.3.1.2. RHEL 仮想マシン用コンテナーディスクイメージのビルド リンクのコピーリンクがクリップボードにコピーされました!
カスタムの Red Hat Enterprise Linux (RHEL) 9 OS イメージを qcow2 形式でビルドし、それを使用してコンテナーディスクイメージを作成できます。クラスターからアクセス可能なレジストリーにコンテナーディスクイメージを保存し、DPDK チェック config map の spec.param.vmContainerDiskImage 属性でイメージの場所を指定できます。
コンテナーディスクイメージをビルドするには、Image Builder 仮想マシン (VM) を作成する必要があります。Image Builder 仮想マシン は、カスタム RHEL イメージのビルドに使用できる RHEL 9 仮想マシンです。
前提条件
-
Image Builder 仮想マシンは RHEL 9.4 を実行でき、
/varディレクトリーに少なくとも 2 つの CPU コア、4 GiB RAM、20 GB の空き領域がある。 -
Image Builder ツールとその CLI (
composer-cli) が仮想マシンにインストールされている。詳細は、「関連情報」を参照してください。 virt-customizeツールがインストールされている。# dnf install guestfs-tools-
Podman CLI ツール (
podman) がインストールされている。
手順
RHEL 9.4 イメージをビルドできることを確認します。
# composer-cli distros list注記非 root として
composer-cliコマンドを実行するには、ユーザーをweldrまたはrootグループに追加します。# usermod -a -G weldr <user>$ newgrp weldr次のコマンドを入力して、インストールするパッケージ、カーネルのカスタマイズ、起動時に無効化するサービスを含むイメージブループリントファイルを TOML 形式で作成します。
$ cat << EOF > dpdk-vm.toml name = "dpdk_image" description = "Image to use with the DPDK checkup" version = "0.0.1" distro = "rhel-9.4" [[customizations.user]] name = "root" password = "redhat" [[packages]] name = "dpdk" [[packages]] name = "dpdk-tools" [[packages]] name = "driverctl" [[packages]] name = "tuned-profiles-cpu-partitioning" [customizations.kernel] append = "default_hugepagesz=1GB hugepagesz=1G hugepages=1" [customizations.services] disabled = ["NetworkManager-wait-online", "sshd"] EOF次のコマンドを実行して、ブループリントファイルを Image Builder ツールにプッシュします。
# composer-cli blueprints push dpdk-vm.tomlブループリント名と出力ファイル形式を指定して、システムイメージを生成します。作成プロセスを開始すると、イメージのユニバーサル一意識別子 (UUID) が表示されます。
# composer-cli compose start dpdk_image qcow2作成プロセスが完了するまで待ちます。作成ステータスが
FINISHEDになると次のステップに進めます。# composer-cli compose status次のコマンドを入力し、UUID を指定して
qcow2イメージファイルをダウンロードします。# composer-cli compose image <UUID>次のコマンドを実行して、カスタマイズスクリプトを作成します。
$ cat <<EOF >customize-vm #!/bin/bash # Setup hugepages mount mkdir -p /mnt/huge echo "hugetlbfs /mnt/huge hugetlbfs defaults,pagesize=1GB 0 0" >> /etc/fstab # Create vfio-noiommu.conf echo "options vfio enable_unsafe_noiommu_mode=1" > /etc/modprobe.d/vfio-noiommu.conf # Enable guest-exec,guest-exec-status on the qemu-guest-agent configuration sed -i 's/\(--allow-rpcs=[^"]*\)/\1,guest-exec-status,guest-exec/' /etc/sysconfig/qemu-ga # Disable Bracketed-paste mode echo "set enable-bracketed-paste off" >> /root/.inputrc EOFvirt-customizeツールを使用して、Image Builder ツールによって生成されたイメージをカスタマイズします。$ virt-customize -a <UUID>-disk.qcow2 --run=customize-vm --selinux-relabelコンテナーディスクイメージのビルドに必要なすべてのコマンドを含む Dockerfile を作成するには、次のコマンドを入力します。
$ cat << EOF > Dockerfile FROM scratch COPY --chown=107:107 <UUID>-disk.qcow2 /disk/ EOFここでは、以下のようになります。
- <UUID>-disk.qcow2
-
カスタムイメージの名前を
qcow2形式で指定します。
次のコマンドを実行し、コンテナーをビルドしてタグを追加します。
$ podman build . -t dpdk-rhel:latest次のコマンドを実行して、クラスターからアクセスできるレジストリーにコンテナーディスクイメージをプッシュします。
$ podman push dpdk-rhel:latest-
DPDK チェックアップ config map の
spec.param.vmUnderTestContainerDiskImage属性で、コンテナーディスクイメージへのリンクを指定します。