Red Hat Training
A Red Hat training course is available for Red Hat OpenStack Platform
第3章 仮想ネットワークの SR-IOV サポートの設定
本章では、director を使用した Red Hat OpenStack Platform 10 環境への Single Root Input/Output Virtualization (SR-IOV) の設定について説明します。
本ガイドでは、CPU の割り当て、メモリーの確保、NIC の設定の例を紹介します。これらは、トポロジーとユースケースによって異なる場合があります。ハードウェアと設定のオプションについて理解するには、『ネットワーク機能仮想化 (NFV) の製品ガイド』および『ネットワーク機能仮想化 (NFV) のプランニングガイド』を参照してください。
etc/tuned/cpu-partitioning-variables.conf
の isolated_cores
や他の値を編集または変更しないでください。これらは、ここで説明する director の heat テンプレートにより変更されます。
以下の手順では、network-environment.yaml
ファイルを更新して、カーネルの引数、SR-IOV ドライバー、PCI パススルーなどのパラメーターを追加します。また、compute.yaml
ファイルも更新して、SR-IOV インターフェースのパラメーターを追加して、overcloud_deploy.sh
スクリプトを実行し、その SR-IOV パラメーターを使用してオーバークラウドをデプロイする必要があります。
3.1. VLAN トンネリングを使用する 2 ポート SR-IOV の設定
本項では、OpenStack 環境に VLAN トンネリングを使用する 2 ポート SR-IOV を設定する際に変更する必要のある YAML ファイルについて説明します。
3.1.1. first-boot.yaml
の変更
以前のデプロイメントで first-boot.yaml
ファイルに以下の行を追加している場合、Open vSwitch 2.9 を使用する Red Hat OpenStack Platform 10 ではこれらの行を削除してください。
ovs_service_path="/usr/lib/systemd/system/ovs-vswitchd.service" grep -q "RuntimeDirectoryMode=.*" $ovs_service_path if [ "$?" -eq 0 ]; then sed -i 's/RuntimeDirectoryMode=.*/RuntimeDirectoryMode=0775/' $ovs_service_path else echo "RuntimeDirectoryMode=0775" >> $ovs_service_path fi grep -Fxq "Group=qemu" $ovs_service_path if [ ! "$?" -eq 0 ]; then echo "Group=qemu" >> $ovs_service_path fi grep -Fxq "UMask=0002" $ovs_service_path if [ ! "$?" -eq 0 ]; then echo "UMask=0002" >> $ovs_service_path fi ovs_ctl_path='/usr/share/openvswitch/scripts/ovs-ctl' grep -q "umask 0002 \&\& start_daemon \"\$OVS_VSWITCHD_PRIORITY\"" $ovs_ctl_path if [ ! "$?" -eq 0 ]; then sed -i 's/start_daemon \"\$OVS_VSWITCHD_PRIORITY.*/umask 0002 \&\& start_daemon \"$OVS_VSWITCHD_PRIORITY\" \"$OVS_VSWITCHD_WRAPPER\" \"$@\"/' $ovs_ctl_path fi
tuned
設定を定義して CPU アフィニティーを有効にします。install_tuned: type: OS::Heat::SoftwareConfig properties: config: str_replace: template: | #!/bin/bash FORMAT=$COMPUTE_HOSTNAME_FORMAT if [[ -z $FORMAT ]] ; then FORMAT="compute" ; else # Assumption: only %index% and %stackname% are the variables in Host name format FORMAT=$(echo $FORMAT | sed 's/\%index\%//g' | sed 's/\%stackname\%//g') ; fi if [[ $(hostname) == *$FORMAT* ]] ; then # Install the tuned package yum install -y tuned-profiles-cpu-partitioning tuned_conf_path="/etc/tuned/cpu-partitioning-variables.conf" if [ -n "$TUNED_CORES" ]; then grep -q "^isolated_cores" $tuned_conf_path if [ "$?" -eq 0 ]; then sed -i 's/^isolated_cores=.*/isolated_cores=$TUNED_CORES/' $tuned_conf_path else echo "isolated_cores=$TUNED_CORES" >> $tuned_conf_path fi tuned-adm profile cpu-partitioning fi fi params: $COMPUTE_HOSTNAME_FORMAT: {get_param: ComputeHostnameFormat} $TUNED_CORES: {get_param: HostIsolatedCoreList}
カーネルの引数を設定します。
compute_kernel_args: type: OS::Heat::SoftwareConfig properties: config: str_replace: template: | #!/bin/bash set -x FORMAT=$COMPUTE_HOSTNAME_FORMAT if [[ -z $FORMAT ]] ; then FORMAT="compute" ; else # Assumption: only %index% and %stackname% are the variables in Host name format FORMAT=$(echo $FORMAT | sed 's/\%index\%//g' | sed 's/\%stackname\%//g') ; fi if [[ $(hostname) == *$FORMAT* ]] ; then sed 's/^\(GRUB_CMDLINE_LINUX=".*\)"/\1 $KERNEL_ARGS"/g' -i /etc/default/grub ; grub2-mkconfig -o /etc/grub2.cfg sleep 5 reboot fi params: $KERNEL_ARGS: {get_param: ComputeKernelArgs} $COMPUTE_HOSTNAME_FORMAT: {get_param: ComputeHostnameFormat}
3.1.2. network-environment.yaml
の変更
resource_registry
セクションにfirst-boot.yaml
を追加して CPU のチューニングを設定します。resource_registry: # Specify the relative/absolute path to the config files you want to use for override the default. OS::TripleO::Compute::Net::SoftwareConfig: nic-configs/compute.yaml OS::TripleO::Controller::Net::SoftwareConfig: nic-configs/controller.yaml # First boot and Kernel Args OS::TripleO::NodeUserData: first-boot.yaml
parameter_defaults
セクションにおいて、トンネル種別を無効にし (値を""
に設定)、ネットワーク種別をvlan
に設定します。NeutronTunnelTypes: '' NeutronNetworkType: 'vlan'
parameter_defaults
セクションにおいて、Open vSwitch の物理ネットワークをブリッジにマッピングします。NeutronBridgeMappings: 'tenant:br-link0'
parameter_defaults
セクションにおいて、OpenStack Networking ML2 および Open vSwitch VLAN のマッピング範囲を設定します。NeutronNetworkVLANRanges: 'tenant:22:22,tenant:25:25'
parameter_defaults
セクションにおいて、SR-IOV の設定パラメーターを定義します。SR-IOV メカニズムドライバー (
sriovnicswitch
) を有効にします。NeutronMechanismDrivers: "openvswitch,sriovnicswitch"
Compute の
pci_passthrough_whitelist
パラメーターを設定し、SR-IOV インターフェースのdevname
を設定します。ホワイトリストで、インスタンスが利用可能な PCI デバイスを設定します。NovaPCIPassthrough: - devname: "p7p1" physical_network: "tenant" - devname: "p7p2" physical_network: "tenant"
物理ネットワークおよび SR-IOV インターフェースを
PHYSICAL_NETWORK
:PHYSICAL DEVICE
の形式で指定します。サーバーの
network_vlan_ranges
に記載されるすべての物理ネットワークには、各エージェントの適切なインターフェースへのマッピングが必要です。NeutronPhysicalDevMappings: "tenant:p7p1,tenant:p7p2"
各 SR-IOV インターフェース用に確保する Virtual Function (VF) の数を指定します。
Red Hat OpenStack Platform では、NIC ベンダーがサポートする VF 数がサポートされます。その他の関連情報は、「Deployment Limits for Red Hat OpenStack Platform」を参照してください。以下の例では、各 SR-IOV インターフェースに 5 つの VF を確保しています。
NeutronSriovNumVFs: "p7p1:5,p7p2:5"
注記動作中の環境で
NeutronSriovNumVFs
パラメーターを変更すると、その PF 上の SR-IOV ポートを持つ実行中のインスタンスがすべて使用できなくなることが知られています。これらのインスタンスをハードリブートしない限り、インスタンスは SR-IOV PCI デバイスを認識しません。
parameter_defaults
セクションにおいて、ホストプロセス用の RAM を確保します。NovaReservedHostMemory: 4096
parameter_defaults
セクションにおいて、仮想マシンプロセス用に確保する物理 CPU コアのコンマ区切りリストまたは範囲を設定します。NovaVcpuPinSet: "1-19,21-39"
parameter_defaults
セクションにおいて、適用可能なフィルターの一覧を設定します。Nova スケジューラーは、ここで指定するリスト順にこれらのフィルターを適用します。ノードに対するフィルタリングのプロセスがより効率的になるように、最も制限の厳しいフィルターを最初に設定します。
NovaSchedulerDefaultFilters: - "RetryFilter" - "AvailabilityZoneFilter" - "RamFilter" - "ComputeFilter" - "ComputeCapabilitiesFilter" - "ImagePropertiesFilter" - "ServerGroupAntiAffinityFilter" - "ServerGroupAffinityFilter" - "PciPassthroughFilter" - "NUMATopologyFilter" - "AggregateInstanceExtraSpecsFilter"
parameter_defaults
セクションにおいて、初回ブート時にデフォルトのgrub
ファイルに追加するComputeKernelArgs
パラメーターを定義します。ComputeKernelArgs: "default_hugepagesz=1GB hugepagesz=1G hugepages=12 intel_iommu=on iommu=pt"
注記DPDK インスタンスに関連付けるフレーバーに
hw:mem_page_size=1GB
を追加する必要があります。追加しない場合、DHCP による割り当てがインスタンスに適用されません。parameter_defaults
セクションにおいて、チューニングする物理 CPU コアの一覧または範囲を設定します。指定した引数がチューニングされた
cpu-partitioning
プロファイルに追加されます。HostIsolatedCoreList: "1-19,21-39"
3.1.3. controller.yaml の変更
分離ネットワーク用の Linux ボンディングを作成します。
- type: linux_bond name: bond_api bonding_options: "mode=active-backup" use_dhcp: false dns_servers: {get_param: DnsServers} members: - type: interface name: nic3 primary: true - type: interface name: nic4
この Linux ボンディングに VLAN を割り当てます。
- type: vlan vlan_id: {get_param: InternalApiNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: InternalApiIpSubnet} - type: vlan vlan_id: {get_param: TenantNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: TenantIpSubnet} - type: vlan vlan_id: {get_param: StorageNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: StorageIpSubnet} - type: vlan vlan_id: {get_param: StorageMgmtNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: StorageMgmtIpSubnet} - type: vlan vlan_id: {get_param: ExternalNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: ExternalIpSubnet} routes: - default: true next_hop: {get_param: ExternalInterfaceDefaultRoute}
neutron-dhcp-agent および neutron-metadata-agent サービスにアクセスするための OVS ブリッジを作成します。
- type: ovs_bridge name: br-link0 use_dhcp: false mtu: 9000 members: - type: ovs_bond name: bond0 use_dhcp: true members: - type: interface name: nic7 mtu: 9000 - type: interface name: nic8 mtu: 9000
3.1.4. compute.yaml
の変更
分離ネットワーク用の Linux ボンディングを作成します。
- type: linux_bond name: bond_api bonding_options: "mode=active-backup" use_dhcp: false dns_servers: {get_param: DnsServers} members: - type: interface name: nic3 # force the MAC address of the bridge to this interface primary: true - type: interface name: nic4
この Linux ボンディングに VLAN を割り当てます。
- type: vlan vlan_id: {get_param: InternalApiNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: InternalApiIpSubnet} - type: vlan vlan_id: {get_param: TenantNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: TenantIpSubnet} - type: vlan vlan_id: {get_param: StorageNetworkVlanID} device: bond_api addresses: - ip_netmask: {get_param: StorageIpSubnet}
以下の設定を
compute.yaml
ファイルに追加することで、2 つの SR-IOV インターフェースを設定します。- type: interface name: p7p1 mtu: 9000 use_dhcp: false defroute: false nm_controlled: true hotplug: true - type: interface name: p7p2 mtu: 9000 use_dhcp: false defroute: false nm_controlled: true hotplug: true
3.1.5. overcloud_deploy.sh
スクリプトの実行
VLAN 環境用の openstack overcloud deploy
コマンドの例を以下に示します。
openstack overcloud deploy \ --templates \ -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \ -e /usr/share/openstack-tripleo-heat-templates/environments/neutron-sriov.yaml \ -e /home/stack/ospd-10-vlan-sriov-two-ports-ctlplane-bonding/network-environment.yaml \ --log-file overcloud_install.log &> overcloud_install.log
-
/usr/share/openstack-tripleo-heat-templates/environments/neutron-sriov.yaml
はデフォルトのneutron-sriov.yaml
ファイルの場所です。これによりコンピュートノードの SR-IOV パラメーターを有効にします。 -
/home/stack/<relative-directory>/network-environment.yaml
はnetwork-environment.yaml
ファイルへのパスです。デフォルトのneutron-sriov.yaml
の値をnetwork-environment.yaml
ファイルでオーバーライドすることができます。
3.2. SR-IOV 用フレーバーの作成とインスタンスのデプロイ
NFV を実装する Red Hat OpenStack Platform デプロイメントの SR-IOV の設定を完了した後には、以下の手順を実施してフレーバーを作成してインスタンスをデプロイする必要があります。
SR-IOV 用にアグリゲートグループを作成し、ホストを追加します。フレーバーメタデータに一致するメタデータを定義します (例:
"aggregate_instance_extra_specs:sriov"="true"
)。# openstack aggregate create sriov_group # openstack aggregate set --property \ "aggregate_instance_extra_specs:sriov"="true" sriov_group # openstack aggregate add host sriov compute-sriov-0.localdomain
フレーバーを作成します。
# openstack flavor create <flavor> --ram <MB> --disk <GB> --vcpus <#>
追加のフレーバー属性を設定します。定義したメタデータ (
"aggregate_instance_extra_specs:sriov"="true"
) と SR-IOV アグリゲートで定義したメタデータが一致している点に注意してください。# openstack flavor set --property "aggregate_instance_extra_specs:sriov"="true" \ --property hw:cpu_policy=dedicated \ --property hw:mem_page_size=large <flavor>
ネットワークを作成します。
# openstack network create net1 --provider-physical-network tenant --provider-network-type vlan --provider-segment <VLAN-ID>
サブネットを作成します。
# openstack subnet create subnet1 --network net1 --subnet-range 192.0.2.0/24 --dhcp
ポートを作成します。
SR-IOV VF ポートを作成するには、
vnic-type
に direct を使用します。# openstack port create --network net1 --vnic-type direct sriov_port
SR-IOV PF ポートを作成するには、
vnic-type
に direct-physical を使用します。# openstack port create --network net1 --vnic-type direct-physical sriov_port
インスタンスをデプロイします。
# openstack server create --flavor <flavor> --image <glance_image> --nic port-id=sriov_port <name>
これで、NFV ユースケースで SR-IOV 用インスタンスがデプロイされました。