シングルルート I/O 仮想化(SR-IOV)の設定
概要:SR-IOV の設定
Contrail Networkingは、UbuntuシステムとRed Hat Enterprise Linux(RHEL)オペレーティングシステムでもシングルルートI/O仮想化(SR-IOV)をサポートしています。
SR-IOV は、PCI Express(PCIe)仕様のインターフェイス拡張です。SR-IOV を使用すると、ネットワーク アダプターなどのデバイスは、さまざまなハードウェア機能間でそのリソースに個別にアクセスできます。
たとえば、データ プレーン開発キット (DPDK) ライブラリには、複数のネットワーク インターフェイス カード (NIC) のユーザー空間で実行されるドライバーが含まれています。ただし、アプリケーションが仮想マシン (VM) 内で実行されている場合は、NIC で SR-IOV が有効になっていない限り、物理 NIC は表示されません。
このトピックでは、Contrail NetworkingシステムでSR-IOVを設定する方法について説明します。
BIOS での ASPM の有効化
SR-IOV を使用するには、PCI Express (PCIe) デバイスに対してアクティブ状態電源管理 (ASPM) が有効になっている必要があります。システム BIOS で ASPM を有効にします。
システムの BIOS を、ASPM を有効にできるバージョンにアップグレードする必要がある場合があります。
Ansible導入機能を使用したSR-IOVの設定
システムで SR-IOV を使用可能にするには、以下のタスクを実行する必要があります。
Linux でインテル入力/出力メモリー管理ユニット (IOMMU) を有効にします。
選択した NIC で必要な数の仮想関数 (VF) を有効にします。
VM が VF とインターフェイスできる物理ネットワークの名前を構成します。
Nova コンピューティングを再起動します。
service nova-compute restart
次の例のように、新しい PCI 設定に基づいて Nova スケジューラフィルターを設定します。
/etc/nova/nova.conf [default] scheduler_default_filters = PciPassthroughFilter scheduler_available_filters = nova.scheduler.filters.all_filters scheduler_available_filters = nova.scheduler.filters.pci_passthrough_filter.PciPassthroughFilter
Nova スケジューラを再起動します。
service nova-scheduler restart
上記のタスクは、Ansible Deployer プレイブックによって処理されます。クラスター・メンバーとその構成パラメーターは、ansibleデプロイヤー・リポジトリー内の構成ディレクトリーにある instances.yaml ファイルで指定されます。
SR-IOV モードにするコンピューティング インスタンスには、SR-IOV 構成が必要です。次の instance.yaml スニペットは、インスタンス定義のサンプルを示しています。
instances: bms1: provider: bms ip: ip-address roles: openstack: bms2: provider: bms ip:ip-address roles: config_database: config: control: analytics_database: analytics: webui: bms3: provider: bms ip: ip-address roles: openstack_compute: vrouter: SRIOV: true SRIOV_VF: 3 SRIOV_PHYSICAL_INTERFACE: eno1 SRIOV_PHYS_NET: physnet1
Helm を使用した SR-IOV の設定
システムで SR-IOV を使用可能にするには、以下のタスクを実行する必要があります。
Linux でインテル入力/出力メモリー管理ユニット (IOMMU) を有効にします。
選択した NIC で必要な数の仮想関数 (VF) を有効にします。
VM が VF とインターフェイスできる物理ネットワークの名前を構成します。
Nova コンピューティングを再起動します。
service nova-compute restart
次の例のように、新しい PCI 設定に基づいて Nova スケジューラフィルターを設定します。
/etc/nova/nova.conf [default] scheduler_default_filters = PciPassthroughFilter scheduler_available_filters = nova.scheduler.filters.all_filters scheduler_available_filters = nova.scheduler.filters.pci_passthrough_filter.PciPassthroughFilter
Nova スケジューラを再起動します。
service nova-scheduler restart
上記のタスクは、Helm チャートによって処理されます。クラスターメンバーとその設定パラメータは、openstack-helm-infra リポジトリ内の設定ディレクトリにある マルチノードインベントリ ファイルで指定されます。
Helm の場合、構成および SR-IOV 環境固有のパラメーターは、次の 3 つの異なる場所で更新する必要があります。
コンピューティング インスタンスは、contrail-vrouter-sriov として設定する必要があります。
例えば、以下は openstack-helm-infra リポジトリにある tools/gate/devel/multinode-inventory.yaml ファイルの抜粋です。
all: children: primary: hosts: node1: ansible_port: 22 ansible_host: host-ip-address ansible_user: ubuntu ansible_ssh_private_key_file: /home/ubuntu/.ssh/insecure.pem ansible_ssh_extra_args: -o StrictHostKeyChecking=no nodes: children: openstack-compute: children: contrail-vrouter-sriov: #compute instance set to contrail-vrouter-sriov hosts: node7: ansible_port: 22 ansible_host: host-ip-address ansible_user: ubuntu ansible_ssh_private_key_file: /home/ubuntu/.ssh/insecure.pem ansible_ssh_extra_args: -o StrictHostKeyChecking=no
Contrail-vrouter-sriovには、適切なラベルを付ける必要があります。
例えば、以下は openstack-helm-infra リポジトリにある tools/gate/devel/multinode-vars.yaml からの抜粋です。
nodes: labels: primary: - name: openstack-helm-node-class value: primary all: - name: openstack-helm-node-class value: general contrail-controller: - name: opencontrail.org/controller value: enabled openstack-compute: - name: openstack-compute-node value: enabled contrail-vrouter-dpdk: - name: opencontrail.org/vrouter-dpdk value: enabled contrail-vrouter-sriov: # label as contrail-vrouter-sriov - name: vrouter-sriov value: enabled
SR-IOV の設定パラメーターは、 contrail-vrouter/values.yaml ファイルで更新する必要があります。
たとえば、以下は contrail-helm-deployer リポジトリにある contrail-vrouter/values.yaml ファイルの抜粋です。
contrail_env_vrouter_kernel: AGENT_MODE: kernel contrail_env_vrouter_sriov: SRIOV: true per_compute_info: node_name: k8snode1 SRIOV_VF: 10 SRIOV_PHYSICAL_INTERFACE: enp129s0f1 SRIOV_PHYS_NET: physnet1
SR-IOV 仮想マシンの起動
システムで SR-IOV 機能が有効になっていることを確認したら、次のいずれかの手順を使用して、Contrail Web UI または CLI を使用して、SR-IOV VM を起動する仮想ネットワークを作成します。両方のメソッドが含まれています。
Contrail Web UI を使用した SR-IOV 仮想マシンの有効化と起動
Contrail Web UI を使用して SR-IOV VM を有効にして起動するには、次の手順に従います。
[ > ネットワーク > ネットワークの構成] で、SR-IOV を有効にして仮想ネットワークを作成します。仮想ネットワークがサブネットがアタッチされて作成されていることを確認します。[詳細設定] セクションで、[ プロバイダー ネットワーク] チェック ボックスをオンにし、SR-IOV に対して既に有効になっている物理ネットワーク (または
testbed.py
nova.conf
) とその VLAN ID を指定します。 図1を参照してください。図1:ネットワーク の編集仮想ネットワークで、Neutron ポート (> ネットワーク > ポートの構成) を作成し、[ポート バインド] セクションで、SR-IOV の [キー] 値と [直接] の値を定義します。図2を参照してください。
図 2: ポート の作成作成した Neutron ポートの UUID を使用して、
nova boot
そのポートから VM を起動します。nova boot --flavor m1.large --image <image name> --nic port-id=<uuid of above port> <vm name>
CLI を使用した SR-IOV 仮想マシンの有効化および起動
CLI を使用して SR-IOV VM を有効にして起動するには、次の手順に従います。
SR-IOV を有効にして仮想ネットワークを作成します。SR-IOV に対して既に有効になっている物理ネットワーク(in
testbed.py
nova.conf
または)とその VLAN ID を指定します。次の例では、VLAN ID が 100 で、
vn1
の一部となっていますphysnet1
。neutron net-create --provider:physical_network=physnet1 --provider:segmentation_id=100 vn1
vn1 でサブネットを作成します。
neutron subnet-create vn1 a.b.c.0/24
仮想ネットワークで、バインドの種類が direct のサブネット上に Neutron ポートを作成します。
neutron port-create --fixed-ip subnet_id=<subnet uuid>,ip_address=<IP address from above subnet> --name <name of port> <vn uuid> --binding:vnic_type direct
作成した Neutron ポートの UUID を使用して、
nova boot
そのポートから VM を起動します。nova boot --flavor m1.large --image <image name> --nic port-id=<uuid of above port> <vm name>
VM にログインし、コマンドを使用して PCI バスを一覧表示し、イーサネット コントローラーが VF
lspci
であることを確認します。VLANで構成されるVFは、コマンドを使用して
ip link
監視できます。