シナリオ: Open vSwitch を使った基本構成

シナリオ: Open vSwitch を使った基本構成

このシナリオでは、 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. 1 台のコントローラーノード。ネットワークインターフェースは management の 1 つ。

  2. 1 台のネットワークノード。ネットワークインターフェースは 4 つ: 管理ネットワーク, プロジェクトトンネルネットワーク、 VLAN プロジェクトネットワーク、外部ネットワーク (通常はインターネット)。 Open vSwitch ブリッジ br-vlan は VLAN インターフェースのポートを持ち、 Open vSwitch ブリッジ br-ex は外部インターフェースのポートを持っている必要があります。

  3. 最低 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 アドレス範囲は必要ありません。

Hardware layout Network layout Service layout

注釈

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 以降が必要です。

OpenStack サービス - コントローラーノード

  1. neutron データベースがある SQL サーバーと neutron.conf ファイルの適切な設定。

  2. メッセージキューサービスと neutron.conf ファイルの適切な設定。

  3. OpenStack Identity サービスと neutron.conf ファイルの適切な設定。

  4. OpenStack Compute コントローラー/管理サービスと nova.conf ファイルの適切な設定。

  5. Neutron サーバーサービス、ML2 プラグインと依存サービス。

OpenStack サービス - ネットワークノード

  1. OpenStack Identity サービスと neutron.conf ファイルの適切な設定。

  2. Open vSwitch サービス、 Open vSwitch エージェント、L3 エージェント、 DHCP エージェント、メタデータエージェントと依存サービス。

OpenStack サービス - コンピュートノード

  1. OpenStack Identity サービスと neutron.conf ファイルの適切な設定。

  2. OpenStack Compute コントローラー/管理サービスと nova.conf ファイルの適切な設定。

  3. Open vSwitch サービス、 Open vSwitch エージェントと依存サービス。

アーキテクチャー

クラシックアーキテクチャーは、基本的な仮想ネットワーク基盤を提供します。プロジェクトネットワークや外部ネットワーク間のルーティングはすべてのネットワークノードを経由します。他のアーキテクチャーよりも簡単にデプロイできますが、すべての機能をネットワークノードに置くのは、単一障害点ができますし、潜在的な性能問題につながります。冗長性を持たせ、性能を向上させるため、本番環境では DVR や L3 HA アーキテクチャーの採用を検討してください。

Architecture overview

ネットワークノードは、以下のネットワークコンポーネントを持ちます。

  1. Open vSwitch エージェント。仮想スイッチ、仮想スイッチ間の接続性、および仮想ポート経由での名前空間、 Linux ブリッジ、物理インターフェースなどの他のネットワークコンポーネントとのやり取りを管理します。

  2. DHCP エージェント。qdhcp 名前空間を管理します。 qdhcp 名前空間はプロジェクトネットワークを使用するインスタンスに対して DHCP サービスを提供します。

  3. L3 エージェント。 qrouter 名前空間を管理します。 qrouter 名前空間は、プロジェクトネットワークと外部ネットワーク間、プロジェクトネットワーク同士のルーティングを提供します。 qrouter 名前空間は、インスタンスとメタデータエージェント間のメタデータトラフィックのルーティングも行います。

  4. メタデータエージェント。インスタンスに対してメタデータ操作を扱います。

Network node components - overview Network node components - connectivity

コンピュートノードは、以下のネットワークコンポーネントを持ちます。

  1. Open vSwitch エージェント。仮想スイッチ、仮想スイッチ間の接続性、および仮想ポート経由での名前空間、 Linux ブリッジ、物理インターフェースなどの他のネットワークコンポーネントとのやり取りを管理します。

  2. Linux ブリッジ。セキュリティーグループを扱います。Open vSwitch と iptables に関する制限のため、Networking サービスは Linux ブリッジを使ってインスタンスのセキュリティーグループの管理を行います。

Compute node components - overview Compute node components - connectivity

パケットフロー

注釈

north-south ネットワークトラフィックは、インスタンスと外部ネットワーク (通常はインターネット) 間の通信です。 easy-west ネットワークトラフィックは、インスタンス間の通信です。

