シナリオ: 分散仮想ルーター (DVR) を使った高可用構成

シナリオ: 分散仮想ルーター (DVR) を使った高可用構成

このシナリオでは、 OpenStack Networking サービスの ML2 プラグインと Open vSwitch を使った分散仮想ルーター (DVR) による高可用性を持った実装について説明します。例として取り上げる設定では、flat 外部ネットワーク 1 つと VXLAN のプロジェクト (テナント) ネットワーク 1 つを作成しますが、この設定は VLAN 外部ネットワーク、VLAN プロジェクトネットワーク、GRE プロジェクトネットワークにも対応しています。

DVR アーキテクチャーは、基本構成を、コンピュートノードが外部ネットワークに直接接続できるようにしたものです。 Floating IP アドレスを持つインスタンスの場合、プロジェクトネットワークと外部ネットワーク間のルーティングは、完全にコンピュートノードだけで行われ、従来のネットワークノードを使った場合の単一障害点や性能の問題がなくなります。同じ分散仮想ルーターに接続されたプロジェクトネットワークを使用するインスタンスの場合も、インスタンスが Fixed IP アドレスか Floating IP アドレスのどちらを持つかに関わらず、ルーティングは完全にコンピュートノードだけで行われます。ただし、 Fixed IP アドレスを持つインスタンスの場合、プロジェクトネットワークと外部ネットワーク間でのルーティングと SNAT サービスについては、依然としてネットワークノードが利用されます。

前提

この前提は、このシナリオをデプロイするのに必要な最低限の物理インフラと直接の 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. 最低 2 台のコンピュートノード。ネットワークインターフェースは 4 つ: 管理ネットワーク, プロジェクトトンネルネットワーク、 VLAN プロジェクトネットワーク、外部ネットワーク (通常はインターネット)。Open vSwitch ブリッジ br-vlan は VLAN インターフェースのポートを持ち、 Open vSwitch ブリッジ br-ex は外部インターフェースのポートを持っている必要があります。

設定例では、管理ネットワークは 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 ファイルの neutron を使う適用な設定。

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

アーキテクチャー

Architecture overview

注釈

north-south という言葉は、一般には、インスタンスと外部ネットワーク (通常はインターネット) 間のネットワークトラフィックを表します。 easy-west という言葉は、一般には、インスタンス間のネットワークトラフィックを表します。

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

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

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

  3. L3 エージェント。qroutersnat 名前空間を管理します。

    1. 例えば、クラシックルーターのプロジェクトネットワークでは、 qrouter 名前空間は north-southeast-west ネットワークトラフィックを転送し、クラシックルーターの場合と同様に DNAT/SNAT を行います。また、インスタンスとメタデータエージェント間でメタデータトラフィックを転送します。

    2. 例えば、分散ルーターのプロジェクトネットワークの Fixed IP では、 snat 名前空間は north-south ネットワークトラフィックに対して SNAT を行います。

  4. メタデータエージェント。クラシックルーターのプロジェクトネットワークを使うインスタンスに対してメタデータ操作を扱います。

Network node components - overview Network node components - connectivity

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

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

  2. L3 エージェント。qrouterfip 名前空間を管理します。

    1. 例えば、分散ルーターのプロジェクトネットワークの Floating IP では、 fip 名前空間は north-south ネットワークトラフィックの転送と DNAT/SNAT を行います。

    2. 例えば、分散ルーターのプロジェクトネットワークの Fixed IP と Floating IP では、 qrouter 名前空間は east-west ネットワークトラフィックの転送を行います。

  3. メタデータエージェント。分散ルーターのプロジェクトネットワークを使うインスタンスに対してメタデータ操作を扱います。

  4. Linux ブリッジ。セキュリティーグループを扱います。

    注釈

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

Network node components - overview Network node components - connectivity

パケットフロー

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

