OpenStackにおけるLinux Bridgeを用いたプロバイダーネットワークの構築とアーキテクチャ

プロバイダーネットワークの概要

OpenStack Networking (Neutron) において、ML2プラグインとLinux Bridgeメカニズムドライバーを組み合わせることで、プロバイダーネットワークを構築できます。このアーキテクチャは、柔軟性を一部犠牲にする代わりに、シンプルさ、高いパフォーマンス、そして信頼性をもたらします。

プロバイダーネットワークはレイヤー2(L2)の接続性のみを扱うため、固定IPやFloating IPの概念が存在しません。また、物理ネットワークインフラの事前設定に依存するため、作成と管理はクラウド管理者のみに制限されます。従来の「nova-network」からの移行や、既存の物理L2/L3インフラを最大限活用したい環境において、このミニマルな構成は非常に有効です。OpenStackのソフトウェアコンポーネントがL3ルーティングを処理するオーバーヘッドを回避し、ハードウェアルーターにルーティングをオフロードすることで、ネットワーク全体の信頼性が向上します。

インフラストラクチャとコンポーネント

本構成では、コントローラーノードとコンピュートノードの両方に、管理用とプロバイダー用の2つのネットワークインターフェースが必要です。プロバイダーインターフェースは、外部ネットワーク(インターネットなど)に接続される物理スイッチに直接接続されます。

コントローラーノードの役割

  • Linux Bridge Agent: 仮想スイッチ間の接続を管理し、名前空間や物理インターフェースとの連携を担います。
  • DHCP Agent: qdhcp 名前空間を管理し、プロバイダーネットワークに接続されたインスタンスへIPアドレスを払い出します。
  • Neutron Server および ML2プラグイン: APIリクエストの処理とネットワークモデルの管理を行います。

コンピュートノードの役割

  • Linux Bridge Agent: 仮想マシン(インスタンス)のtapインターフェースと物理インターフェース間のブリッジングを処理します。
  • セキュリティグループ: iptablesベースのファイアウォールルールを適用し、パケットのステートフルな追跡とフィルタリングを実行します。

通信フローのメカニズム

プロバイダーネットワーク環境では、物理スイッチとルーターがトラフィックの転送とルーティングを主導します。

ノースサウス通信(外部ネットワークとの通信)

インスタンスからインターネットへのパケットは、以下の経路を辿ります。

  1. インスタンスのtapインターフェースから、Linux Bridge(qbr)へパケットが送られます。
  2. qbr ブリッジ上でセキュリティグループによるファイアウォール検査が行われます。
  3. パケットは論理VLANインターフェース(例: ens224.200)へ転送されます。
  4. 物理インターフェースを経由してデータセンターの物理ネットワークへ送出されます。
  5. 物理スイッチがVLANタグを処理し、ハードウェアルーターが外部ネットワークへのL3ルーティングを実行します。

同一ネットワーク内のイーストウエスト通信

同じVLANプロバイダーネットワークに属する異なるコンピュートノード上のインスタンス間通信は、物理スイッチによるL2転送のみで完結します。パケットは送信元ノードの物理インターフェースからスイッチへ渡り、MACアドレステーブルに基づいて宛先ノードの物理インターフェースへ直接転送されます。

異なるネットワーク間のイーストウエスト通信

異なるプロバイダーネットワーク(例: VLAN 200 と VLAN 300)間の通信は、物理ルーターに依存します。パケットは一旦物理ルーターに到達し、L3ルーティング処理を経て、宛先VLANとしてコンピュートノードへ戻されます。

ノードの構成手順

以下は、プロバイダーネットワークを動作させるための最小限の設定例です。

カーネルパラメータの最適化

すべてのノード(コントローラーおよびコンピュート)で、逆パスフィルタリングを無効化します。/etc/sysctl.conf に以下を追加し、sysctl -p を実行します。

net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0

Neutron 共通設定

/etc/neutron/neutron.conf を編集し、コアプラグインを指定します。プロバイダーネットワークのみを使用する場合、L3ルーター等のサービスプラグインは不要です。

[DEFAULT]
core_plugin = ml2
service_plugins =

ML2プラグインとLinux Bridgeエージェントの設定