ケース 1: Fixed IP アドレスを持つインスタンスの north-south トラフィック

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. インスタンス 1 の tap インターフェース (1) はパケットを Linux ブリッジ qbr に転送します。宛先は別のネットワーク上にあるので、パケットの宛先 MAC アドレスは TG です。

  2. Linux ブリッジ qbr 上のセキュリティーグループルール (2) で、このパケットに対する状態追跡 (state tracking) が行われます。

  3. Linux ブリッジ qbr は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

  4. Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワークの内部タグを追加します。

  5. VLAN プロジェクトネットワークの場合:

    1. Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。

    2. Open vSwitch の VLAN ブリッジ br-vlan は、内部タグをプロジェクトネットワークの実際の VLAN タグに置き換えます。

    3. Open vSwitch の VLAN ブリッジ br-vlan は、パケットを VLAN インターフェース経由でネットワークノードに転送します。

  6. VXLAN や GRE プロジェクトネットワークの場合:

    1. Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。

    2. Open vSwitch のトンネルブリッジ br-tun は、 パケットを VXLAN か GRE トンネルでカプセル化し、プロジェクトネットワークを識別するタグを追加します。

    3. Open vSwitch のトンネルブリッジ br-tun は、パケットをトンネルインターフェース経由でネットワークノードに転送します。

以下の手順は、ネットワークノードに関係します。

  1. VLAN プロジェクトネットワークの場合:

    1. VLAN インターフェースは、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。

    2. Open vSwitch の VLAN ブリッジ br-vlan は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

    3. Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワークの実際の VLAN タグを内部タグに置き換えます。

  2. VXLAN や GRE プロジェクトネットワークの場合:

    1. トンネルインターフェースは、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。

    2. Open vSwitch のトンネルブリッジ br-tun は、パケットのカプセル化をほどき、プロジェクトネットワークの内部タグを追加します。

    3. Open vSwitch のトンネルブリッジ br-tun は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

  3. Open vSwitch の統合ブリッジ br-int は、パケットをルーター名前空間 qrouterqr インターフェース (3) に転送します。 qr インターフェースはプロジェクトネットワークのゲートウェイ IP アドレス TG を持ちます。

  4. iptables サービス (4) は、 qg インターフェース (5) を送信元 IP アドレスとして使ってパケットの SNAT を行います。 qg インターフェースはプロジェクトネットワークのルーターインターフェースの IP アドレス TR を持ちます。

  5. ルーター名前空間 qrouter は、パケットを qg インターフェース経由で Open vSwitch の統合ブリッジ br-int に転送します。

  6. Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch の外部ブリッジ br-ex に転送します。

  7. Open vSwitch の外部ブリッジ br-ex は、パケットを外部インターフェース経由で外部ネットワークに転送します。

注釈

戻りのトラフィックは、同様の手順の逆順で処理されます。

Network traffic flow - north/south with fixed IP address

ケース 2: Floating IP アドレスを持つインスタンスの north-south トラフィック

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 上にあり、プロジェクトネットワークを使用します。

  • インスタンスが外部ネットワーク上のホストからパケットを受信します。

以下の手順は、ネットワークノードに関係します。

  1. 外部インターフェースは、パケットを Open vSwitch の外部ブリッジ br-ex に転送します。

  2. Open vSwitch の外部ブリッジ br-ex は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

  3. Open vSwitch の統合ブリッジは、パケットをルーター名前空間 qrouterqg インターフェース (1) に転送します。 qg インターフェースはインスタンス 1 の Floating IP アドレス F1 を持ちます。

  4. iptables サービス (2) は、 qr インターフェース (3) を送信元 IP アドレスとして使ってパケットの DNAT を行います。 qr インターフェースはプロジェクトネットワークのルーターインターフェースの IP アドレス TR1 を持ちます。

  5. ルーター名前空間 qrouter は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

  6. Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワークの内部タグを追加します。

  7. VLAN プロジェクトネットワークの場合:

    1. Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。

    2. Open vSwitch の VLAN ブリッジ br-vlan は、内部タグをプロジェクトネットワークの実際の VLAN タグに置き換えます。

    3. Open vSwitch の VLAN ブリッジ br-vlan は、パケットを VLAN インターフェース経由でコンピュートノードに転送します。

  8. VXLAN や GRE プロジェクトネットワークの場合:

    1. Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。

    2. Open vSwitch のトンネルブリッジ br-tun は、 パケットを VXLAN か GRE トンネルでカプセル化し、プロジェクトネットワークを識別するタグを追加します。

    3. Open vSwitch のトンネルブリッジ br-tun は、パケットをトンネルインターフェース経由でコンピュートノードに転送します。