分散ルーターのプロジェクトネットワークを使う Fixed IP を持つインスタンスに対して、ネットワークノードはプロジェクトネットワークと外部ネットワーク間の north/south ネットワークトラフィックを転送します。

  • 外部ネットワーク

    • ネットワーク 203.0.113.0/24

    • ゲートウェイ 203.0.113.1 (MAC アドレスは EG)

    • Floating IP 範囲 203.0.113.101 ~ 203.0.113.200

    • プロジェクトネットワークのルーターインターフェース 203.0.113.101 TR

    • プロジェクトネットワークの SNAT インターフェース 192.168.1.2 (MAC アドレスは TN)

  • プロジェクトネットワーク

    • ネットワーク 192.168.1.0/24

    • ゲートウェイ 192.168.1.1 (MAC アドレスは TG)

  • コンピュートノード 1

    • インスタンス 1 192.168.1.11 (MAC アドレスは I1)

    • DVR MAC アドレス D1

  • インスタンス 1 はコンピュートノード 1 上にあり、プロジェクトネットワークを使用します。

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

注釈

このシナリオは、VLAN と GRE/VXLAN プロジェクトネットワークの両方をサポートします。しかしながら、このパケットフローでは簡単のため VXLAN プロジェクトネットワークを使うインスタンスだけをカバーしています。

以下の手順は、コンピュートノード 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 は、パケットがプロジェクトネットワーク 1 の内部タグを持つように変更します。

  5. Open vSwitch の統合ブリッジ br-int は、パケットを、分散ルーター名前空間 qrouter のプロジェクトネットワーク 1 のゲートウェイ TG である qr インターフェースに転送します。

  6. 分散ルーターの qrouter 名前空間は、 SNAT 名前空間 snatsg インターフェース (4) 上のプロジェクトネットワーク 1 の SNAT インターフェースの MAC アドレス TN の解決を行い、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

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

  8. Open vSwitch のトンネルブリッジ br-tun は、パケットの送信元 MAC アドレス I1D1 で置き換えます。

  9. Open vSwitch のトンネルブリッジ br-tun は、 パケットをプロジェクトネットワーク 1 のタグを含む VXLAN トンネルでカプセル化します。

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

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

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

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

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

  4. Open vSwitch の統合ブリッジ br-int は、パケットの送信元 MAC アドレス D1TG で置き換えます。

  5. Open vSwitch の統合ブリッジ br-int は、パケットを SNAT 名前空間 snatsg インターフェース (4) に転送します。

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

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

  8. 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

    • ゲートウェイ 203.0.113.1 (MAC アドレスは EG)

    • Floating 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 192.168.1.11 (MAC アドレスは I1)、 Floating IP アドレス 203.0.113.102 (F1)

    • DVR MAC アドレス D1

    • DVR 内部 IP アドレス DA1DA2

  • インスタンス 1 はコンピュートノード 1 上にあり、プロジェクトネットワークを使用します。

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

注釈

このシナリオは、VLAN と GRE/VXLAN プロジェクトネットワークの両方をサポートします。しかしながら、このパケットフローでは簡単のため VXLAN プロジェクトネットワークを使うインスタンスだけをカバーしています。

以下の手順は、外部ネットワークからコンピュートノード 1 上のインスタンスへの入力パケットに対して行われます。

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

  2. Open vSwitch の外部ブリッジ br-ex は、パケットを Floating IP 名前空間 fipfg インターフェース (1) に転送します。 fg インターフェースは、インスタンスの Floating IP アドレス F1 に対する ARP 要求に応答します。

  3. Floating IP 名前空間 fip は、 DVR 内部 IP アドレス DA1DA2 を使って、パケットを分散ルーター名前空間 qrouter にルーティングします (2)。 fpr インターフェース (3) は DVR 内部 IP アドレス DA1 を持ち、 rfp インターフェース (4) は DVR 内部 IP アドレス DA2 を持ちます。

  4. Floating IP 名前空間 fip は、パケットを分散ルーター名前空間 qrouterrfp インターフェース (5) に転送します。 rfp インターフェースはインスタンスの Floating IP アドレス F1 も持っています。

  5. 分散ルーター名前空間 qrouter 内の iptables サービス (6) は、宛先 IP アドレスを使ってパケットに対する DNAT を行います。 qr インターフェース (7) は、プロジェクトネットワークのゲートウェイの IP アドレス TG を持ちます。

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

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

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

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

