Metonymical Deflection

ゆるく日々のコト・たまにITインフラ

CentOS7 ovs(Open vSwitch)のネットワーク設定方法

CentOS7によるovs(Open vSwitch)のネットワーク設定(Bridge、Bonding、VLAN)の方法について記載しました。
KVMとLXC/LXDにおいてLinuxBridgeで実現可能だったことを、ovsでも同様に実現可能にした内容となっています。
このため、LinuxBridgeからovsへの移行設計が可能になると考えています。*1

過去記事では、nmcliコマンドによるLinuxBridgeについて記載しましたが、LinuxBridgeからovsへ変更した際、どこが変わったのか?のポイントも記載したいと考えています。

1.構成

1-1.環境
筐体                             : ProLiant DL360p Gen8
System ROM                       : P71 01/22/2018
NIC                              : Intel X520-SR2
OS                               : CentOS7.6(1810)
Kernel                           : 3.10.0-957.el7.x86_64
Installed Environment Groups     : Server with GUI
Add-Ons for Selected Environment : Virtualization Client, Virtualization Hypervisor, Virtualization Tools 
ovs                              : 2.10.1

今回は物理スイッチとLACPで接続するために上記の筐体を使用しましたが、LACP以外のところはVMWareWorkstation12上でも動作しますので、本記事に記載した内容は特に環境依存的なことはないと考えています。

1-2.全体構成

f:id:metonymical:20181225193849j:plain
構成図上に(1)~(13)までの番号を割り振りました。

スイッチ側の設定は以下となります。

interface Port-channel1
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 11,300-302
 switchport mode trunk
 spanning-tree portfast trunk
!
interface TenGigabitEthernet0/1
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 11,300-302
 switchport mode trunk
 spanning-tree portfast trunk
 channel-group 1 mode active
!
interface TenGigabitEthernet0/2
 switchport trunk encapsulation dot1q
 switchport trunk allowed vlan 11,300-302
 switchport mode trunk
 spanning-tree portfast trunk
 channel-group 1 mode active
!
interface Vlan300
 ip address 192.168.30.254 255.255.255.0
!
interface Vlan301
 ip address 192.168.31.254 255.255.255.0
!
interface Vlan302
 ip address 192.168.32.254 255.255.255.0
1-3.全体の流れ ~概要~
  1. Bridge作成:(1)
  2. Bonding:(2)
  3. VLAN(PortGroupの定義):(3)
  4. access port:(4)
  5. trunk port:(5)
  6. Guest側Tagging例1:(6)(7)(8)
  7. Guest側Tagging例2:(9)(10)(11)
  8. fake bridge(VLAN Interface)の作成:(12)
  9. LXCコンテナとfake bridgeのアタッチ:(13)
1-4.全体の流れ ~コマンドのみ~

以下のコマンドを投入していきます。
やりたいことが既に決まっている方は、構成図とコマンドの内容を見るだけでもよいと思います。

1.Bridge作成
(1)
ovs-vsctl add-br ovsbr0

2.Bonding
(2)
ovs-vsctl add-bond ovsbr0 bond0 ens1f0 ens1f1

1&2の永続化設定
vi /etc/sysconfig/network-scripts/ifcfg-ovsbr0

DEVICE=ovsbr0
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=static
NM_CONTROLLED=no
ONBOOT=yes
HOTPLUG=no

vi /etc/sysconfig/network-scripts/ifcfg-ens1f0

DEVICE=ens1f0
NETBOOT=yes
IPV6INIT=no
BOOTPROTO=none
NM_CONTROLLED=no
ONBOOT=yes
HOTPLUG=no

vi /etc/sysconfig/network-scripts/ifcfg-ens1f1

DEVICE=ens1f1
NETBOOT=yes
IPV6INIT=no
BOOTPROTO=none
NM_CONTROLLED=no
ONBOOT=yes
HOTPLUG=no

[LACPの場合]
vi /etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSBond
OVS_BRIDGE=ovsbr0
BOOTPROTO=none
NM_CONTROLLED=no
BOND_IFACES="ens1f0 ens1f1"
OVS_OPTIONS="bond_mode=balance-tcp lacp=active other_config:lacp-time=fast vlan_mode=trunk trunks=11,300-302"
HOTPLUG=no

