このシナリオでは、 OpenStack Networking サービスの ML2 プラグインと Open vSwitch (OVS) を使ったクラシック実装について説明します。
クラシック実装は、一般ユーザー (非特権ユーザー) がプロジェクト内の仮想ネットワークを管理する方法を提供し、セルフサービスによる仮想データセンター基盤のネットワーク部分を構成します。以下のようなコンポーネントがあります。
プロジェクト (テナント) ネットワーク
プロジェクトネットワークは、特定のプロジェクトのインスタンスに対して接続性を提供します。一般ユーザー (非特権ユーザー) は、管理者やオペレーターが定義した範囲内でプロジェクトネットワークを管理できます。プロジェクトネットワークは VLAN, GRE, VXLAN を転送方式として使用できますが、管理者が割り当てた内容によって変わります。一般的には、プロジェクトネットワークはプライベート IP アドレスの範囲 (RFC1918) を使用し、インターネットなどの外部ネットワークへの接続性はありません。 Networking では、プロジェクトネットワークの IP アドレスは Fixed (固定) IP アドレスと呼ばれます。
外部ネットワーク
外部ネットワークは、インターネットなどの外部ネットワークへの接続性を提供します。外部ネットワークは物理ネットワーク基盤とやり取りを行うので、管理者ユーザー (特権ユーザー) だけが外部ネットワークを管理できます。外部ネットワークには、物理ネットワーク基盤に応じて、フラットか VLAN を転送方式を使用できます。一般的には、パブリック IP アドレスの範囲を外部ネットワークでは使用します。
注釈
フラットネットワークは本質的にタグなし VLAN、つまり素のネットワークを使います。物理ネットワークのレイヤー 2 の性質と同様、 1 つの外部ブリッジには 1 つのフラットネットワークだけを接続できます。ほとんどの場合、本番環境では外部ネットワークに VLAN 転送方式を使用すべきでしょう。
ルーター
ルーターは通常プロジェクトネットワークと外部ネットワークを接続します。デフォルトでは、ルーターは SNAT を実装し、プロジェクトネットワーク上のインスタンスに対して外部への接続性を提供します。各ルーターは SNAT 用に外部ネットワークに割り当てられた IP アドレスの 1 つを使用します。ルーターは DNAT を使って、プロジェクトネットワーク上のインスタンスへの外部からの接続性を Floating IP アドレスとして提供します。ルーターは、同じプロジェクトに所属するプロジェクトネットワーク間の接続も行います。
補助サービス
補助サービスとして DHCP やメタデータがあります。 DHCP サービスは、プロジェクトネットワーク上のインスタンスの IP アドレスを管理します。メタデータサービスは、プロジェクトネットワーク上のインスタンスが SSH 鍵などのメタデータを取得する API を提供します。
設定例では、フラット外部ネットワーク 1 つと VXLAN のプロジェクト (テナント) ネットワーク 1 つを作成しますが、この設定は VLAN 外部ネットワーク、VLAN プロジェクトネットワーク、GRE プロジェクトネットワークにも対応しています。
この前提は、このシナリオをデプロイするのに必要な最低限の物理インフラと直接の OpenStack サービスの依存関係を記載しています。例えば、Networking サービスは Identity サービスに直接依存しており、Compute サービスは Networking サービスに直接依存しています。 Networking サービスは Image サービスに直接は依存していないので、これらの依存関係には Image サービスなどのサービスは含まれていません。 しかしながら、 Compute サービスはインスタンスを起動するために Image サービスに依存しています。このシナリオの設定例では、 Networking サービスコンポーネントの基本的な設定に関する知識を前提にしています。
1 台のコントローラーノード。ネットワークインターフェースは management の 1 つ。
1 台のネットワークノード。ネットワークインターフェースは 4 つ: 管理ネットワーク, プロジェクトトンネルネットワーク、 VLAN プロジェクトネットワーク、外部ネットワーク (通常はインターネット)。 Open vSwitch ブリッジ br-vlan は VLAN インターフェースのポートを持ち、 Open vSwitch ブリッジ br-ex は外部インターフェースのポートを持っている必要があります。
最低 1 台のコンピュートノード。ネットワークインターフェースは 3 つ: 管理ネットワーク, プロジェクトトンネルネットワーク、 VLAN プロジェクトネットワーク。Open vSwitch ブリッジ br-vlan は VLAN インターフェースのポートを持っている必要があります。
ネットワークトラフィックの流れを理解しやすくため、ネットワークノードとコンピュートノードは VLAN プロジェクトネットワーク用に別のネットワークインターフェースを使っています。本番環境では、VLAN プロジェクトネットワークは、ネットワークインターフェースにアクセスするのに任意の Open vSwitch ブリッジを使用できます。例えば、 br-tun ブリッジなど。
設定例では、管理ネットワークは 10.0.0.0/24、トンネルネットワークは 10.0.1.0/24、外部ネットワークは 203.0.113.0/24 を使用します。 VLAN ネットワークはレイヤー 2 の接続性のみを扱うので IP アドレス範囲は必要ありません。
注釈
VLAN 外部ネットワークと VLAN プロジェクトネットワークでは、物理ネットワーク基盤は VLAN タグに対応していなければいけません。 VXLAN や GRE プロジェクトネットワークで最大限の性能を得るには、ネットワーク基盤はジャンボフレームをサポートしている必要があるでしょう。
警告
Linux ディストリビューションではしばしば古いリリースの Open vSwitch がパッケージ化されており、 Networking サービスと組み合わせて動作させた際に問題が起こることがあります。最良の性能が得られ、かつ Open vSwitch のサポートが得られるよう、最新の LTS (長期間サポート) の安定版の Open vSwitch を使用することをお薦めします。利用可能なリリースについては http://www.openvswitch.org を参照してください。様々なディストリビューションで、新しいリリースをソースからビルドする方法については インストール手順 <https://github.com/openvswitch/ovs/blob/master/INSTALL.md> を参照してください。
VXLAN ネットワークを作成するには Linux カーネル 3.13 以降が必要です。
neutron データベースがある SQL サーバーと neutron.conf ファイルの適切な設定。
メッセージキューサービスと neutron.conf ファイルの適切な設定。
OpenStack Identity サービスと neutron.conf ファイルの適切な設定。
OpenStack Compute コントローラー/管理サービスと nova.conf ファイルの適切な設定。
Neutron サーバーサービス、ML2 プラグインと依存サービス。
OpenStack Identity サービスと neutron.conf ファイルの適切な設定。
Open vSwitch サービス、 Open vSwitch エージェント、L3 エージェント、 DHCP エージェント、メタデータエージェントと依存サービス。
OpenStack Identity サービスと neutron.conf ファイルの適切な設定。
OpenStack Compute コントローラー/管理サービスと nova.conf ファイルの適切な設定。
Open vSwitch サービス、 Open vSwitch エージェントと依存サービス。
クラシックアーキテクチャーは、基本的な仮想ネットワーク基盤を提供します。プロジェクトネットワークや外部ネットワーク間のルーティングはすべてのネットワークノードを経由します。他のアーキテクチャーよりも簡単にデプロイできますが、すべての機能をネットワークノードに置くのは、単一障害点ができますし、潜在的な性能問題につながります。冗長性を持たせ、性能を向上させるため、本番環境では DVR や L3 HA アーキテクチャーの採用を検討してください。
ネットワークノードは、以下のネットワークコンポーネントを持ちます。
Open vSwitch エージェント。仮想スイッチ、仮想スイッチ間の接続性、および仮想ポート経由での名前空間、 Linux ブリッジ、物理インターフェースなどの他のネットワークコンポーネントとのやり取りを管理します。
DHCP エージェント。qdhcp 名前空間を管理します。 qdhcp 名前空間はプロジェクトネットワークを使用するインスタンスに対して DHCP サービスを提供します。
L3 エージェント。 qrouter 名前空間を管理します。 qrouter 名前空間は、プロジェクトネットワークと外部ネットワーク間、プロジェクトネットワーク同士のルーティングを提供します。 qrouter 名前空間は、インスタンスとメタデータエージェント間のメタデータトラフィックのルーティングも行います。
メタデータエージェント。インスタンスに対してメタデータ操作を扱います。
コンピュートノードは、以下のネットワークコンポーネントを持ちます。
Open vSwitch エージェント。仮想スイッチ、仮想スイッチ間の接続性、および仮想ポート経由での名前空間、 Linux ブリッジ、物理インターフェースなどの他のネットワークコンポーネントとのやり取りを管理します。
Linux ブリッジ。セキュリティーグループを扱います。Open vSwitch と iptables に関する制限のため、Networking サービスは Linux ブリッジを使ってインスタンスのセキュリティーグループの管理を行います。
注釈
north-south ネットワークトラフィックは、インスタンスと外部ネットワーク (通常はインターネット) 間の通信です。 easy-west ネットワークトラフィックは、インスタンス間の通信です。
Fixed IP を持つインスタンスに対して、ネットワークノードはプロジェクトネットワークと外部ネットワーク間の north/south ネットワークトラフィックを転送します。
外部ネットワーク
ネットワーク 203.0.113.0/24
IP アドレス割り当て範囲は 203.0.113.101 から 203.0.113.200 まで
プロジェクトネットワークのルーターインターフェース 203.0.113.101 TR
プロジェクトネットワーク
ネットワーク 192.168.1.0/24
ゲートウェイ 192.168.1.1 (MAC アドレスは TG)
コンピュートノード 1
インスタンス 1 192.168.1.11 (MAC アドレスは I1)
インスタンス 1 はコンピュートノード 1 上にあり、プロジェクトネットワークを使用します。
インスタンスが外部ネットワーク上のホストにパケットを送信します。
以下の手順は、コンピュートノード 1 に関係します。
インスタンス 1 の tap インターフェース (1) はパケットを Linux ブリッジ qbr に転送します。宛先は別のネットワーク上にあるので、パケットの宛先 MAC アドレスは TG です。
Linux ブリッジ qbr 上のセキュリティーグループルール (2) で、このパケットに対する状態追跡 (state tracking) が行われます。
Linux ブリッジ qbr は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワークの内部タグを追加します。
VLAN プロジェクトネットワークの場合:
Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。
Open vSwitch の VLAN ブリッジ br-vlan は、内部タグをプロジェクトネットワークの実際の VLAN タグに置き換えます。
Open vSwitch の VLAN ブリッジ br-vlan は、パケットを VLAN インターフェース経由でネットワークノードに転送します。
VXLAN や GRE プロジェクトネットワークの場合:
Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。
Open vSwitch のトンネルブリッジ br-tun は、 パケットを VXLAN か GRE トンネルでカプセル化し、プロジェクトネットワークを識別するタグを追加します。
Open vSwitch のトンネルブリッジ br-tun は、パケットをトンネルインターフェース経由でネットワークノードに転送します。
以下の手順は、ネットワークノードに関係します。
VLAN プロジェクトネットワークの場合:
VLAN インターフェースは、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。
Open vSwitch の VLAN ブリッジ br-vlan は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワークの実際の VLAN タグを内部タグに置き換えます。
VXLAN や GRE プロジェクトネットワークの場合:
トンネルインターフェースは、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。
Open vSwitch のトンネルブリッジ br-tun は、パケットのカプセル化をほどき、プロジェクトネットワークの内部タグを追加します。
Open vSwitch のトンネルブリッジ br-tun は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、パケットをルーター名前空間 qrouter の qr インターフェース (3) に転送します。 qr インターフェースはプロジェクトネットワークのゲートウェイ IP アドレス TG を持ちます。
iptables サービス (4) は、 qg インターフェース (5) を送信元 IP アドレスとして使ってパケットの SNAT を行います。 qg インターフェースはプロジェクトネットワークのルーターインターフェースの IP アドレス TR を持ちます。
ルーター名前空間 qrouter は、パケットを qg インターフェース経由で Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch の外部ブリッジ br-ex に転送します。
Open vSwitch の外部ブリッジ br-ex は、パケットを外部インターフェース経由で外部ネットワークに転送します。
注釈
戻りのトラフィックは、同様の手順の逆順で処理されます。
Floating IP を持つインスタンスに対して、ネットワークノードはプロジェクトネットワークと外部ネットワーク間の north/south ネットワークトラフィックを転送します。
外部ネットワーク
ネットワーク 203.0.113.0/24
IP アドレス割り当て範囲は 203.0.113.101 から 203.0.113.200 まで
プロジェクトネットワークのルーターインターフェース 203.0.113.101 TR
プロジェクトネットワーク
ネットワーク 192.168.1.0/24
ゲートウェイ 192.168.1.1 (MAC アドレスは TG)
コンピュートノード 1
インスタンス 1 192.168.1.11 (MAC アドレスは I1)、 Floating IP アドレス 203.0.113.102 (F1)
インスタンス 1 はコンピュートノード 1 上にあり、プロジェクトネットワークを使用します。
インスタンスが外部ネットワーク上のホストからパケットを受信します。
以下の手順は、ネットワークノードに関係します。
外部インターフェースは、パケットを Open vSwitch の外部ブリッジ br-ex に転送します。
Open vSwitch の外部ブリッジ br-ex は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジは、パケットをルーター名前空間 qrouter の qg インターフェース (1) に転送します。 qg インターフェースはインスタンス 1 の Floating IP アドレス F1 を持ちます。
iptables サービス (2) は、 qr インターフェース (3) を送信元 IP アドレスとして使ってパケットの DNAT を行います。 qr インターフェースはプロジェクトネットワークのルーターインターフェースの IP アドレス TR1 を持ちます。
ルーター名前空間 qrouter は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワークの内部タグを追加します。
VLAN プロジェクトネットワークの場合:
Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。
Open vSwitch の VLAN ブリッジ br-vlan は、内部タグをプロジェクトネットワークの実際の VLAN タグに置き換えます。
Open vSwitch の VLAN ブリッジ br-vlan は、パケットを VLAN インターフェース経由でコンピュートノードに転送します。
VXLAN や GRE プロジェクトネットワークの場合:
Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。
Open vSwitch のトンネルブリッジ br-tun は、 パケットを VXLAN か GRE トンネルでカプセル化し、プロジェクトネットワークを識別するタグを追加します。
Open vSwitch のトンネルブリッジ br-tun は、パケットをトンネルインターフェース経由でコンピュートノードに転送します。
以下の手順は、コンピュートノード 1 に関係します。
VLAN プロジェクトネットワークの場合:
VLAN インターフェースは、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。
Open vSwitch の VLAN ブリッジ br-vlan は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワークの実際の VLAN タグを内部タグに置き換えます。
VXLAN や GRE プロジェクトネットワークの場合:
トンネルインターフェースは、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。
Open vSwitch のトンネルブリッジ br-tun は、パケットのカプセル化をほどき、プロジェクトネットワークの内部タグを追加します。
Open vSwitch のトンネルブリッジ br-tun は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、パケットを Linux ブリッジ qbr に転送します。
Linux ブリッジ qbr 上のセキュリティーグループルール (4) で、このパケットに対するファイアウォールと状態追跡 (state tracking) が行われます。
Linux ブリッジ qbr は、パケットをインスタンス 1 の tap インターフェース (5) に転送します。
注釈
戻りのトラフィックは、同様の手順の逆順で処理されます。
Fixed IP か Floating IP を持つインスタンスに対して、ネットワークノードは、同じプロジェクトルーターに接続されたプロジェクトネットワーク間の east-west ネットワークトラフィックをルーティングします。
プロジェクトネットワーク 1
ネットワーク: 192.168.1.0/24
ゲートウェイ: 192.168.1.1 (MAC アドレスは TG1)
プロジェクトネットワーク 2
ネットワーク: 192.168.2.0/24
ゲートウェイ: 192.168.2.1 (MAC アドレスは TG2)
コンピュートノード 1
インスタンス 1: 192.168.1.11 (MAC アドレスは I1)
コンピュートノード 2
インスタンス 2: 192.168.2.11 (MAC アドレスは I2)
インスタンス 1 はコンピュートノード 1 上にあり、プロジェクトネットワーク 1 を使用します。
インスタンス 2 はコンピュートノード 2 上にあり、プロジェクトネットワーク 2 を使用します。
両方のプロジェクトネットワークは同じルーター上にあります。
インスタンス 1 がインスタンス 2 にパケットを送信します。
以下の手順は、コンピュートノード 1 に関係します。
インスタンス 1 の tap インターフェース (1) はパケットを Linux ブリッジ qbr に転送します。宛先は別のネットワーク上にあるので、パケットの宛先 MAC アドレスは TG1 です。
Linux ブリッジ qbr 上のセキュリティーグループルール (2) で、このパケットに対する状態追跡 (state tracking) が行われます。
Linux ブリッジ qbr は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワーク 1 の内部タグを追加します。
VLAN プロジェクトネットワークの場合:
Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。
Open vSwitch の VLAN ブリッジ br-vlan は、内部タグをプロジェクトネットワーク 1 の実際の VLAN タグに置き換えます。
Open vSwitch の VLAN ブリッジ br-vlan は、パケットを VLAN インターフェース経由でネットワークノードに転送します。
VXLAN や GRE プロジェクトネットワークの場合:
Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。
Open vSwitch のトンネルブリッジ br-tun は、 パケットを VXLAN か GRE トンネルでカプセル化し、プロジェクトネットワーク 1 を識別するタグを追加します。
Open vSwitch のトンネルブリッジ br-tun は、パケットをトンネルインターフェース経由でネットワークノードに転送します。
以下の手順は、ネットワークノードに関係します。
VLAN プロジェクトネットワークの場合:
VLAN インターフェースは、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。
Open vSwitch の VLAN ブリッジ br-vlan は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワーク 1 の実際の VLAN タグを内部タグに置き換えます。
VXLAN や GRE プロジェクトネットワークの場合:
トンネルインターフェースは、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。
Open vSwitch のトンネルブリッジ br-tun は、パケットのカプセル化をほどき、プロジェクトネットワーク 1 の内部タグを追加します。
Open vSwitch のトンネルブリッジ br-tun は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、パケットをルーター名前空間 qrouter の qr-1 インターフェース (3) に転送します。 qr-1 インターフェースはプロジェクトネットワーク 1 のゲートウェイ IP アドレス TG1 を持ちます。
ルーター名前空間 qrouter は、パケットを qr-2 インターフェース (4) に転送します。 qr-2 インターフェースはプロジェクトネットワーク 2 のゲートウェイ IP アドレス TG2 を持ちます。
ルーター名前空間 qrouter は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワーク 2 の内部タグを追加します。
VLAN プロジェクトネットワークの場合:
Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。
Open vSwitch の VLAN ブリッジ br-vlan は、内部タグをプロジェクトネットワーク 2 の実際の VLAN タグに置き換えます。
Open vSwitch の VLAN ブリッジ br-vlan は、パケットを VLAN インターフェース経由でコンピュートノード 2 に転送します。
VXLAN や GRE プロジェクトネットワークの場合:
Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。
Open vSwitch のトンネルブリッジ br-tun は、 パケットを VXLAN か GRE トンネルでカプセル化し、プロジェクトネットワーク 2 を識別するタグを追加します。
Open vSwitch のトンネルブリッジ br-tun は、パケットをトンネルインターフェース経由でコンピュートノード 2 に転送します。
以下の手順は、コンピュートノード 2 に関係します。
VLAN プロジェクトネットワークの場合:
VLAN インターフェースは、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。
Open vSwitch の VLAN ブリッジ br-vlan は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワーク 2 の実際の VLAN タグを内部タグに置き換えます。
VXLAN や GRE プロジェクトネットワークの場合:
トンネルインターフェースは、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。
Open vSwitch のトンネルブリッジ br-tun は、パケットのカプセル化をほどき、プロジェクトネットワーク 2 の内部タグを追加します。
Open vSwitch のトンネルブリッジ br-tun は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、パケットを Linux ブリッジ qbr に転送します。
Linux ブリッジ qbr 上のセキュリティーグループルール (5) で、このパケットに対するファイアウォールと状態追跡 (state tracking) が行われます。
Linux ブリッジ qbr は、パケットをインスタンス 2 の tap インターフェース (6) に転送します。
注釈
戻りのトラフィックは、同様の手順の逆順で処理されます。
Fixed IP か Floating IP を持つインスタンスに対して、プロジェクトネットワークは、ネットワークノード上のプロジェクトルーターを経由せずに、インスタンス間の east-west ネットワークトラフィックをスイッチングします。
プロジェクトネットワーク
ネットワーク: 192.168.1.0/24
コンピュートノード 1
インスタンス 1: 192.168.1.11 (MAC アドレスは I1)
コンピュートノード 2
インスタンス 2: 192.168.1.12 (MAC アドレスは I2)
インスタンス 1 はコンピュートノード 1 上にあります。
インスタンス 2 はコンピュートノード 2 上にあります。
両方のインスタンスは同じプロジェクトネットワーク上にあります。
インスタンス 1 がインスタンス 2 にパケットを送信します。
Open vSwitch エージェント。プロジェクトネットワーク内のスイッチングを扱います。
以下の手順は、コンピュートノード 1 に関係します。
インスタンス 1 の tap インターフェース (1) はパケットを VLAN ブリッジ qbr に転送します。宛先は同じネットワーク上にあるので、パケットの宛先 MAC アドレスは I2 です。
プロバイダーブリッジ qbr 上のセキュリティーグループルール (2) で、このパケットに対する状態追跡 (state tracking) が行われます。
Linux ブリッジ qbr は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、プロバイダーネットワーク 1 の内部タグを追加します。
VLAN プロジェクトネットワークの場合:
Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。
Open vSwitch の VLAN ブリッジ br-vlan は、内部タグをプロジェクトネットワーク 1 の実際の VLAN タグに置き換えます。
Open vSwitch の VLAN ブリッジ br-vlan は、パケットを VLAN インターフェース経由でコンピュートノード 2 に転送します。
VXLAN や GRE プロジェクトネットワークの場合:
Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。
Open vSwitch のトンネルブリッジ br-tun は、 パケットを VXLAN か GRE トンネルでカプセル化し、プロジェクトネットワーク 1 を識別するタグを追加します。
Open vSwitch のトンネルブリッジ br-tun は、パケットをトンネルインターフェース経由でコンピュートノード 2 に転送します。
以下の手順は、コンピュートノード 2 に関係します。
VLAN プロジェクトネットワークの場合:
VLAN インターフェースは、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。
Open vSwitch の VLAN ブリッジ br-vlan は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワーク 2 の実際の VLAN タグを内部タグに置き換えます。
VXLAN や GRE プロジェクトネットワークの場合:
トンネルインターフェースは、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。
Open vSwitch のトンネルブリッジ br-tun は、パケットのカプセル化をほどき、プロジェクトネットワーク 2 の内部タグを追加します。
Open vSwitch のトンネルブリッジ br-tun は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。
Open vSwitch の統合ブリッジ br-int は、パケットを Linux ブリッジ qbr に転送します。
Linux ブリッジ qbr 上のセキュリティーグループルール (3) で、このパケットに対するファイアウォールと状態追跡 (state tracking) が行われます。
Linux ブリッジ qbr は、パケットをインスタンス 2 の tap インターフェース (4) に転送します。
注釈
戻りのトラフィックは、同様の手順の逆順で処理されます。
以下の設定例を、お使いの環境でこのシナリオをデプロイする際の雛形として使ってください。
共通のオプションを設定します。 /etc/neutron/neutron.conf ファイルを編集します。
[DEFAULT]
verbose = True
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
ML2 プラグインを設定します。/etc/neutron/plugins/ml2/ml2_conf.ini ファイルを編集します。
[ml2]
type_drivers = flat,vlan,gre,vxlan
tenant_network_types = vlan,gre,vxlan
mechanism_drivers = openvswitch,l2population
extension_drivers = port_security
[ml2_type_flat]
flat_networks = external
[ml2_type_vlan]
network_vlan_ranges = external,vlan:MIN_VLAN_ID:MAX_VLAN_ID
[ml2_type_gre]
tunnel_id_ranges = MIN_GRE_ID:MAX_GRE_ID
[ml2_type_vxlan]
vni_ranges = MIN_VXLAN_ID:MAX_VXLAN_ID
[securitygroup]
enable_ipset = True
MIN_VLAN_ID, MAX_VLAN_ID, MIN_GRE_ID, MAX_GRE_ID, MIN_VXLAN_ID, MAX_VXLAN_ID は、お使いの環境に応じた VLAN, GRE, VXLAN ID の最小値、最大値に置き換えてください。
注釈
tenant_network_types` オプションの最初の値は、一般ユーザーがネットワークを作成した際のデフォルトのプロジェクトネットワーク種別になります。
注釈
network_vlan_ranges オプションの external 値に VLAN ID を指定しなければ、管理ユーザーは任意の VLAN ID を使用できます。
以下のサービスを実行します。
共通のオプションを設定します。 /etc/neutron/neutron.conf ファイルを編集します。
[DEFAULT]
verbose = True
Open vSwitch エージェントを設定します。 /etc/neutron/plugins/ml2/openvswitch_agent.ini ファイルを編集します。
[ovs]
local_ip = TUNNEL_INTERFACE_IP_ADDRESS
bridge_mappings = vlan:br-vlan,external:br-ex
[agent]
tunnel_types = gre,vxlan
l2_population = True
prevent_arp_spoofing = True
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_security_group = True
TUNNEL_INTERFACE_IP_ADDRESS は、GRE/VXLAN プロジェクトネットワークを扱うインターフェースの IP アドレスに置き換えます。
L3 エージェントを設定します。/etc/neutron/l3_agent.ini ファイルを編集します。
[DEFAULT]
verbose = True
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
use_namespaces = True
external_network_bridge =
注釈
external_network_bridge オプションには意図的に値を指定していません。
DHCP エージェントを設定します。/etc/neutron/dhcp_agent.ini ファイルを編集します。
[DEFAULT]
verbose = True
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = True
(オプション) VXLAN/GRE プロジェクトネットワークの MTU の縮小
/etc/neutron/dhcp_agent.ini ファイルを編集します。
[DEFAULT]
dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf
/etc/neutron/dnsmasq-neutron.conf ファイルを編集します。
dhcp-option-force=26,1450
メタデータエージェントを設定します。 /etc/neutron/metadata_agent.ini ファイルを編集します。
[DEFAULT]
verbose = True
nova_metadata_ip = controller
metadata_proxy_shared_secret = METADATA_SECRET
METADATA_SECRET を適切な値に置き換えます。
以下のサービスを実行します。
Open vSwitch エージェント
L3 エージェント
DHCP エージェント
メタデータエージェント
共通のオプションを設定します。 /etc/neutron/neutron.conf ファイルを編集します。
[DEFAULT]
verbose = True
Open vSwitch エージェントを設定します。 /etc/neutron/plugins/ml2/openvswitch_agent.ini ファイルを編集します。
[ovs]
local_ip = TUNNEL_INTERFACE_IP_ADDRESS
bridge_mappings = vlan:br-vlan
[agent]
tunnel_types = gre,vxlan
l2_population = True
prevent_arp_spoofing = True
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_security_group = True
TUNNEL_INTERFACE_IP_ADDRESS は、GRE/VXLAN プロジェクトネットワークを扱うインターフェースの IP アドレスに置き換えます。
以下のサービスを実行します。
Open vSwitch エージェント
管理プロジェクトのクレデンシャルを読み込みます。
エージェントの存在と動作を検証します。
$ neutron agent-list
+--------------------------------------+--------------------+----------+-------+----------------+---------------------------+
| id | agent_type | host | alive | admin_state_up | binary |
+--------------------------------------+--------------------+----------+-------+----------------+---------------------------+
| 1eaf6079-41c8-4b5b-876f-73b02753ff57 | Open vSwitch agent | compute1 | :-) | True | neutron-openvswitch-agent |
| 511c27b3-8317-4e27-8a0f-b158e4fb8368 | Metadata agent | network1 | :-) | True | neutron-metadata-agent |
| 7eae11ef-8157-4fd4-a352-bc841cf709f6 | Open vSwitch agent | network1 | :-) | True | neutron-openvswitch-agent |
| a9110ce6-22cc-4f78-9b2e-57f83aac68a3 | Open vSwitch agent | compute2 | :-) | True | neutron-openvswitch-agent |
| c41f3200-8eda-43ab-8135-573e826776d9 | DHCP agent | network1 | :-) | True | neutron-dhcp-agent |
| f897648e-7623-486c-8043-1b219eb2895a | L3 agent | network1 | :-) | True | neutron-l3-agent |
+--------------------------------------+--------------------+----------+-------+----------------+---------------------------+
この例は、フラット外部ネットワーク、VXLAN プロジェクトネットワークを作成します。
管理プロジェクトのクレデンシャルを読み込みます。
外部ネットワークを作成します。
$ neutron net-create ext-net --router:external True \
--provider:physical_network external --provider:network_type flat
Created a new network:
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | True |
| id | e5f9be2f-3332-4f2d-9f4d-7f87a5a7692e |
| name | ext-net |
| provider:network_type | flat |
| provider:physical_network | external |
| provider:segmentation_id | |
| router:external | True |
| shared | False |
| status | ACTIVE |
| subnets | |
| tenant_id | 96393622940e47728b6dcdb2ef405f50 |
+---------------------------+--------------------------------------+
外部ネットワークにサブネットを作成します。
$ neutron subnet-create ext-net --name ext-subnet --allocation-pool \
start=203.0.113.101,end=203.0.113.200 --disable-dhcp \
--gateway 203.0.113.1 203.0.113.0/24
Created a new subnet:
+-------------------+----------------------------------------------------+
| Field | Value |
+-------------------+----------------------------------------------------+
| allocation_pools | {"start": "203.0.113.101", "end": "203.0.113.200"} |
| cidr | 203.0.113.0/24 |
| dns_nameservers | |
| enable_dhcp | False |
| gateway_ip | 203.0.113.1 |
| host_routes | |
| id | cd9c15a1-0a66-4bbe-b1b4-4b7edd936f7a |
| ip_version | 4 |
| ipv6_address_mode | |
| ipv6_ra_mode | |
| name | ext-subnet |
| network_id | e5f9be2f-3332-4f2d-9f4d-7f87a5a7692e |
| tenant_id | 96393622940e47728b6dcdb2ef405f50 |
+-------------------+----------------------------------------------------+
注釈
設定例では、先頭のプロジェクトネットワーク種別は vlan です。管理ユーザーだけが GRE や VXLAN などの他の種別のネットワークを作成できます。以下のコマンドでは、 VXLAN プロジェクトネットワークを作成するのに admin プロジェクトのクレデンシャルを使用しています。
一般プロジェクトの ID を取得します。この例では、 demo プロジェクトを使用しています。
$ openstack project show demo
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Demo Project |
| enabled | True |
| id | 443cd1596b2e46d49965750771ebbfe1 |
| name | demo |
+-------------+----------------------------------+
プロジェクトネットワークを作成します。
$ neutron net-create demo-net --tenant-id 443cd1596b2e46d49965750771ebbfe1 \
--provider:network_type vxlan
Created a new network:
+---------------------------+--------------------------------------+
| Field | Value |
+---------------------------+--------------------------------------+
| admin_state_up | True |
| id | 6e9c5324-68d1-47a8-98d5-8268db955475 |
| name | demo-net |
| provider:network_type | vxlan |
| provider:physical_network | |
| provider:segmentation_id | 1 |
| router:external | False |
| shared | False |
| status | ACTIVE |
| subnets | |
| tenant_id | 443cd1596b2e46d49965750771ebbfe1 |
+---------------------------+--------------------------------------+
通常のプロジェクトの認証情報を読み込みます。 以下の手順では demo プロジェクトを使用します。
プロジェクトネットワークにサブネットを作成します。
$ neutron subnet-create demo-net --name demo-subnet --gateway 192.168.1.1 \
192.168.1.0/24
Created a new subnet:
+-------------------+--------------------------------------------------+
| Field | Value |
+-------------------+--------------------------------------------------+
| allocation_pools | {"start": "192.168.1.2", "end": "192.168.1.254"} |
| cidr | 192.168.1.0/24 |
| dns_nameservers | |
| enable_dhcp | True |
| gateway_ip | 192.168.1.1 |
| host_routes | |
| id | c7b42e58-a2f4-4d63-b199-d266504c03c9 |
| ip_version | 4 |
| ipv6_address_mode | |
| ipv6_ra_mode | |
| name | demo-subnet |
| network_id | 6e9c5324-68d1-47a8-98d5-8268db955475 |
| tenant_id | 443cd1596b2e46d49965750771ebbfe1 |
+-------------------+--------------------------------------------------+
プロジェクトルーターを作成します。
$ neutron router-create demo-router
Created a new router:
+-----------------------+--------------------------------------+
| Field | Value |
+-----------------------+--------------------------------------+
| admin_state_up | True |
| external_gateway_info | |
| id | 474a5b1f-d64c-4db9-b3b2-8ae9bb1b5970 |
| name | demo-router |
| routes | |
| status | ACTIVE |
| tenant_id | 443cd1596b2e46d49965750771ebbfe1 |
+-----------------------+--------------------------------------+
プロジェクトサブネットをルーターにインターフェースとして接続します。
$ neutron router-interface-add demo-router demo-subnet
Added interface 0fa57069-29fd-4795-87b7-c123829137e9 to router demo-router.
ルーターに外部ネットワークへのゲートウェイを追加します。
$ neutron router-gateway-set demo-router ext-net
Set gateway for router demo-router
ネットワークノードにおいて、qrouter と qdhcp 名前空間が作成されていることを確認します。
$ ip netns
qrouter-4d7928a0-4a3c-4b99-b01b-97da2f97e279
qdhcp-353f5937-a2d3-41ba-8225-fa1af2538141
注釈
インスタンスを起動するまでは qdhcp 名前空間は存在しない場合があります。
プロジェクトネットワークのルーターの外部ネットワーク側のゲートウェイ IP アドレスを調べます。通常は、外部ネットワークのサブネット IP 割り当て範囲の中で最小の IP アドレスです。
$ neutron router-port-list demo-router
+--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+
| id | name | mac_address | fixed_ips |
+--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+
| b1a894fd-aee8-475c-9262-4342afdc1b58 | | fa:16:3e:c1:20:55 | {"subnet_id": "c7b42e58-a2f4-4d63-b199-d266504c03c9", "ip_address": "192.168.1.1"} |
| ff5f93c6-3760-4902-a401-af78ff61ce99 | | fa:16:3e:54:d7:8c | {"subnet_id": "cd9c15a1-0a66-4bbe-b1b4-4b7edd936f7a", "ip_address": "203.0.113.101"} |
+--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+
コントローラーノードか外部ネットワークにアクセスできるホストから、プロジェクトルーターの外部ネットワーク側のゲートウェイ IP アドレスに ping を行います。
$ ping -c 4 203.0.113.101
PING 203.0.113.101 (203.0.113.101) 56(84) bytes of data.
64 bytes from 203.0.113.101: icmp_req=1 ttl=64 time=0.619 ms
64 bytes from 203.0.113.101: icmp_req=2 ttl=64 time=0.189 ms
64 bytes from 203.0.113.101: icmp_req=3 ttl=64 time=0.165 ms
64 bytes from 203.0.113.101: icmp_req=4 ttl=64 time=0.216 ms
--- 203.0.113.101 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.165/0.297/0.619/0.187 ms
通常のプロジェクトの認証情報を読み込みます。 以下の手順では demo プロジェクトを使用します。
プロジェクトネットワークに接続されたインタフェースを持つインスタンスを起動します。
インスタンスへのコンソールアクセスを取得します。
プロジェクトルーターへの接続性を確認します。
$ ping -c 4 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_req=1 ttl=64 time=0.357 ms
64 bytes from 192.168.1.1: icmp_req=2 ttl=64 time=0.473 ms
64 bytes from 192.168.1.1: icmp_req=3 ttl=64 time=0.504 ms
64 bytes from 192.168.1.1: icmp_req=4 ttl=64 time=0.470 ms
--- 192.168.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2998ms
rtt min/avg/max/mdev = 0.357/0.451/0.504/0.055 ms
インターネットへの接続性を確認します。
$ ping -c 4 openstack.org
PING openstack.org (174.143.194.225) 56(84) bytes of data.
64 bytes from 174.143.194.225: icmp_req=1 ttl=53 time=17.4 ms
64 bytes from 174.143.194.225: icmp_req=2 ttl=53 time=17.5 ms
64 bytes from 174.143.194.225: icmp_req=3 ttl=53 time=17.7 ms
64 bytes from 174.143.194.225: icmp_req=4 ttl=53 time=17.5 ms
--- openstack.org ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 17.431/17.575/17.734/0.143 ms
適切なセキュリティーグループを作成し、インスタンスへの ping と SSH を許可します。例えば以下のようにします。
$ nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range | Source Group |
+-------------+-----------+---------+-----------+--------------+
| icmp | -1 | -1 | 0.0.0.0/0 | |
+-------------+-----------+---------+-----------+--------------+
$ nova secgroup-add-rule default tcp 22 22 0.0.0.0/0
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range | Source Group |
+-------------+-----------+---------+-----------+--------------+
| tcp | 22 | 22 | 0.0.0.0/0 | |
+-------------+-----------+---------+-----------+--------------+
外部ネットワークに Floating IP アドレスを作成します。
$ neutron floatingip-create ext-net
+---------------------+--------------------------------------+
| Field | Value |
+---------------------+--------------------------------------+
| fixed_ip_address | |
| floating_ip_address | 203.0.113.102 |
| floating_network_id | e5f9be2f-3332-4f2d-9f4d-7f87a5a7692e |
| id | 77cf2a36-6c90-4941-8e62-d48a585de050 |
| port_id | |
| router_id | |
| status | DOWN |
| tenant_id | 443cd1596b2e46d49965750771ebbfe1 |
+---------------------+--------------------------------------+
Floating IP アドレスをインスタンスに関連付けます。
$ nova floating-ip-associate demo-instance1 203.0.113.102
インスタンスに Floating IP アドレスが追加されていることを確認します。
$ nova list
+--------------------------------------+----------------+--------+------------+-------------+-----------------------------------------+
| ID | Name | Status | Task State | Power State | Networks |
+--------------------------------------+----------------+--------+------------+-------------+-----------------------------------------+
| 05682b91-81a1-464c-8f40-8b3da7ee92c5 | demo-instance1 | ACTIVE | - | Running | demo-net=192.168.1.3, 203.0.113.102 |
+--------------------------------------+----------------+--------+------------+-------------+-----------------------------------------+
コントローラーノードか外部ネットワークにアクセスできるホストから、インスタンスに関連付けられた Floating IP アドレスに ping を行います。
$ ping -c 4 203.0.113.102
PING 203.0.113.102 (203.0.113.112) 56(84) bytes of data.
64 bytes from 203.0.113.102: icmp_req=1 ttl=63 time=3.18 ms
64 bytes from 203.0.113.102: icmp_req=2 ttl=63 time=0.981 ms
64 bytes from 203.0.113.102: icmp_req=3 ttl=63 time=1.06 ms
64 bytes from 203.0.113.102: icmp_req=4 ttl=63 time=0.929 ms
--- 203.0.113.102 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 0.929/1.539/3.183/0.951 ms
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.