10.3. カスタムの SR-IOV Compute サービスの作成
Red Hat OpenStack Services on OpenShift (RHOSO) 環境では、NFV 用のカスタムの SR-IOV Compute サービスを作成する必要があります。このサービスは、データプレーン上で実行される Ansible サービスです。このカスタムサービスは、SR-IOV コンピュートノードで次のタスクを実行します。
- CPU ピニングパラメーターを適用します。
- PCI パススルーを実行します。
SR-IOV カスタムサービスを作成するには、次の操作を実行する必要があります。
-
CPU ピニング設定を、指定の SR-IOV コンピュートノードのセットにマッピングする CPU ピニング用の
ConfigMapを作成します。 -
PCI パススルー設定を、指定の SR-IOV コンピュートノードのセットにマッピングする PCI パススルー用の
ConfigMapを作成します。 -
データプレーンに
configMapsを実装する実際の SR-IOV カスタムサービスを作成します。
前提条件
-
ワークステーションに
ocコマンドラインツールがインストール済みである。 -
cluster-admin権限を持つユーザーとして、RHOSO コントロールプレーンにアクセスできるワークステーションにログオン済みである。
手順
CPU ピニングと PCI パススルーの設定を定義する
ConfigMapCR を作成し、ワークステーション上の YAML ファイル (例:pinning-passthrough.yaml) に保存します。環境に応じて値 (太字部分) を変更します。
--- apiVersion: v1 kind: ConfigMap metadata: name: cpu-pinning-nova data: 25-cpu-pinning-nova.conf: | [DEFAULT] reserved_host_memory_mb = 4096 [compute] cpu_shared_set = 0-3,24-27 cpu_dedicated_set = 8-23,32-47 [neutron] physnets = <network_name1>, <network_name2> [neutron_physnet_<network_name1>] numa_nodes = <ID list> [neutron_physnet_<network_name2>] numa_nodes = <ID list> [neutron_tunnel] numa_nodes = <ID list> --- apiVersion: v1 kind: ConfigMap metadata: name: sriov-nova data: 26-sriov-nova.conf: | [libvirt] cpu_power_management=false [pci] passthrough_whitelist = {"address": "0000:05:00.2", "physical_network":"sriov-1", "trusted":"true"} passthrough_whitelist = {"address": "0000:05:00.3", "physical_network":"sriov-2", "trusted":"true"} ----
cpu_shared_set: vCPU のインベントリーを指定するために使用する物理ホスト CPU 番号のコンマ区切りリストまたは範囲を入力します。これにより、ピニングされていないインスタンスをスケジュールできるホスト CPU を決定します。また、共有エミュレータースレッドポリシーで設定されたインスタンスのインスタンスエミュレータースレッドをオフロードするホスト CPU を決定します。 -
cpu_dedicated_set: ピニングされたインスタンス CPU のプロセスをスケジュールできる物理ホスト CPU 番号のコンマ区切りのリストまたは範囲を入力します。たとえば、4-12,^8,15は、8 を除く 4 - 12 および 15 のコアを予約します。 -
<network_name_n_>:<network_name1>と<network_name2>は、ゲートウェイが配置されている物理ネットワークの名前に置き換えます。(このネットワークは、neutron ネットワークprovider:*nameフィールドで設定します。) numa_nodes = <ID list>:<ID list>を、この物理ネットワークに関連付けられている NUMA ノードの ID のコンマ区切りリストに置き換えます。たとえば、0,1です。以下に例を示します。[neutron] physnets = foo,bar [neutron_physnet_foo] numa_nodes = 0 [neutron_physnet_bar] numa_nodes = 2, 3この設定では、
provider:physical_network=fooで 1 つ以上の L2 タイプのネットワークを使用するインスタンスは NUMA ノード 0 のホストコアでスケジュールされる必要があり、provider:physical_network=barで 1 つ以上のネットワークを使用するインスタンスは NUMA ノード 2 と 3 の両方のホストコアでスケジュールされる必要があります。後者の場合、hw:numa_nodes extra仕様を使用して、ゲストを 2 つ以上のホスト NUMA ノードに分割する必要があります。-
passthrough_whitelist:"address"と"physical_network"に、有効な NIC アドレスと名前を指定します。
-
ConfigMapCR ファイルを使用して、ConfigMapオブジェクトを作成します。- 例
$ oc create -f sriov-pinning-passthru.yaml -n openstack
SR-IOV カスタムサービスを定義する
OpenStackDataPlaneServiceCR を作成し、ワークステーション上の YAML ファイル (例:nova-custom-sriov.yaml) に保存します。apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneService metadata: name: nova-custom-sriovConfigMapCR をカスタムサービスに追加し、このサービスを実行するノードセットの接続先セルのSecretCR を指定します。apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneService metadata: name: nova-custom-sriov spec: label: dataplane-deployment-nova-custom-sriov dataSources: - configMapRef: name: cpu-pinning-nova - configMapRef: name: sriov-nova - secretRef: name: nova-cell1-compute-config - secretRef: name: nova-migration-ssh-key tlsCerts: default: contents: - dnsnames - ips networks: - ctlplane issuer: osp-rootca-issuer-internal caCerts: combined-ca-bundleAnsible Playbook を参照するか、
playbookContentsフィールドに Ansible プレイを含めることで、カスタムサービスを作成するための Ansible コマンドを指定します。apiVersion: dataplane.openstack.org/v1beta1 kind: OpenStackDataPlaneService metadata: name: nova-custom-sriov spec: label: dataplane-deployment-nova-custom-sriov edpmServiceType: nova dataSources: - configMapRef: name: cpu-pinning-nova - configMapRef: name: sriov-nova - secretRef: name: nova-cell1-compute-config - secretRef: name: nova-migration-ssh-key playbook: osp.edpm.nova tlsCerts: default: contents: - dnsnames - ips networks: - ctlplane issuer: osp-rootca-issuer-internal caCerts: combined-ca-bundleplaybook: サービスで使用できるデフォルトの Playbook を識別します。この場合は、Compute サービス (nova) です。デフォルト Playbook のリストは、https://openstack-k8s-operators.github.io/edpm-ansible/playbooks.html で確認してください。
custom-nova-sriovサービスを作成します。$ oc apply -f nova-custom-sriov.yaml -n openstackカスタムサービスが作成されたことを確認します。
$ oc get openstackdataplaneservice nova-custom-sriov -o yaml -n openstack