[固定LAGの場合]
vi /etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSBond
OVS_BRIDGE=ovsbr0
BOOTPROTO=none
NM_CONTROLLED=no
BOND_IFACES="ens1f0 ens1f1"
OVS_OPTIONS="bond_mode=balance-slb lacp=off vlan_mode=trunk trunks=11,300-302"
HOTPLUG=no

3.VLAN(PortGroupの定義)
(3)
vi /tmp/ovsnw.xml

<network>
<name>ovsnw</name>
<forward mode='bridge'/>
<bridge name='ovsbr0'/>
<virtualport type='openvswitch'/>
<portgroup name='untag' default='yes'>
</portgroup>
<portgroup name='vlan11'>
  <vlan>
   <tag id='11'/>
  </vlan>
</portgroup>
<portgroup name='vlan300'>
  <vlan>
    <tag id='300'/>
  </vlan>
</portgroup>
<portgroup name='vlan301'>
  <vlan>
    <tag id='301'/>
  </vlan>
</portgroup>
<portgroup name='vlan302'>
  <vlan>
    <tag id='302'/>
  </vlan>
</portgroup>
</network>

4.access port
(4)
Virt-Manager画面上でvlan300を選択
 or
virsh edit Guest1

 <interface type='network'>
   <mac address='52:54:00:d4:25:2e'/>
   <source network='ovsnw' portgroup='vlan300'/>
   <model type='virtio'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
 </interface>

5.trunk port
(5)
Virt-Manager画面上でuntagを選択
 or
virsh edit Guest2

 <interface type='network'>
   <mac address='52:54:00:d4:35:3e'/>
   <source network='ovsnw' portgroup='untag'/>
   <model type='virtio'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
 </interface>


6.Guest側Tagging例1
(6)
nmcli connection add type bridge autoconnect yes con-name br301 ifname br301
nmcli connection modify br301 bridge.stp no
nmcli connection modify br301 ipv4.method manual ipv4.addresses 192.168.31.162/24
nmcli connection modify br301 ipv6.method ignore
nmcli connection up br301
nmcli con show
(7)
nmcli connection add type vlan autoconnect yes con-name eth0.301 ifname eth0.301 dev eth0 id 301
nmcli con show
(8)
nmcli connection modify eth0.301 connection.master br301 connection.slave-type bridge
nmcli connection up eth0.301
nmcli con show


7.Guest側Tagging例2
(9)
nmcli connection add type bridge autoconnect yes con-name br302 ifname br302
nmcli connection modify br302 bridge.stp no
nmcli connection modify br302 ipv4.method manual ipv4.addresses 192.168.32.162/24
nmcli connection modify br302 ipv6.method ignore
nmcli connection up br302
nmcli con show
(10)
nmcli connection add type vlan autoconnect yes con-name eth0.302 ifname eth0.302 dev eth0 id 302
nmcli con show
(11)
nmcli connection modify eth0.302 connection.master br302 connection.slave-type bridge
nmcli connection up eth0.302
nmcli con show

8.fake bridge(VLAN Interface)の作成
(12)
vi /etc/sysconfig/network-scripts/ifcfg-vlan302

DEVICE=vlan302
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSIntPort
BOOTPROTO=static
OVS_BRIDGE=ovsbr0
OVS_OPTIONS="vlan_mode=access tag=302 fake_bridge=true"
OVS_EXTRA="set Interface $DEVICE external-ids:iface-id=$(hostname -s)-$DEVICE-vif"
HOTPLUG=no

9.LXCコンテナとfake bridgeのアタッチ
(13)
lxc network attach vlan302 lxc762 eth1

2.Bridge作成

まずはBridgeを作成します。
(1)Bridgeの作成

出力結果
[root@c761 ~]# ovs-vsctl add-br ovsbr0
[root@c761 ~]# ovs-vsctl show
b1d3d75a-2c4c-49e7-bc33-06e44a70dfe2
    Bridge "ovsbr0"
        Port "ovsbr0"
            Interface "ovsbr0"
                type: internal
    ovs_version: "2.10.1"

3.Bonding

Bondを作成し、物理インターフェースをBondにアタッチします。
(2)Bond作成+物理アタッチ

出力結果
[root@c761 ~]# ovs-vsctl add-bond ovsbr0 bond0 ens1f0 ens1f1
[root@c761 ~]# ovs-vsctl show
b1d3d75a-2c4c-49e7-bc33-06e44a70dfe2
    Bridge "ovsbr0"
        Port "ovsbr0"
            Interface "ovsbr0"
                type: internal
        Port "bond0"
            Interface "ens1f1"
            Interface "ens1f0"
    ovs_version: "2.10.1"