以下の手順は、コンピュートノード 1 に関係します。

  1. VLAN プロジェクトネットワークの場合:

    1. VLAN インターフェースは、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。

    2. Open vSwitch の VLAN ブリッジ br-vlan は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

    3. Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワークの実際の VLAN タグを内部タグに置き換えます。

  2. VXLAN や GRE プロジェクトネットワークの場合:

    1. トンネルインターフェースは、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。

    2. Open vSwitch のトンネルブリッジ br-tun は、パケットのカプセル化をほどき、プロジェクトネットワークの内部タグを追加します。

    3. Open vSwitch のトンネルブリッジ br-tun は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

  3. Open vSwitch の統合ブリッジ br-int は、パケットを Linux ブリッジ qbr に転送します。

  4. Linux ブリッジ qbr 上のセキュリティーグループルール (4) で、このパケットに対するファイアウォールと状態追跡 (state tracking) が行われます。

  5. Linux ブリッジ qbr は、パケットをインスタンス 1 の tap インターフェース (5) に転送します。

注釈

戻りのトラフィックは、同様の手順の逆順で処理されます。

Network traffic flow - north/south with floating IP address

ケース 3: 別のネットワークのインスタンスでの east/west トラフィック

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. インスタンス 1 の tap インターフェース (1) はパケットを Linux ブリッジ qbr に転送します。宛先は別のネットワーク上にあるので、パケットの宛先 MAC アドレスは TG1 です。

  2. Linux ブリッジ qbr 上のセキュリティーグループルール (2) で、このパケットに対する状態追跡 (state tracking) が行われます。

  3. Linux ブリッジ qbr は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

  4. Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワーク 1 の内部タグを追加します。

  5. VLAN プロジェクトネットワークの場合:

    1. Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。

    2. Open vSwitch の VLAN ブリッジ br-vlan は、内部タグをプロジェクトネットワーク 1 の実際の VLAN タグに置き換えます。

    3. Open vSwitch の VLAN ブリッジ br-vlan は、パケットを VLAN インターフェース経由でネットワークノードに転送します。

  6. VXLAN や GRE プロジェクトネットワークの場合:

    1. Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。

    2. Open vSwitch のトンネルブリッジ br-tun は、 パケットを VXLAN か GRE トンネルでカプセル化し、プロジェクトネットワーク 1 を識別するタグを追加します。

    3. Open vSwitch のトンネルブリッジ br-tun は、パケットをトンネルインターフェース経由でネットワークノードに転送します。

以下の手順は、ネットワークノードに関係します。

  1. VLAN プロジェクトネットワークの場合:

    1. VLAN インターフェースは、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。

    2. Open vSwitch の VLAN ブリッジ br-vlan は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

    3. Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワーク 1 の実際の VLAN タグを内部タグに置き換えます。

  2. VXLAN や GRE プロジェクトネットワークの場合:

    1. トンネルインターフェースは、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。

    2. Open vSwitch のトンネルブリッジ br-tun は、パケットのカプセル化をほどき、プロジェクトネットワーク 1 の内部タグを追加します。

    3. Open vSwitch のトンネルブリッジ br-tun は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

  3. Open vSwitch の統合ブリッジ br-int は、パケットをルーター名前空間 qrouterqr-1 インターフェース (3) に転送します。 qr-1 インターフェースはプロジェクトネットワーク 1 のゲートウェイ IP アドレス TG1 を持ちます。

  4. ルーター名前空間 qrouter は、パケットを qr-2 インターフェース (4) に転送します。 qr-2 インターフェースはプロジェクトネットワーク 2 のゲートウェイ IP アドレス TG2 を持ちます。

  5. ルーター名前空間 qrouter は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

  6. Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワーク 2 の内部タグを追加します。

  7. VLAN プロジェクトネットワークの場合:

    1. Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。

    2. Open vSwitch の VLAN ブリッジ br-vlan は、内部タグをプロジェクトネットワーク 2 の実際の VLAN タグに置き換えます。

    3. Open vSwitch の VLAN ブリッジ br-vlan は、パケットを VLAN インターフェース経由でコンピュートノード 2 に転送します。

  8. VXLAN や GRE プロジェクトネットワークの場合:

    1. Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。

    2. Open vSwitch のトンネルブリッジ br-tun は、 パケットを VXLAN か GRE トンネルでカプセル化し、プロジェクトネットワーク 2 を識別するタグを追加します。

    3. Open vSwitch のトンネルブリッジ br-tun は、パケットをトンネルインターフェース経由でコンピュートノード 2 に転送します。