以下の手順は、コンピュートノード 1 上のインスタンスから外部ネットワークへの入力パケットに対して行われます。

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

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

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

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

  5. iptables サービス (6) は、 rfp インターフェース (5) を送信元 IP アドレスとして使ってパケットの SNAT を行います。 rfp インターフェースはインスタンスの Floating IP アドレス F1 を持ちます。

  6. 分散ルーター名前空間 qrouter は、 DVR 内部 IP アドレス DA1DA2 を使って、パケットを Floating IP 名前空間 fip にルーティングします (2) 。 rfp インターフェース (4) は DVR 内部 IP アドレス DA2 を持ち、 fpr インターフェース (3) は DVR 内部 IP アドレス DA1 を持ちます。

  7. Floating IP 名前空間 fipfg インターフェースは、パケットを Open vSwitch の外部ブリッジ br-ex に転送します。 fg インターフェースはプロジェクトルーターの外部 IP アドレス TE を持ちます。

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

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)

    • DVR MAC アドレス D1

  • コンピュートノード 2

    • インスタンス 2 192.168.2.11 (MAC アドレスは I2)

    • DVR MAC アドレス D2

  • インスタンス 1 はコンピュートノード 1 上にあり、プロジェクトネットワーク 1 を使用します。

  • インスタンス 2 はコンピュートノード 2 上にあり、プロジェクトネットワーク 2 を使用します。

  • 両方のプロジェクトネットワークは同じ分散仮想ルーター上にあります。

  • インスタンス 1 がインスタンス 2 にパケットを送信します。

注釈

このシナリオは、VLAN と GRE/VXLAN プロジェクトネットワークの両方をサポートします。しかしながら、このパケットフローでは簡単のため VXLAN プロジェクトネットワークを使うインスタンスだけをカバーしています。

以下の手順は、コンピュートノード 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 は、パケットを分散ルーター名前空間 qrouter のプロジェクトネットワーク 1 のインターフェース (3) に転送します。

  5. 分散ルーター名前空間 qrouter は、パケットをプロジェクトネットワーク 2 にルーティングします。

  6. 分散ルーター名前空間 qrouter のプロジェクトネットワーク 2 のインターフェース (4) は、パケットを Open vSwitch の統合ブリッジ br-int に転送します。

  7. Open vSwitch の統合ブリッジ br-int は、パケットがプロジェクトネットワーク 2 の内部タグを持つように変更します。

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

  9. Open vSwitch のトンネルブリッジ br-tun は、パケットの送信元 MAC アドレス TG2D1 で置き換えます。

  10. Open vSwitch のトンネルブリッジ br-tun は、 パケットをプロジェクトネットワーク 2 のタグを含む VXLAN トンネルでカプセル化します。

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

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

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

  2. Open vSwitch のトンネルブリッジ br-tun は、パケットのカプセル化をほどきます。

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

  4. Open vSwitch の統合ブリッジ br-int は、パケットの送信元 MAC アドレス D1TG2 で置き換えます。

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

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

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

注釈

コンピュートノード 1 から到着したパケットは、コンピュートノード 2 の qrouter 名前空間のプロジェクトネットワークのインターフェース (5,6) を経由しません。一方、逆向きのトラフィックはこれらのインターフェースを通ります。

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

設定例

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

注釈

この設定は、主に Kilo リリースを対象としています。

コントローラーノード

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

    [DEFAULT]
    verbose = True
    router_distributed = True
    core_plugin = ml2
    service_plugins = router
    allow_overlapping_ips = True
    

    注釈

    router_distributed = True を設定すると、すべてのユーザーで分散ルーターがデフォルトで作成されるようになります。この設定をしない場合は、特権ユーザーだけが、ルーター作成時に --distributed 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
    enable_distributed_routing = True
    l2_population = True
    arp_responder = 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 =
    agent_mode = dvr_snat
    

    注釈

    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. (オプション) GRE/VXLAN プロジェクトネットワークの 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,external:br-ex
    
    [agent]
    tunnel_types = gre,vxlan
    enable_distributed_routing = True
    l2_population = True
    arp_responder = 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 =
    agent_mode = dvr
    

    注釈

    external_network_bridge オプションには意図的に値を指定していません。

  4. メタデータエージェントを設定します。 /etc/neutron/metadata_agent.ini ファイルを編集します。

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

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

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

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

    • L3 エージェント

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