過去記事の図と比較してもらえればわかると思いますが、過去記事の(3)~(5)を行った状態となります。

また、LinuxBridgeの場合、BridgeとBondが分離しているのに対して、ovsでは、Bridge "ovsbr0"の中にBondが入っています。
具体的には、Port "ovsbr0"とPort "bond0"がBridge "ovsbr0"の中に定義されており、さらに、Port "bond0"のインターフェースとして、物理のens1f0やens1f1が定義されています。

これは仮想スイッチovsbr0のアップリンクポート(物理サーバの外部へ抜けるトラフィックが通るポート)がBondとして定義されている状態と言えます。

仮にESXiのvSwitchで例えるなら、こんな↓状態です。
f:id:metonymical:20181224110914j:plain

4.永続化設定

コマンドを打っただけだと、ホストOSをRebootすると消えてしまうので永続化設定を行います。

vi /etc/sysconfig/network-scripts/ifcfg-ovsbr0

DEVICE=ovsbr0
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=static
NM_CONTROLLED=no
ONBOOT=yes
HOTPLUG=no

vi /etc/sysconfig/network-scripts/ifcfg-ens1f0

DEVICE=ens1f0
NETBOOT=yes
IPV6INIT=no
BOOTPROTO=none
NM_CONTROLLED=no
ONBOOT=yes
HOTPLUG=no

vi /etc/sysconfig/network-scripts/ifcfg-ens1f1

DEVICE=ens1f1
NETBOOT=yes
IPV6INIT=no
BOOTPROTO=none
NM_CONTROLLED=no
ONBOOT=yes
HOTPLUG=no

[LACPの場合]
vi /etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSBond
OVS_BRIDGE=ovsbr0
BOOTPROTO=none
NM_CONTROLLED=no
BOND_IFACES="ens1f0 ens1f1"
OVS_OPTIONS="bond_mode=balance-tcp lacp=active other_config:lacp-time=fast vlan_mode=trunk trunks=11,300-302"
HOTPLUG=no

[固定LAGの場合]
vi /etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSBond
OVS_BRIDGE=ovsbr0
BOOTPROTO=none
NM_CONTROLLED=no
BOND_IFACES="ens1f0 ens1f1"
OVS_OPTIONS="bond_mode=balance-slb lacp=off vlan_mode=trunk trunks=11,300-302"
HOTPLUG=no

設定後はnetworkサービスをリスタート
systemctl restart network

いくつか、ポイントを記載します。
・対向の物理スイッチに合わせて、LACP or 固定LAGのどちらかの設定を行ってください。なお、ここではLACPとします。

・ovsのDefaultでは、vlan_mode=trunkにてFullTrunk状態となっているため、明示的にTrunkするVLANを絞りたい場合に、trunks=11,300-302が必要となります。*2

・NM_CONTROLLED=noにより、該当するインターフェースがNetworkManagerの管理下から外れるため必須設定と考えてください。

・nmcliコマンドでBondを作成した際も、上記パス*3に似たようなファイルが生成されていますが、ovs特有のオプションを指定できる点が異なります。

・networkサービスのリスタートを行っても正常に動作しない場合、少々ダサいですがホストOSごと再起動してみてください。

5.VLAN(PortGroupの定義)

(3)libvirtに対してovsのネットワーク定義
仮想マシン側でNICを追加する際、ovsを選択できるようにするため、libvirt上でネットワークの定義を行います。

その際、仮想マシンとovsをaccessポートで接続するのか?trunkポートで接続するのか?を設定できるようにするため、PortGroupの定義も併せて行います。

ESXiのvSwitchで例えるなら、下図の左側にある「仮想マシンのポートグループ」の設定を行っていくイメージです。
f:id:metonymical:20181224112812j:plain

(3)
vi /tmp/ovsnw.xml

<network>
<name>ovsnw</name>
<forward mode='bridge'/>
<bridge name='ovsbr0'/>
<virtualport type='openvswitch'/>
<portgroup name='untag' default='yes'>
</portgroup>
<portgroup name='vlan11'>
  <vlan>
   <tag id='11'/>
  </vlan>
</portgroup>
<portgroup name='vlan300'>
  <vlan>
    <tag id='300'/>
  </vlan>