以下の手順は、コンピュートノード 2 に関係します。

  1. VLAN プロジェクトネットワークの場合:

    1. VLAN インターフェースは、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。

    2. Open vSwitch の VLAN ブリッジ br-vlan は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

    3. Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワーク 2 の実際の VLAN タグを内部タグに置き換えます。

  2. VXLAN や GRE プロジェクトネットワークの場合:

    1. トンネルインターフェースは、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。

    2. Open vSwitch のトンネルブリッジ br-tun は、パケットのカプセル化をほどき、プロジェクトネットワーク 2 の内部タグを追加します。

    3. Open vSwitch のトンネルブリッジ br-tun は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

  3. Open vSwitch の統合ブリッジ br-int は、パケットを Linux ブリッジ qbr に転送します。

  4. Linux ブリッジ qbr 上のセキュリティーグループルール (5) で、このパケットに対するファイアウォールと状態追跡 (state tracking) が行われます。

  5. Linux ブリッジ qbr は、パケットをインスタンス 2 の tap インターフェース (6) に転送します。

注釈

戻りのトラフィックは、同様の手順の逆順で処理されます。

Network traffic flow - east/west for instances on different networks

ケース 4: 同じネットワークのインスタンスでの east/west トラフィック

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. インスタンス 1 の tap インターフェース (1) はパケットを VLAN ブリッジ qbr に転送します。宛先は同じネットワーク上にあるので、パケットの宛先 MAC アドレスは I2 です。

  2. プロバイダーブリッジ qbr 上のセキュリティーグループルール (2) で、このパケットに対する状態追跡 (state tracking) が行われます。

  3. Linux ブリッジ qbr は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

  4. Open vSwitch の統合ブリッジ br-int は、プロバイダーネットワーク 1 の内部タグを追加します。

  5. VLAN プロジェクトネットワークの場合:

    1. Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。

    2. Open vSwitch の VLAN ブリッジ br-vlan は、内部タグをプロジェクトネットワーク 1 の実際の VLAN タグに置き換えます。

    3. Open vSwitch の VLAN ブリッジ br-vlan は、パケットを VLAN インターフェース経由でコンピュートノード 2 に転送します。

  6. VXLAN や GRE プロジェクトネットワークの場合:

    1. Open vSwitch の統合ブリッジ br-int は、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。

    2. Open vSwitch のトンネルブリッジ br-tun は、 パケットを VXLAN か GRE トンネルでカプセル化し、プロジェクトネットワーク 1 を識別するタグを追加します。

    3. Open vSwitch のトンネルブリッジ br-tun は、パケットをトンネルインターフェース経由でコンピュートノード 2 に転送します。

以下の手順は、コンピュートノード 2 に関係します。

  1. VLAN プロジェクトネットワークの場合:

    1. VLAN インターフェースは、パケットを Open vSwitch の VLAN ブリッジ br-vlan に転送します。

    2. Open vSwitch の VLAN ブリッジ br-vlan は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

    3. Open vSwitch の統合ブリッジ br-int は、プロジェクトネットワーク 2 の実際の VLAN タグを内部タグに置き換えます。

  2. VXLAN や GRE プロジェクトネットワークの場合:

    1. トンネルインターフェースは、パケットを Open vSwitch のトンネルブリッジ br-tun に転送します。

    2. Open vSwitch のトンネルブリッジ br-tun は、パケットのカプセル化をほどき、プロジェクトネットワーク 2 の内部タグを追加します。

    3. Open vSwitch のトンネルブリッジ br-tun は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

  3. Open vSwitch の統合ブリッジ br-int は、パケットを Linux ブリッジ qbr に転送します。

  4. Linux ブリッジ qbr 上のセキュリティーグループルール (3) で、このパケットに対するファイアウォールと状態追跡 (state tracking) が行われます。

  5. Linux ブリッジ qbr は、パケットをインスタンス 2 の tap インターフェース (4) に転送します。

注釈

戻りのトラフィックは、同様の手順の逆順で処理されます。

Network traffic flow - east/west for instances on the same network

設定例

以下の設定例を、お使いの環境でこのシナリオをデプロイする際の雛形として使ってください。

コントローラーノード

  1. 共通のオプションを設定します。 /etc/neutron/neutron.conf ファイルを編集します。

    [DEFAULT]
    verbose = True
    core_plugin = ml2
    service_plugins = router
    allow_overlapping_ips = True
    
  2. 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 を使用できます。

  3. 以下のサービスを実行します。

    • Server