サービスの動作検証

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

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

    $ neutron agent-list
    +--------------------------------------+--------------------+----------+-------+----------------+---------------------------+
    | id                                   | agent_type         | host     | alive | admin_state_up | binary                    |
    +--------------------------------------+--------------------+----------+-------+----------------+---------------------------+
    | 10b084e5-4ab8-43d6-9b04-6d56f27f9cd4 | Metadata agent     | network1 | :-)   | True           | neutron-metadata-agent    |
    | 2f90ef81-3eed-4ecf-b6b9-2d2c21dda85c | Open vSwitch agent | compute2 | :-)   | True           | neutron-openvswitch-agent |
    | 319563ac-88f9-4352-b63e-e55beb673372 | DHCP agent         | network1 | :-)   | True           | neutron-dhcp-agent        |
    | 3345723e-16e8-4b74-9d15-d7f1f977a3bd | Open vSwitch agent | compute1 | :-)   | True           | neutron-openvswitch-agent |
    | 4643c811-a54a-41da-91a8-c2328bcaeea3 | Open vSwitch agent | network1 | :-)   | True           | neutron-openvswitch-agent |
    | 5ad81671-efc3-4acc-9d5d-030a1c4f6a25 | L3 agent           | compute1 | :-)   | True           | neutron-l3-agent          |
    | 641337fa-99c2-468d-8d7e-89277d6ba144 | Metadata agent     | compute1 | :-)   | True           | neutron-metadata-agent    |
    | 9372e008-bd29-4436-8e01-8ddfd50d2b74 | L3 agent           | network1 | :-)   | True           | neutron-l3-agent          |
    | af9d1169-1012-4440-9de2-778c8fce21b9 | L3 agent           | compute2 | :-)   | True           | neutron-l3-agent          |
    | ee59e3ba-ee3c-4621-b3d5-c9d8123b6cc5 | Metadata agent     | compute2 | :-)   | True           | neutron-metadata-agent    |
    +--------------------------------------+--------------------+----------+-------+----------------+---------------------------+
    

初期ネットワークの作成

この例は、フラット外部ネットワーク、VXLAN プロジェクトネットワークを作成します。

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

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

    $ neutron net-create ext-net --router:external \
      --provider:physical_network external --provider:network_type flat
    Created a new network:
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | True                                 |
    | id                        | 893aebb9-1c1e-48be-8908-6b947f3237b3 |
    | name                      | ext-net                              |
    | provider:network_type     | flat                                 |
    | provider:physical_network | external                             |
    | provider:segmentation_id  |                                      |
    | router:external           | True                                 |
    | shared                    | False                                |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tenant_id                 | 54cd044c64d5408b83f843d63624e0d8     |
    +---------------------------+--------------------------------------+
    
  3. 外部ネットワークにサブネットを作成します。

    $ neutron subnet-create ext-net 203.0.113.0/24 --allocation-pool \
      start=203.0.113.101,end=203.0.113.200 --disable-dhcp \
      --gateway 203.0.113.1
    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                | 9159f0dc-2b63-41cf-bd7a-289309da1391                 |
    | ip_version        | 4                                                    |
    | ipv6_address_mode |                                                      |
    | ipv6_ra_mode      |                                                      |
    | name              | ext-subnet                                           |
    | network_id        | 893aebb9-1c1e-48be-8908-6b947f3237b3                 |
    | tenant_id         | 54cd044c64d5408b83f843d63624e0d8                     |
    +-------------------+------------------------------------------------------+
    

注釈