</portgroup>
<portgroup name='vlan301'>
  <vlan>
    <tag id='301'/>
  </vlan>
</portgroup>
<portgroup name='vlan302'>
  <vlan>
    <tag id='302'/>
  </vlan>
</portgroup>
</network>

いくつか、ポイントを記載します。
A.「portgroup name='vlan11'」や「portgroup name='vlan300'」は、仮想マシンをovsにaccess portとして接続させたい場合の設定となります。
B.「portgroup name='untag' default='yes'」は、仮想マシンをovsにtrunk portとして接続させたい場合の設定となります。

A.は、主に仮想サーバなど自身でVLAN IDを付けずにトラフィックを流してくる仮想マシンとして使用できます。
B.は、主に仮想ルータ(CSR1000v・vMX・A10 vThunderなど)や仮想スイッチ(CumulusVXやNexus9000v)など、自身でVLAN IDを付けてトラフィックを流してくる仮想マシンとして使用できます。

ちなみに、B.においては、4.永続化設定で記載したように、DefaultでFullTrunk状態です。このため、許可するVLANを絞ることも可能なようですが、ここでは割愛します。*4

上記ファイルの作成が完了したら、virshコマンドで定義していきます。

virsh net-list
virsh net-define /tmp/ovsnw.xml
virsh net-start ovsnw
virsh net-autostart ovsnw
virsh net-list

現在のネットワーク定義を参照
ovsnw.xmlのネットワークを定義
ovsnwのスタート
ovsnwの自動起動設定
現在のネットワーク定義を参照

以下が各コマンドの出力結果となります。

出力結果
[root@c761 ~]# virsh net-list
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes

[root@c761 ~]# virsh net-define /tmp/ovsnw.xml
Network ovsnw defined from /tmp/ovsnw.xml

[root@c761 ~]# virsh net-start ovsnw
Network ovsnw started

[root@c761 ~]# virsh net-autostart ovsnw
Network ovsnw marked as autostarted

[root@c761 ~]# virsh net-list
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes
 ovsnw                active     yes           yes

上記の設定が完了すると、Virt-Manager上の画面からovsやPortGroupが選択できるようになります。

6.access port

(4)仮想マシンをovsにaccess portで接続
Virt-Manager画面上で設定する場合は、以下の通り。
f:id:metonymical:20181224121543j:plain

AddHardwareをクリック
Networkを選択
NetworkSource:Virtual Network’ovsnw’を選択
Portgroup:vlan300を選択

virshコマンドで設定する場合は、以下の通り。

virsh edit Guest1

 <interface type='network'>
   <mac address='52:54:00:d4:25:2e'/>
   <source network='ovsnw' portgroup='vlan300'/>
   <model type='virtio'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
 </interface>

7.trunk port

(5)仮想マシンをovsにtrunk portで接続
Virt-Manager画面上で設定する場合は、以下の通り。
f:id:metonymical:20181224121543j:plain

AddHardwareをクリック
Networkを選択
NetworkSource:Virtual Network’ovsnw’を選択
Portgroup:untagを選択

virshコマンドで設定する場合は、以下の通り。

virsh edit Guest2

 <interface type='network'>
   <mac address='52:54:00:d4:25:2e'/>
   <source network='ovsnw' portgroup='untag'/>
   <model type='virtio'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
 </interface>

8.Guest側Tagging例1と2

Guest2起動後、Guest2のbash上でnmcliコマンドにより、VLANインターフェースを作成します。
nmcliコマンドの詳細については、過去記事を参照ください。

(6)
nmcli connection add type bridge autoconnect yes con-name br301 ifname br301
nmcli connection modify br301 bridge.stp no
nmcli connection modify br301 ipv4.method manual ipv4.addresses 192.168.31.162/24
nmcli connection modify br301 ipv6.method ignore
nmcli connection up br301
nmcli con show
(7)
nmcli connection add type vlan autoconnect yes con-name eth0.301 ifname eth0.301 dev eth0 id 301
nmcli con show
(8)
nmcli connection modify eth0.301 connection.master br301 connection.slave-type bridge
nmcli connection up eth0.301
nmcli con show