ネットワークノード

  1. 共通のオプションを設定します。 /etc/neutron/neutron.conf ファイルを編集します。

    [DEFAULT]
    verbose = True
    
  2. 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 アドレスに置き換えます。

  3. 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 オプションには意図的に値を指定していません。

  4. 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
    
  5. (オプション) VXLAN/GRE プロジェクトネットワークの MTU の縮小

    1. /etc/neutron/dhcp_agent.ini ファイルを編集します。

      [DEFAULT]
      dnsmasq_config_file = /etc/neutron/dnsmasq-neutron.conf
      
    2. /etc/neutron/dnsmasq-neutron.conf ファイルを編集します。

      dhcp-option-force=26,1450
      
  6. メタデータエージェントを設定します。 /etc/neutron/metadata_agent.ini ファイルを編集します。

    [DEFAULT]
    verbose = True
    nova_metadata_ip = controller
    metadata_proxy_shared_secret = METADATA_SECRET
    

    METADATA_SECRET を適切な値に置き換えます。

  7. 以下のサービスを実行します。

    • Open vSwitch
    • Open vSwitch エージェント

    • L3 エージェント

    • DHCP エージェント

    • メタデータエージェント

コンピュートノード

  1. 共通のオプションを設定します。 /etc/neutron/neutron.conf ファイルを編集します。

    [DEFAULT]
    verbose = True
    
  2. 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 アドレスに置き換えます。

  3. 以下のサービスを実行します。

    • Open vSwitch
    • Open vSwitch エージェント

サービスの動作検証

  1. 管理プロジェクトのクレデンシャルを読み込みます。

  2. エージェントの存在と動作を検証します。

    $ 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 プロジェクトネットワークを作成します。

  1. 管理プロジェクトのクレデンシャルを読み込みます。

  2. 外部ネットワークを作成します。

    $ 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     |
    +---------------------------+--------------------------------------+
    
  3. 外部ネットワークにサブネットを作成します。

    $ 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 プロジェクトのクレデンシャルを使用しています。

  1. 一般プロジェクトの ID を取得します。この例では、 demo プロジェクトを使用しています。

    $ openstack project show demo
    +-------------+----------------------------------+
    | Field       | Value                            |
    +-------------+----------------------------------+
    | description | Demo Project                     |
    | enabled     | True                             |
    | id          | 443cd1596b2e46d49965750771ebbfe1 |
    | name        | demo                             |
    +-------------+----------------------------------+
    
  2. プロジェクトネットワークを作成します。

    $ 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     |
    +---------------------------+--------------------------------------+
    
  3. 通常のプロジェクトの認証情報を読み込みます。 以下の手順では demo プロジェクトを使用します。

  4. プロジェクトネットワークにサブネットを作成します。

    $ 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                 |
    +-------------------+--------------------------------------------------+
    
  5. プロジェクトルーターを作成します。

    $ 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     |
    +-----------------------+--------------------------------------+
    
  6. プロジェクトサブネットをルーターにインターフェースとして接続します。

    $ neutron router-interface-add demo-router demo-subnet
    Added interface 0fa57069-29fd-4795-87b7-c123829137e9 to router demo-router.
    
  7. ルーターに外部ネットワークへのゲートウェイを追加します。

    $ neutron router-gateway-set demo-router ext-net
    Set gateway for router demo-router
    

ネットワーク動作の検証

  1. ネットワークノードにおいて、qrouterqdhcp 名前空間が作成されていることを確認します。

    $ ip netns
    qrouter-4d7928a0-4a3c-4b99-b01b-97da2f97e279
    qdhcp-353f5937-a2d3-41ba-8225-fa1af2538141
    

    注釈

    インスタンスを起動するまでは qdhcp 名前空間は存在しない場合があります。

  2. プロジェクトネットワークのルーターの外部ネットワーク側のゲートウェイ 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"} |
    +--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+
    
  3. コントローラーノードか外部ネットワークにアクセスできるホストから、プロジェクトルーターの外部ネットワーク側のゲートウェイ 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
    
  4. 通常のプロジェクトの認証情報を読み込みます。 以下の手順では demo プロジェクトを使用します。

  5. プロジェクトネットワークに接続されたインタフェースを持つインスタンスを起動します。

  6. インスタンスへのコンソールアクセスを取得します。

    1. プロジェクトルーターへの接続性を確認します。

      $ 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
      
    2. インターネットへの接続性を確認します。

      $ 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
      
  7. 適切なセキュリティーグループを作成し、インスタンスへの 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 |              |
    +-------------+-----------+---------+-----------+--------------+
    
  8. 外部ネットワークに 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     |
    +---------------------+--------------------------------------+
    
  9. Floating IP アドレスをインスタンスに関連付けます。

    $ nova floating-ip-associate demo-instance1 203.0.113.102
    
  10. インスタンスに 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     |
    +--------------------------------------+----------------+--------+------------+-------------+-----------------------------------------+
    
  11. コントローラーノードか外部ネットワークにアクセスできるホストから、インスタンスに関連付けられた 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
    
Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.