設定例では、先頭のプロジェクトネットワーク種別は vlan です。特権ユーザーだけが GRE や VXLAN などの他の種別のネットワークを作成できます。以下のコマンドでは、 VXLAN プロジェクトネットワークを作成するのに admin プロジェクトのクレデンシャルを使用しています。

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

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

    $ neutron net-create demo-net --tenant-id cdef0071a0194d19ac6bb63802dc9bae \
      --provider:network_type vxlan
    Created a new network:
    +---------------------------+--------------------------------------+
    | Field                     | Value                                |
    +---------------------------+--------------------------------------+
    | admin_state_up            | True                                 |
    | id                        | ac108952-6096-4243-adf4-bb6615b3de28 |
    | name                      | demo-net                             |
    | provider:network_type     | vxlan                                |
    | provider:physical_network |                                      |
    | provider:segmentation_id  | 1                                    |
    | router:external           | False                                |
    | shared                    | False                                |
    | status                    | ACTIVE                               |
    | subnets                   |                                      |
    | tenant_id                 | cdef0071a0194d19ac6bb63802dc9bae     |
    +---------------------------+--------------------------------------+
    
  3. 一般プロジェクトのクレデンシャルを読み込みます。

  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                | 69d38773-794a-4e49-b887-6de6734e792d                 |
    | ip_version        | 4                                                    |
    | ipv6_address_mode |                                                      |
    | ipv6_ra_mode      |                                                      |
    | name              | demo-subnet                                          |
    | network_id        | ac108952-6096-4243-adf4-bb6615b3de28                 |
    | tenant_id         | cdef0071a0194d19ac6bb63802dc9bae                     |
    +-------------------+------------------------------------------------------+
    
  5. 分散プロジェクトルーターを作成します。

    $ neutron router-create demo-router
    Created a new router:
    +-----------------------+--------------------------------------+
    | Field                 | Value                                |
    +-----------------------+--------------------------------------+
    | admin_state_up        | True                                 |
    | distributed           | True                                 |
    | external_gateway_info |                                      |
    | ha                    | False                                |
    | id                    | 635660ae-a254-4feb-8993-295aa9ec6418 |
    | name                  | demo-router                          |
    | routes                |                                      |
    | status                | ACTIVE                               |
    | tenant_id             | cdef0071a0194d19ac6bb63802dc9bae     |
    +-----------------------+--------------------------------------+
    

    注釈

    デフォルトポリシーでは、非特権ユーザーの場合、コマンド出力に distributed フラグは表示されません。

  6. プロジェクトネットワークをルーターに接続します。

    $ neutron router-interface-add demo-router demo-subnet
    Added interface b1a894fd-aee8-475c-9262-4342afdc1b58 to router demo-router.
    
  7. ルーターに外部ネットワークへのゲートウェイを追加します。

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

ネットワーク動作の検証

  1. ネットワークノードで、 snat, qrouter, qdhcp の名前空間が作成されていることを確認します。

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

    注釈

    いくつかの名前空間は、インスタンスの起動前は存在しない場合があります。

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

  3. プロジェクトネットワークのルーターの外部ネットワーク側のゲートウェイ 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": "69d38773-794a-4e49-b887-6de6734e792d", "ip_address": "192.168.1.1"}   |
    | ff5f93c6-3760-4902-a401-af78ff61ce99 |      | fa:16:3e:54:d7:8c | {"subnet_id": "9159f0dc-2b63-41cf-bd7a-289309da1391", "ip_address": "203.0.113.101"} |
    +--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+
    
  4. コントローラーノードか外部ネットワークにアクセスできるホストから、プロジェクトルーターの外部ネットワーク側のゲートウェイ 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
    
  5. 一般プロジェクトのクレデンシャルを読み込みます。

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

  7. そのインスタンスが作成されたコンピュートノードで、 qrouter 名前空間が作成されていることを確認します。

    $ ip netns
    qrouter-4d7928a0-4a3c-4b99-b01b-97da2f97e279
    
  8. インスタンスへのコンソールアクセスを取得します。

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

    $ neutron floatingip-create ext-net
    Created a new floatingip:
    +---------------------+--------------------------------------+
    | Field               | Value                                |
    +---------------------+--------------------------------------+
    | fixed_ip_address    |                                      |
    | floating_ip_address | 203.0.113.102                        |
    | floating_network_id | 9bce64a3-a963-4c05-bfcd-161f708042d1 |
    | id                  | 05e36754-e7f3-46bb-9eaa-3521623b3722 |
    | port_id             |                                      |
    | router_id           |                                      |
    | status              | DOWN                                 |
    | tenant_id           | 7cf50047f8df4824bc76c2fdf66d11ec     |
    +---------------------+--------------------------------------+
    
  11. Floating IP アドレスをインスタンスに関連付けます。

    $ nova floating-ip-associate demo-instance1 203.0.113.102
    
  12. インスタンスに 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     |
    +--------------------------------------+----------------+--------+------------+-------------+-----------------------------------------+
    
  13. インスタンスが作成されたコンピュートノードで、 fip 名前空間が作成されていることを確認します。

    $ ip netns
    fip-2c7bd9c2-8ab0-46ef-b7c1-023ce0452c24
    
  14. コントローラーノードか外部ネットワークにアクセスできるホストから、インスタンスに関連付けられた 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.