(9)
nmcli connection add type bridge autoconnect yes con-name br302 ifname br302
nmcli connection modify br302 bridge.stp no
nmcli connection modify br302 ipv4.method manual ipv4.addresses 192.168.32.162/24
nmcli connection modify br302 ipv6.method ignore
nmcli connection up br302
nmcli con show
(10)
nmcli connection add type vlan autoconnect yes con-name eth0.302 ifname eth0.302 dev eth0 id 302
nmcli con show
(11)
nmcli connection modify eth0.302 connection.master br302 connection.slave-type bridge
nmcli connection up eth0.302
nmcli con show

7.trunk portの設定により、(5)のeth0とvnet1間はFullTrunkで接続されていると考えてください。

これにより、例えば、SrcIP:192.168.31.162-DstIP:192.168.31.254でPingを打つと、以下のような流れで処理されます。

1. (7)でVLAN ID301がTaggingされる。
2. (5)はFullTrunk状態なので、VLANタグは剥がされずに、そのままスイッチング処理*5される。
3. (2)では11,300-302がAllowedされているので、VLANタグは剥がされずに、そのままスイッチング処理される。
4.物理スイッチ側でVLANタグが剥がされ、以下のVLAN InterfaceがPingに応答する。

interface Vlan301
 ip address 192.168.31.254 255.255.255.0

9.fake bridge(VLAN Interface)の作成

fake bridge(VLAN Interface)の作成と同時に永続化設定も実施します。

vi /etc/sysconfig/network-scripts/ifcfg-vlan302

DEVICE=vlan302
ONBOOT=yes
DEVICETYPE=ovs
TYPE=OVSIntPort
BOOTPROTO=static
OVS_BRIDGE=ovsbr0
OVS_OPTIONS="vlan_mode=access tag=302 fake_bridge=true"
OVS_EXTRA="set Interface $DEVICE external-ids:iface-id=$(hostname -s)-$DEVICE-vif"
HOTPLUG=no

設定後はnetworkサービスをリスタート
systemctl restart network

fake_bridge=trueを指定しないと、単なるVLAN Interfaceとなってしまうため、次工程(10.LXCコンテナとfake bridgeのアタッチ)に進むと、必ず躓くポイントになります。理由は、LXCに対してVLAN Interface 302をBridgeとして認識させる必要があるためです。

10.LXCコンテナとfake bridgeのアタッチ

fake bridge (VLAN Interface 302)にコンテナlxc762のeth1をアタッチします。

lxc network attach vlan302 lxc762 eth1

アタッチ後、仮想マシンやLXCコンテナを起動すると、ovs上では以下のように構成されていることが確認できます。

[root@c761 ~]# ovs-vsctl show
b1d3d75a-2c4c-49e7-bc33-06e44a70dfe2
    Bridge "ovsbr0"
        Port "ovsbr0"
            Interface "ovsbr0"
                type: internal
        Port "bond0"
            trunks: [11, 300, 301, 302, 303, 304]
            Interface "ens1f1"
            Interface "ens1f0"
        Port "vnet0"
            tag: 300
            Interface "vnet0"
        Port "vnet1"
            Interface "vnet1"
        Port "vlan302"
            tag: 302
            Interface "vlan302"
                type: internal
        Port "vethCPI2P0"
            tag: 302
            Interface "vethCPI2P0"
    ovs_version: "2.10.1"

Port "bond0":アップリンクポートの設定(trunk allowed vlan 11,300-304の状態)
Port "vnet0":access vlan 300のポート設定
Port "vnet1":trunkポートの設定(FullTrunk状態)
Port "vlan302":fake bridgeの設定
Port "vethCPI2P0":fake bridgeに接続されたlxc762のポート設定

11.補足1:fake_bridgeについて

fake_bridge=trueを指定しなかった場合、上記コマンドにて「lxc network attach 」まで打った後、Tabキーで補完してみてください。すると、物理インターフェースもしくはBridgeインターフェースしか表示されません。

fake_bridge=trueを指定しなかった場合の出力例
[root@c761 ~]# lxc network attach
eno1       eno3       enp4s16    enp4s16f2  ens1f0     ens2       ovsbr0     
eno2       eno4       enp4s16f1  enp4s16f3  ens1f1     lxdbr0     virbr0

すると、lxcコンテナをovsにアタッチするためには、ovsbr0を選択するしかない状態となってしまいます。
このため、LXCに対して、VLAN Interface 302がBridgeであるということを明示的に認識させる必要があるため、fake_bridge=trueオプションを指定しています。

ちなみに、上記のlxcコマンドでovsbr0を選択した場合、(5)に接続した状態となります。