/etc/neutron/plugins/ml2/ml2_conf.ini を構成します。テナントネットワーク(オーバーレイネットワーク)は無効化し、物理インターフェース ens224 をプロバイダーネットワークにマッピングします。

[ml2]
type_drivers = vlan,flat
tenant_network_types =
mechanism_drivers = linuxbridge

[ml2_type_vlan]
network_vlan_ranges = provider

[linux_bridge]
physical_interface_mappings = provider:ens224

[vxlan]
enable_vxlan = False

[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
enable_security_group = True

DHCPエージェントの設定(コントローラーのみ)

/etc/neutron/dhcp_agent.ini を設定し、Dnsmasqドライバーを使用するようにします。

[DEFAULT]
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
dhcp_delete_namespaces = True

ネットワークリソースの作成と検証

最新のOpenStackクライアント(openstack コマンド)を使用して、VLANプロバイダーネットワークを構築します。

ネットワークとサブネットの作成

VLAN ID 200 を持つ共有プロバイダーネットワークを作成します。

$ openstack network create --share \
  --provider-physical-network provider \
  --provider-network-type vlan \
  --provider-segment 200 \
  ext-vlan-200

$ openstack subnet create --network ext-vlan-200 \
  --subnet-range 198.18.10.0/24 \
  --gateway 198.18.10.1 \
  --allocation-pool start=198.18.10.10,end=198.18.10.200 \
  ext-subnet-200

エージェント状態の確認

各ノードでLinux Bridgeエージェントが正常に稼働していることを確認します。

$ openstack network agent list
+--------------------------------------+--------------------+--------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host         | Alive | State | Binary                    |
+--------------------------------------+--------------------+--------------+-------+-------+---------------------------+
| a1b2c3d4-e5f6-7890-abcd-ef1234567890 | Linux bridge agent | compute-01   | :-)   | UP    | neutron-linuxbridge-agent |
| b2c3d4e5-f6a7-8901-bcde-f12345678901 | Linux bridge agent | controller   | :-)   | UP    | neutron-linuxbridge-agent |
| c3d4e5f6-a7b8-9012-cdef-123456789012 | DHCP agent         | controller   | :-)   | UP    | neutron-dhcp-agent        |
+--------------------------------------+--------------------+--------------+-------+-------+---------------------------+

コントローラーノード上で ip netns コマンドを実行すると、作成したネットワークに対応する qdhcp-* 名前空間が確認できます。

セキュリティグループとインスタンスの起動

ICMPとSSHトラフィックを許可するルールをデフォルトセキュリティグループに追加します。

$ openstack security group rule create --proto icmp default
$ openstack security group rule create --proto tcp --dst-port 22 default

作成したプロバイダーネットワークに接続するテスト用インスタンスを起動します。

$ openstack server create --flavor m1.small \
  --image cirros-0.5.2-x86_64-disk \
  --network ext-vlan-200 \
  test-instance-01

接続性のテスト

インスタンスに割り当てられたIPアドレス(例: 198.18.10.15)に対して、物理ネットワークに接続された任意のホストからPingを実行し、L2接続性と外部ルーティングの動作をテストします。

$ ping -c 4 198.18.10.15
PING 198.18.10.15 (198.18.10.15) 56(84) bytes of data.
64 bytes from 198.18.10.15: icmp_seq=1 ttl=64 time=1.24 ms
64 bytes from 198.18.10.15: icmp_seq=2 ttl=64 time=0.85 ms
64 bytes from 198.18.10.15: icmp_seq=3 ttl=64 time=0.91 ms
64 bytes from 198.18.10.15: icmp_seq=4 ttl=64 time=1.02 ms

--- 198.18.10.15 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 0.850/1.005/1.240/0.145 ms

インスタンスへSSHログイン後、外部ドメインに対するPingテストを実行することで、物理ルーターを経由したノースサウス通信が確立されていることを最終確認します。

$ ping -c 4 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=115 time=14.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=115 time=14.1 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=115 time=14.3 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=115 time=14.0 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms

タグ: OpenStack Neutron Linux Bridge ML2 プロバイダーネットワーク

8月22日 11:45 投稿