openstack

OpenStack の Quantum + Open vSwitch でVLAN構成を試してみた

More than 5 years have passed since last update.

概要

 OpenStack(Folsom) において、Quantum と Open vSwitch を使って "tenant_network_type = vlan" の構成を組むと、各ノードにどのような形で仮想インタフェースやブリッジが構成されるのか知りたかったので、調査しました。

 仮想インスタンス群で、下記のような論理構成を組む意図で、

  • 3つのVLANを用意する。
    • そのうち、仮想インスタンス用には2つを使用する。
    • 1つは、OpenStackの管理ネットワークとして使用する。
  • 上記のVLANは一つの物理インタフェースに共存する。
    • 実際には、インタフェースを物理的に分けるのが好ましいが、試験環境の都合のため。

という前提で、L3 Agent を除いた構成を確認しました。

論理構成

詳細

 仮に上図のVLAN-Xを VLAN-ID:50、VLAN-Yを VLAN-ID:40、OpenStackの管理用ネットワークをVLAN-ID:30とします。
 Network Node では、

  • Quantum の Open vSwitch Agent
  • Quantum Server
  • DHCP Agent

を動作させます。

 Compute Node では、

  • Nova Compute
  • Quantum の Open vSwitch Agent

を動作させます。

1.初期状態

Network Node

br-* は、ovs-vsctl add-br で手動で作成する必要があります。
Netowrk Node:初期状態

Compute Node

br-* は、ovs-vsctl add-br で手動で作成する必要があります。
Compute Node:初期状態

2.片方のネットワーク(VLAN:40)のみに繋ぐ仮想インスタンスを作成

 1.の状態で、VLAN:40のネットワークを紐付けたインスタンスの作成指示を発行すると、下記のように変化します。

Network Node

 quantum-plugin-openvswitch-agent によって、以下の作業が実施されます。

  • br-int と br-eth0 をつなぐための、veth: int-br-eth0 <-> phy-br-eth0 を作成する。
  • int-br-eth0 を br-int に add port する。
    • int-br-eth0 -> br-int の flow に「VLAN-ID:40だったらVLAN-ID:1 に変換する」ルールを定義する。
  • phy-br-eth0 を br-eth0 に add port する。
    • phy-br-eth0 -> br-eth0 の flow に「VLAN-ID:1だったらVLAN-ID:40 に変換する」ルールを定義する。

 DHCP Agent によって、以下の作業が実施されます。

  • tap*を作成して、VLAN-ID:1 で br-int に add port する。
  • tap* に対して、VLAN-ID:40 用のネットワークの設定を与えた dnsmasq を起動する。

Netowrk Node:SingleNic インスタンス作成後

Compute Node

 quantum-plugin-openvswitch-agent によって、以下の作業が実施されます。

  • br-int と br-eth0 をつなぐための、veth: int-br-eth0 <-> phy-br-eth0 を作成する。
  • int-br-eth0 を br-int に add port する。
    • int-br-eth0 -> br-int の flow に「VLAN-ID:40だったらVLAN-ID:1 に変換する」ルールを定義する。
  • phy-br-eth0 を br-eth0 に add port する。
    • phy-br-eth0 -> br-eth0 の flow に「VLAN-ID:1だったらVLAN-ID:40 に変換する」ルールを定義する。

nova-compute によって、以下の作業が実施されます。

  • Linux Bridge: qbr* を作成する。
  • qbr* を br-int と接続するための、veth: qvb <->qbo を作成する。
    • qvb* を qbr* に add port する。
    • qvo* を br-int に VLAN-ID:1 で add port する。
  • Tap Device: vnet*を 作成する。
    • vnet* を qbr* に add port する。
  • 上記の tap* に紐付けた VM を起動する。

これにより、VM が VLAN-ID:40 に所属し、dnsmasq の提供する DHCP サーバから、IPアドレスを取得します。

Compute Node:SingleNic インスタンス作成後

3.両方のネットワーク(VLAN:40, 50)に繋ぐMultiNic仮想インスタンスを作成

2.の状態で、VLAN-ID:40 と VLAN-ID:50 を紐付けたインスタンスの作成指示を発行すると、下記のように変化します。

Network Node

 quantum-plugin-openvswitch-agent によって、以下の作業が実施される。

  • int-br-eth0 -> br-int の flow に「VLAN-ID:50だったらVLAN-ID:2 に変換する」ルールを定義する。
  • phy-br-eth0 -> br-eth0 の flow に「VLAN-ID:2だったらVLAN-ID:50 に変換する」ルールを定義する。

 DHCP Agent によって、以下の作業が実施される。

  • tap*を作成して、VLAN-ID:2 で br-int にadd port する。
  • tap* に対して、VLAN-ID:50 用のネットワークの設定を与えた dnsmasq を起動する。

Netowrk Node:MultiNic インスタンス作成後

Compute Node

 quantum-plugin-openvswitch-agent によって、以下の作業が実施される。

  • int-br-eth0 -> br-int の flow に「VLAN-ID:50だったらVLAN-ID:2 に変換する」ルールを定義する。
  • phy-br-eth0 -> br-eth0 の flow に「VLAN-ID:2だったらVLAN-ID:50 に変換する」ルールを定義する。

 nova-compute によって、以下の作業が実施されます。

  • Linux Bridge: qbr* を作成する。
  • qbr* を br-int と接続するための、veth: qvb <->qbo を作成する。
    • qvb* を qbr* に add port する。
    • qvo* を br-int に VLAN-ID:1 で add port する。
  • Tap Device: vnet*を作成する。
    • vnet* を qbr* に add port する。
  • 上記の手順をVLAN-ID:2 についても行う。
  • 上記のtap*に紐付けたVMを起動する。

これにより、VMがVLAN-ID:40, 50に所属し、DHCPによって、管理ノードのdnsmasqからIPアドレスを取得します。

Compute Node:MultiNic インスタンス作成後

このようにして、仮想インスタンス間で始めに示したような論理ネットワークを構成できます。