前述した通り、(5)はFullTrunk状態なので、物理スイッチへトラフィックを流すためには、LXCコンテナ側でVLAN IDを付与する必要があります。

軽量さがメリットであるLXCコンテナで、VLAN IDを付ける設定を実施することは、そもそも使い方が間違っている気がしました。*6

このため、

  • KVM:(4)の通り、PortGroupで所属するVLANを決定する。もしくは、(5)の通り、untagにして仮想マシン側でVLAN IDを付与する。
  • LXC/LXD:(12)(13)に記載の通り、fake bridgeで所属するVLANを決定する。

という使い方が適しているのではないかと考えています。

12.補足2:ovs上での見え方

Guest1と2を起動すると、ovs上では以下のように見えます。

[root@c761 ~]# ovs-vsctl show
b1d3d75a-2c4c-49e7-bc33-06e44a70dfe2
    Bridge "ovsbr0"
        Port "ovsbr0"
            Interface "ovsbr0"
                type: internal
        Port "vnet0"
            tag: 300
            Interface "vnet0"
        Port "vnet1"
            Interface "vnet1"
        Port "bond0"
            trunks: [11, 300, 301, 302]
            Interface "ens1f1"
            Interface "ens1f0"
    ovs_version: "2.10.1"

また、今回LCAPを使用しましたが、LCAPの状態を確認する場合は、以下のコマンドで可能です。

ovs-appctl bond/show bond0
ovs-vsctl list port bond0

出力例
[root@c761 ~]# ovs-appctl bond/show bond0
---- bond0 ----
bond_mode: balance-tcp
bond may use recirculation: yes, Recirc-ID : 2
bond-hash-basis: 0
updelay: 0 ms
downdelay: 0 ms
next rebalance: 2115 ms
lacp_status: negotiated
lacp_fallback_ab: false
active slave mac: 90:e2:ba:0b:37:b9(ens1f1)

slave ens1f0: enabled
  may_enable: true

slave ens1f1: enabled
  active slave
  may_enable: true

[root@c761 ~]# ovs-vsctl list port bond0
_uuid               : 85d6d0bb-1b9d-44b0-964c-b83d60451aab
bond_active_slave   : "90:e2:ba:0b:37:b9"
bond_downdelay      : 0
bond_fake_iface     : false
bond_mode           : balance-tcp
bond_updelay        : 0
cvlans              : 
external_ids        : {}
fake_bridge         : false
interfaces          : [a102fd00-be8d-402b-b9f3-1ae3cf3aeb64, cffbeb94-2ab5-453e-832c-ac63c86e5d8a]
lacp                : active
mac                 : 
name                : "bond0"
other_config        : {lacp-time=fast}
protected           : false
qos                 : 
rstp_statistics     : {}
rstp_status         : {}
statistics          : {}
status              : {}
tag                 : 
trunks              : [11, 300, 301, 302]
vlan_mode           : trunk

以上です。

13.最後に

以下のサイトを参考にさせて頂きました。
Open vSwitch
Using VLANs with OVS and libvirt - Scott's Weblog - The weblog of an IT pro focusing on cloud computing, Kubernetes, Linux, containers, and networking
Tag Vlan on Veth to Openvswitch bridge · Issue #3414 · lxc/lxd · GitHub


ovsは、最初は取っ付き難かったのですが、触ってみると意外と楽しかったです。
また、LinuxBridgeと異なる点として、Port(Interface)やBond、VLANの概念がBridgeの中に集約されている(ように見える)ので、よりスイッチっぽいかな?と。
ovsはVxLANのVTEPを作ったり、OpenFlowが使えたりと色々遊べるのですが、まずはLinuxBridgeからの移行で最低限必要な機能は網羅できたかなと思います。

次のステップとして、DPDKを実装したいと考えています。

*1:手前味噌ですが、私はovsに一本化しようと思いました。

*2:ネットワークエンジニアという職業柄、意図しないループが怖いため、TrunkするVLANはなるべく絞りたい派です。

*3:/etc/sysconfig/network-scripts/配下のパス

*4:ovsnw.xml上に、tag id='11,300-302'などと記載すれば、できそうな気がしていますが、libvirt側の話題になるため、また別の機会に確認したいと思います。

*5:宛先MACアドレスMACアドレステーブルを照合し、受信したEtherフレームを然るべきポートへ転送する動作のこと

*6:もちろん、ケースバイケースで充分な議論をする余地はあるかと思います。