Red Hat Training

A Red Hat training course is available for Red Hat OpenStack Platform

ネットワークガイド

Red Hat OpenStack Platform 10

OpenStack Networking の詳細ガイド

OpenStack Documentation Team

概要

一般的な OpenStack Networking タスクのガイドです。

前書き

OpenStack Networking (コード名: neutron) は、Red Hat OpenStack Platform 10 のソフトウェア定義ネットワークのコンポーネントです。

第1章 OpenStack Networking および SDN

ソフトウェア定義ネットワーク (SDN: Software-defined Networking) は、下層の機能を抽象化することでネットワーク管理者がネットワークサービスを管理できるようにするコンピューターネットワーキング手法の 1 つです。サーバーのワークロードを仮想環境に移行しても、それらのサーバーがデータの送受信のためにネットワーク接続を必要とすることに変わりありません。SDN は、ルーターやスイッチなどのネットワーク装置を同じ仮想化領域に移動することで、このニーズに対応します。すでにネットワークの基本概念に精通している場合には、接続先のサーバーと同様に、ネットワークが仮想化されていると考えるのに無理はないでしょう。

本書は、パート I で管理者が基本的な管理およびトラブルシューティングタスクについて理解するための内容を紹介し、パート II で OpenStack Networking の高度な機能についてクックブック形式で解説しています。ネットワークの一般概念をすでに把握している場合には、本書の内容は理解しやすいはずです (ネットワークに精通されていない場合には、パート I のネットワークの一般的な概要が役立ちます)。

1.1. 本ガイドの構成

  • 前書き: SDN に関連した大規模な組織内の政治について説明し、一般的なネットワークの概念について簡単に紹介します。
  • パート I: 一般的な管理タスクと基本的なトラブルシューティングのステップを説明します。

    • ネットワークリソースの追加と削除
    • 基本的なネットワークのトラブルシューティング
    • テナントネットワークのトラブルシューティング
  • パート II: 以下のように、高度な OpenStack Networking 機能についてクックブック形式のシナリオがまとめられています。

    • 仮想ルーターのレイヤー 3 高可用性の設定
    • SR-IOV、DVR、その他の Neutron 機能の設定

第2章 仮想ネットワークをめぐる組織内の政治

ソフトウェア定義ネットワーク (SDN: Software-defined Networking) により、エンジニアは仮想ルーターやスイッチを OpenStack または RHV ベースの仮想化環境にデプロイすることが可能です。また、SDN により、コンピューター間におけるデータパケット転送は従来とは異なる領域に移行されます。これらのルーターやスイッチは、以前はさまざまなケーブルで接続された物理デバイスでしたが、SDN を使用するとボタンを数回クリックするだけでデプロイして稼働させることができます。

大規模な仮想化環境では、ソフトウェア定義ネットワーク (SDN) を採用すると、組織内政治の緊張を生む可能性があります。高度なネットワーク概念に精通していない仮想化エンジニアは、クラウドデプロイメントの仮想ルーターやスイッチの管理を突然迫られ、IP アドレスの確保、VLAN の分離、サブネット化について合理的に判断する必要があります。仮想化エンジニアがこのような状況に直面している一方で、ネットワークエンジニアは、かつて自分たちの独占領域であった技術について他のチームが協議しているのを目の当たりにするため、動揺したり、雇用の先行き不安が生じたりする可能性があります。このような境界があると、トラブルシューティングもかなり複雑になります。システムがダウンして相互接続できない場合には、仮想化エンジニアはパケットが物理スイッチに到達していることを確認した時点で、そのトラブルシューティングをネットワークエンジニアに引き継ぐべきでしょうか。

このような緊張は、仮想ネットワークを物理ネットワークの延長と考えると、容易に緩和することができます。デフォルトゲートウェイ、ルーター、サブネットには、物理ネットワークと同じ概念が適用され、ネットワークはすべて TCP/IPを使用して稼働することには変わりありません。

この問題に対して、どのような政治的対応を図るとしても、技術的な手段で対処することもできます。たとえば、Cisco の Nexus 製品を使用することで、OpenStack オペレーターは精通した Cisco NX-OS を実行する仮想ルーターをデプロイすることができます。これにより、ネットワークエンジニアは、これまで既存の物理 Cisco ネットワーク装置で行ってきた方法で、ネットワークポートにログインし、管理することができます。または、ネットワークエンジニアが仮想ネットワークを管理しない場合でも、初期の段階からネットワークエンジニアを交えて進めていくことが賢明です。OpenStack のノードには、物理ネットワークのインフラストラクチャーが必要な点は変わりなく、IP アドレスの割り当て、VLAN のトランク接続、VLAN をトランク接続するためのスイッチポートの設定を行う必要があります。トラブルシューティングに加えて、両チーム間での広範囲にわたる連携が要求されます。たとえば、仮想マシンの MTU サイズを調整する場合には、全仮想/物理スイッチおよびルーターなど、エンドツーエンドで実行する必要があり、両チーム間で慎重に準備して変更を行っていく必要があります。

ネットワークエンジニアは、引き続き、仮想化デプロイメントにおける極めて重要な役割を果たします。SDN の導入後にはその重要性はさらに高まります。業務が複雑化するため、ネットワークエンジニアのスキルを確実に活用していかなければなりません。特に問題発生時には、ネットワークエンジニアの知識が必要になります。

第3章 ネットワークの概要

3.1. ネットワークの仕組み

ネットワーク という用語は、コンピューター間で情報を移動させる動作のことを指します。最も基本的なレベルでは、ネットワークインターフェースカード (NIC) がインストールされた 2 つのマシンをケーブルでつなぐことで達成されます。

注記

OSI ネットワークモデルでは、これはレイヤー 1 に相当します。

3 台以上のコンピューターを使用する場合には、スイッチというデバイスを追加してこの構成をスケールアウトする必要があります。エンタープライズスイッチは複数のイーサネットポートを持つボックスで、追加のマシンを接続することができます。スイッチを追加してマシンを結線すると、ローカルエリアネットワーク (LAN) と呼ばれるネットワークが完成します。

スイッチについての内容は、OSI モデルのレイヤー 2 が対象で、下層のレイヤー 1 よりもインテリジェントな機能が適用されます。各 NIC には、ハードウェアごとに一意に割り当てられる MAC アドレス番号があり、この番号を使用することにより、複数のマシンを同じスイッチに結線して、相互に認識できるようになります。スイッチは、どの MAC アドレスがどのポートに結線されているかのリストを管理するので、コンピューター間でデータ送信を試みる際に、スイッチはそれら両方のコンピューターがどこに配置されているかを認識し、MAC アドレスからポートへのマッピングを監視する CAM (Content Addressable Memory) のエントリーを調整します。

3.1.1. VLAN

VLAN により、同じスイッチ上で実行されるコンピューターのネットワークトラフィックを分割することができます。言い換えると、別のネットワークのメンバーであるポートを設定することで、スイッチを論理的に分割することができます。つまり、セキュリティー上の理由からトラフィックを分割できる小規模な LAN ということになります。たとえば、このポートがスイッチに合計で 24 個ある場合に、ポート 1-6 は VLAN200 に所属し、ポート 7-18 は VLAN201 に所属するなどと分けることができます。ここで、VLAN200 に接続されているコンピューターは、VLAN201 のコンピューターと完全に分割でき、直接通信できなくなります。通信する必要があれば、スイッチの VLAN200 部分と VLAN201 部分が 2 つの別個の物理スイッチであったかのように、トラフィックはルーターを通過する必要があります (このように考えると便利です)。このような場合には、相互に通信が可能な VLAN の組み合わせを制御するのに、ファイアウォールも有用です。

3.2. 2 つの LAN の接続

2 つの LAN がそれぞれ別個のスイッチ上で稼働している状況で、LAN 間で情報を共有させたいとします。このような場合、設定オプションが 2 種類あります。

  • 1 番目のオプション: 802.1Q VLAN タグ付けを使用して、両方の物理スイッチにまたがる単一の VLAN を設定する。この接続を機能させるには、ネットワークケーブルを 1 本用意して、各スイッチのポートに差し込んでから、それらのポートを 802.1Q タグが付いたポートとして設定します (このようなポートは トランク ポートとも呼ばれます)。基本的には、これで 2 つのスイッチが 1 つの大きな論理スイッチとして設定され、接続されているコンピューター同士が相互に検出できるようになります。このオプションの難点はスケーラビリティーで、オーバーヘッドの問題が発生することなくデイジーチェーン接続できるスイッチの数は限られています。
  • 2 番目のオプション: ルーターと呼ばれるデバイスを購入して、各スイッチからのケーブルを接続する。これにより、ルーターは両スイッチで設定したネットワークを認識するようになります。スイッチに差し込んだケーブルの両端には、ネットワークのデフォルトゲートウェイとして知られる IP アドレスが割り当てられます。デフォルトゲートウェイの「デフォルト」とは、宛先のマシンが同じ LAN 上にないことが明らかな場合のトラフィックの送信先のことです。各コンピューターにこのデフォルトゲートウェイを設定することで、トラフィック送信のために、他のネットワーク上にある全コンピューターを認識する必要がなくなります。これで、デフォルトゲートウェイのみにトラフィックが送信されるようになり、そこからの処理はルーターが行うようにします。ルーターは、どのネットワークがどのインターフェースに存在するかを把握しているため、指定の宛先に、問題なくパケットを送信することができます。ルーティングは、IP アドレスやサブネットなどの一般的に知られている概念と同様に、OSI モデルのレイヤー 3 で機能します。
注記

この概念は、インターネット自体の仕組みと同じです。さまざまな組織で稼働する多数の個別ネットワークはすべて、スイッチやルーターを使用して相互に接続しています。適切なデフォルトゲートウェイを辿ることで、最終的にトラフィックは適切な宛先に到着します。

3.2.1. ファイアウォール

ファイアウォールは、レイヤー 7 (実際のコンテンツを検査するレイヤー) を含む複数の OSI レイヤーにわたってトラフィックをフィルターすることができます。多くの場合、ファイアウォールはルーターと同じネットワークセグメントに存在し、全ネットワーク間を移動するトラフィックを制御します。ファイアウォールは、ネットワークに出入りできるトラフィックを記述した事前定義済みのルールセットを参照します。これらのルールは粒度を細かくすることが可能です。以下に例を示します。

VLAN200 のサーバーは、暗号化された Web トラフィック (HTTPS) を一方向に送付している場合にのみ、木曜の午後に限り、VLAN201 のコンピューターとだけ通信できるものとする」といった設定が可能です。

このようなルールを適用するために、一部のファイアウォールは、レイヤー 5 から 7 でディープパケットインスペクション (DPI) も実行し、パケットのコンテンツを検証して、パケットの実際の内容がパケットが主張する内容と同じであることを確認します。ハッカーは、トラフィックを実際の内容とは別のものとして転送して、密かにデータを抜き出すことが知られているため、DPI はこのような脅威を軽減する手段の 1 つとなっています。

3.3. OpenStack Networking (neutron)

OpenStack では、これと同じネットワーク概念が適用されており、ソフトウェア定義ネットワーク (SDN) として知られています。OpenStack Networking (neutron) のコンポーネントは、仮想ネットワーク機能向けの API を提供します。これには、スイッチ、ルーター、ファイアウォールが含まれます。仮想ネットワークインフラストラクチャーにより、インスタンスは相互に通信することができます。また、物理ネットワークを使用した外部との通信を許可することも可能です。Open vSwitch のブリッジは、仮想ポートをインスタンスに割り当て、送受信トラフィック用に物理ネットワークに橋渡しすることができます。

3.4. CIDR 形式の使用

一般的には、IP アドレスはサブネットのブロックにまず割り当てられます。たとえば、IP アドレスの範囲が 192.168.100.0 - 192.168.100.255 で、サブネットマスクが 255.555.255.0 の場合には、IP アドレス 254 個分を割り当てることができます (最初と最後のアドレスは予約されています)。

これらのサブネットは、複数の方法で表現することができます。

  • 一般的な使用法: サブネットアドレスは一般的に、サブネットマスクとネットワークアドレスを使用して表示されます。以下に例を示します。

    • ネットワークアドレス: 192.168.100.0
    • サブネットマスク: 255.255.255.0
  • CIDR 形式の使用: この形式は、サブネットマスクをアクティブな合計ビット数に短縮します。192.168.100.0/24 を例に取ると、/24255.255.255.0 の略式表現で、バイナリーに変換した際に反転したビットの合計数を指します。たとえば、CIDR 形式は、ifcfg-xxx スクリプトにおいて NETMASK 値の代わりに使用することができます。
#NETMASK=255.255.255.0
PREFIX=24

第4章 OpenStack Networking の概念

OpenStack Networking には、ルーティング、DHCP、メタデータなどのコアサービスを管理するシステムサービスがあります。これらのサービスが 1 つにまとまって、物理サーバーに割り当てられる概念的なロールであるコントローラーノードの概念に含まれます。物理サーバーは通常、ネットワークノード のロールが割り当てられ、インスタンスを発着するネットワークトラフィックのレイヤー 3 ルーティングを管理するタスクに特化して稼働します。OpenStack Networking では、このロールを実行する複数の物理ホストを指定することができ、ハードウェア障害が発生した場合に向けたサービスの冗長化が可能です。詳しい情報は、「レイヤー 3 の高可用性」の章を参照してください。

注記

Red Hat OpenStack Platform 10 では、コンポーザブルロールのサポートが追加され、ネットワークサービスをカスタムロール別に分類することができます。ただし、本ガイドでは、内容をわかりやすくするために、デプロイメントにはデフォルトの Controller ロールを使用することを前提とします。

4.1. OpenStack Networking (neutron) のインストール

4.1.1. サポートされるインストール

OpenStack Networking コンポーネントは、Red Hat OpenStack Platform director デプロイメントの一部としてインストールされます。詳しくは、『Red Hat OpenStack Platform director のインストールと使用方法』を参照してください。

4.2. OpenStack Networking の図

以下の図は、専用の OpenStack Networking ノードが L3 ルーティングと DHCP の機能を果たし、FWaaS および LBaaS の高度なサービスを実行する、OpenStack Networking のデプロイメントの例です。2 つのコンピュートノードは Open vSwitch (openvswitch-agent) を実行し、それぞれにテナントトラフィックと管理用の接続向けに物理ネットワークカードが 2 つ搭載されています。また、OpenStack Networking ノードには、プロバイダートラフィック専用の 3 枚目のネットワークカードがあります。

example network

4.3. セキュリティーグループ

セキュリティーグループおよびルールを使用して、任意の neutron ポートに送信 (および任意の neustron ポートから受信) されるネットワークトラフィックの種別と方向をフィルタリングします。これにより、セキュリティーにもう 1 つレイヤーが追加されて、コンピュートインスタンスに存在するファイアウォールルールが補完されます。セキュリティーグループとは、1 つ以上のセキュリティールールを含むコンテナーオブジェクトです。1 つのセキュリティーグループで複数のコンピュートインスタンスへのトラフィックを管理することができます。Floating IP アドレス、OpenStack Networking LBaaS の仮想 IP、およびインスタンスのために作成されたポートは、セキュリティーグループに割り当てられます。セキュリティーグループが指定されなかった場合には、ポートは default のセキュリティーグループに割り当てられます。デフォルトでは、このグループは全受信トラフィックをドロップし、全送信トラフィックを許可します。追加のセキュリティールールを default セキュリティーグループに追加して動作を変更したり、必要に応じて新規セキュリティーグループを作成したりすることができます。

4.4. Open vSwitch

Open vSwitch (OVS) は、レガシーの Linux ソフトウェアブリッジと同様の、ソフトウェア定義ネットワーク (SDN: Software-Defined Networking) の仮想スイッチです。OVS は業界標準の NetFlowOpenFlow、および sFlow をサポートし、仮想ネットワークにスイッチングサービスを提供します。Open vSwitch は、STPLACP、および 802.1Q VLAN タグ付け などのレイヤー 2 機能を使用することで物理スイッチとの統合も可能です。VXLAN と GRE を使用したトンネリングは、Open vSwitch のバージョン 1.11.0-1.el6 以降でサポートされています。

注記

1 つのブリッジには単一のインターフェースまたは単一のボンディングのみをメンバーにすると、Open vSwitch でネットワークループが発生するリスクを緩和することができます。複数のボンディングまたはインターフェースが必要な場合には、複数のブリッジを設定することが可能です。

4.5. Modular Layer 2 (ML2)

ML2 とは、OpenStack Havana リリースで導入された OpenStack Networking コアプラグインです。以前のモノリシックなプラグインのモデルに置き換わる、ML2 のモジュラー型設計により、複数のネットワーク技術を組み合わせた操作を同時に実行できます。モノリシックな Open vSwitch および Linux Bridge プラグインは、非推奨となり、削除されました。これらの機能は、代わりに ML2 メカニズムドライバーとして再実装されています。

注記

ML2 はデフォルトの OpenStack Networking プラグインで、Open vSwitch がデフォルトのメカニズムドライバーとして設定されています。

4.5.1. ML2 が導入された理由

以前は、OpenStack Networking のデプロイでは、実装時に選択したプラグインしか使用することができませんでした。たとえば、Open vSwitch プラグインを実行するデプロイは、Open vSwitch のみを単独にしか使えず、linuxbridge などの別のプラグインを同時に実行することは不可能でした。異なる要件を伴う環境では、これは制限事項となっていました。

4.5.2. ML2 ネットワーク種別

ML2 ネットワーク種別では、複数のネットワークセグメントタイプを同時に操作することができます。また、これらのネットワークセグメントは、ML2 のマルチセグメントネットワークに対するサポートを利用して相互接続することが可能です。ポートは接続されているセグメントに自動的にバインドされ、特定のセグメントにバインドする必要はありません。メカニズムドライバーに応じて、ML2 は、以下のネットワークセグメントタイプをサポートします。

  • flat
  • GRE
  • local
  • VLAN
  • VXLAN

ml2_conf.ini ファイルの ML2 セクションでは、さまざまな タイプ ドライバーが有効化されます。

[ml2]
type_drivers = local,flat,vlan,gre,vxlan

4.5.3. ML2 メカニズムドライバー

共通のコードベースを使用するメカニズムとして、プラグインが再実装されています。このアプローチにより、コードの再利用が可能になる上、コードのメンテナンスとテストにおける複雑性が大幅に軽減されます。

注記

サポートされているメカニズムドライバーの一覧は、『リリースノート』を参照してください。

ml2_conf.ini ファイルの ML2 セクションでさまざまなメカニズムドライバーが有効化されます。以下に例を示します。

[ml2]
mechanism_drivers = openvswitch,linuxbridge,l2population
注記

デプロイメントで Red Hat OpenStack Platform director を使用している場合には、これらの設定は director によって管理されるので、手動で変更すべきではありません。

4.6. L2 Population

L2 Population ドライバーはブロードキャスト、マルチキャスト、およびユニキャストのトラフィックを有効化して、大型のオーバーレイネットワークをスケールアウトします。デフォルトでは、Open vSwitch GRE および VXLAN がブロードキャストを各エージェントに複製します。これには、送信先のネットワークをホストしていないエージェントも含まれます。この設計には、多大なネットワークとプロセスのオーバーヘッドを受容する必要があります。L2 Population ドライバーにより導入される代替の設計は、ARP 解決および MAC 学習トラフィックのための部分的なメッシュを実装し、特定のネットワークをホストするノード間に、そのネットワーク用のトンネルも作成します。このトラフィックは、対象設定済みのユニキャストとしてカプセル化されることによって、必要なエージェントにのみ送信されます。

1. L2 Population ドライバーを有効にするには、メカニズムドライバーの一覧に追加します。また、少なくとも 1 つのトンネリングドライバーも有効にする必要があります (GRE と VXLAN のいずれか一方または両方)。ml2_conf.ini ファイルに適切な設定オプションを追加します。

[ml2]
type_drivers = local,flat,vlan,gre,vxlan
mechanism_drivers = openvswitch,linuxbridge,l2population

2. openvswitch_agent.ini ファイルで L2 Population を有効にします。これは、L2 エージェントを実行する各ノードで有効にする必要があります。

[agent]
l2_population = True
注記

ARP 応答フローをインストールするには、arp_responder フラグを設定する必要があります。以下に例を示します。

[agent]
l2_population = True
arp_responder = True

4.7. OpenStack Networking サービス

Red Hat OpenStack Platform にはデフォルトで、ML2 および Open vSwitch のプラグインと統合してデプロイメントのネットワーク機能を提供するコンポーネントが含まれています。

4.7.1. L3 エージェント

L3 エージェントは openstack-neutron パッケージに含まれています。ネットワーク名前空間は、各プロジェクトに独自の分離されたレイヤー 3 ルーターを提供するのに使用されます。レイヤー 3 ルーターは、トラフィックを誘導し、レイヤー 2 ネットワーク向けのゲートウェイサービスを提供します。L3 エージェントはこれらのルーターの管理を支援します。L3 エージェントをホストするノードでは、外部ネットワークに接続されたネットワークインターフェースに手動で IP アドレスを設定することはできません。代わりに、OpenStack Networking で利用可能な外部ネットワークの IP アドレスの範囲内で指定する必要があります。これらの IP アドレスは、内部ネットワークと外部ネットワークの間を接続するルーターに割り当てられます。選択した範囲は、デプロイメント内の各ルーターに一意の IP アドレスと、必要な各 Floating IP を指定するのに十分な大きさである必要があります。

4.7.2. DHCP エージェント

OpenStack Networking DHCP エージェントは、各プロジェクトのサブネットが DHCP サーバーとして機能するために作成されるネットワークの名前空間を管理します。各名前空間は、ネットワーク上で実行される仮想マシンへの IP アドレス確保が可能な dnsmasq プロセスを実行します。サブネットの作成時にこのエージェントが有効化されて稼働している場合には、そのサブネットにはデフォルトで DHCP が有効化されます。

4.7.3. Open vSwitch エージェント

Open vSwitch (OVS) neutron プラグインは、独自のエージェントを使用します。このエージェントは、各ノードで稼働し、OVS ブリッジを管理します。ML2 プラグインは専用のエージェントと統合して L2 ネットワークを管理します。デフォルトでは、Red Hat OpenStack Platform は ovs-agent を使用します。このエージェントは、OVS ブリッジを使用してオーバーレイネットワークを構築します。

4.8. テナントとプロバイダーネットワーク

以下の図には、テナントとプロバイダーネットワークの種別の概要と、それらが OpenStack Networking トポロジー全体でどのように対話するかを図解しています。

network types

4.8.1. テナントネットワーク

テナントネットワークは、プロジェクト内の接続のためにユーザーが作成します。これらは、デフォルトで完全に分離され、他のプロジェクトとは共有されませんOpenStack Networking はさまざまな種別のテナントネットワークをサポートしています。

  • フラット: 全インスタンスが同じネットワークに存在し、そのネットワークは、ホストと共有することも可能です。VLAN タグ付けやその他のネットワーク分離は行われません。
  • VLAN: OpenStack Networking では、物理ネットワークにある VLAN に対応する VLAN ID (802.1Q タグ付け)を使用してユーザーが複数のプロバイダーネットワークまたはテナントネットワークを作成することができます。これにより、インスタンスは環境全体で相互に通信を行うことが可能になります。また、専用のサーバー、ファイアウォール、ロードバランサー、および同じレイヤー 2 上にあるその他のネットワークインフラストラクチャーと通信することもできます。
  • VXLAN および GRE のトンネル: VXLAN および GRE は、ネットワークオーバーレイを使用して、インスタンス間のプライベートの通信をサポートします。OpenStack Networking ルーターは、トラフィックが GRE または VXLAN テナントネットワークの外部に通過できるようにするために必要です。また、ルーターは、直接接続されたテナントネットワークを外部ネットワーク (インターネットを含む) に接続するのにも必要とされ、Floating IP アドレスを使用して外部ネットワークから直接インスタンスに接続する機能を提供します。
注記

テナントネットワークの QoS ポリシーを設定することが可能です。詳細な情報は、「12章Quality-of-Service (QoS) の設定」を参照してください。

4.8.2. プロバイダーネットワーク

プロバイダーネットワークは OpenStack の管理者によって作成され、データセンター内の既存の物理ネットワークに直接マップします。このカテゴリーの中で有用なネットワークタイプには、フラット (タグなし) と VLAN (802.1Q タグ付き) があります。ネットワーク作成プロセスの一環としてプロバイダーネットワークがテナント間で共有されるように許可することができます。

4.8.2.1. フラットプロバイダーネットワーク

フラットプロバイダーネットワークを使用してインスタンスを直接外部ネットワークに接続することができます。これは、複数の物理ネットワーク (例: physnet1 および physnet2)、さらにそれぞれ別の物理インターフェース (eth0 → physnet1 および eth1 → physnet2) があり、各コンピュートおよびネットワークノードをこれらの外部ネットワークに接続する場合に便利です。単一のインターフェース上で VLAN タグ付けされたインターフェースを複数使用して複数のプロバイダーネットワークに接続する場合は、「VLAN プロバイダーネットワークの使用」を参照してください。

4.8.2.2. コントローラーノードの設定

1. /etc/neutron/plugin.ini (/etc/neutron/plugins/ml2/ml2_conf.ini へのシンボリックリンク) を編集し、既存の値リストに flat を追加し、flat_networks* に設定します。以下に例を示します。

type_drivers = vxlan,flat
flat_networks =*

2. フラットネットワークとして外部ネットワークを作成して、設定済みの physical_network に関連付けます。このネットワークを共有ネットワークとして設定すると (--shared を使用)、他のユーザーはそのネットワークに直接接続されたインスタンスを作成することができます。

neutron net-create public01 --provider:network_type flat --provider:physical_network physnet1 --router:external=True --shared

3. neutron subnet-create または Dashboard を使用して、サブネットを作成します。以下に例を示します。

# neutron subnet-create --name public_subnet --enable_dhcp=False --allocation_pool start=192.168.100.20,end=192.168.100.100 --gateway=192.168.100.1 public01 192.168.100.0/24

4. neutron-server サービスを再起動して、変更を適用します。

systemctl restart neutron-server

4.8.2.3. ネットワークノードとコンピュートノードの設定

ネットワークノードとコンピュートノードで以下の手順を実行します。これにより、ノードは外部ネットワークに接続され、インスタンスが外部ネットワークと直接通信できるようになります。

1. 外部ネットワークのブリッジ (br-ex) を作成して、関連付けたポート(eth1) を追加します。

/etc/sysconfig/network-scripts/ifcfg-br-ex に外部ネットワークのブリッジを作成します。

DEVICE=br-ex
TYPE=OVSBridge
DEVICETYPE=ovs
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none

/etc/sysconfig/network-scripts/ifcfg-eth1eth1br-ex に接続するように設定します。

DEVICE=eth1
TYPE=OVSPort
DEVICETYPE=ovs
OVS_BRIDGE=br-ex
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none

ノードを再起動するか、ネットワークサービスを再起動して、変更を適用します。

2. /etc/neutron/plugins/ml2/openvswitch_agent.ini で物理ネットワークを設定して、ブリッジをその物理ネットワークにマッピングします。

bridge_mappings = physnet1:br-ex
注記

ブリッジマッピングについての詳しい情報は、「13章ブリッジマッピングの設定」を参照してください。

3. ネットワークノードとコンピュートノードの両方で neutron-openvswitch-agent サービスを再起動して、変更を適用します。

systemctl restart neutron-openvswitch-agent

4.8.2.4. ネットワークノードの設定

1. /etc/neutron/l3_agent.iniexternal_network_bridge = に空の値を設定します。

以前のバージョンでは、OpenStack Networking は、外部のネットワークとの接続に単一のブリッジのみを使用する場合に external_network_bridge を使用していました。この値に空白の文字列を設定することができるようになり、複数の外部ネットワークブリッジを使用できます。この設定により、OpenStack Networking は各ブリッジから br-int へのパッチポートを作成します。

# Name of bridge used for external network traffic. This should be set to
# empty value for the linux bridge
external_network_bridge =

2. neutron-l3-agent を再起動して変更を適用します。

systemctl restart neutron-l3-agent
注記

複数のフラットプロバイダーネットワークが存在する場合には、ネットワークごとに独立した物理インターフェースおよびブリッジを使用して外部ネットワークに接続すべきです。ifcfg-* スクリプトを適切に設定し、bridge_mappings オプションで各ネットワークのコンマ区切りリストによりマッピングを指定する必要があります。ブリッジマッピングについての詳しい情報は、「13章ブリッジマッピングの設定」を参照してください。

4.9. レイヤー 2 およびレイヤー 3 ネットワーク

仮想ネットワークを設計する場合には、トラフィックの大半がどこに発生するかを予測する必要があります。ネットワークトラフィックは、異なるネットワーク間よりも同じ論理ネットワーク内のほうが早く移動します。これは、(異なるサブネットを使用する) 論理ネットワーク間のトラフィックではルーターを経由する必要があり、追加でレイテンシーが発生するためです

以下の図で、別の VLAN 上にあるインスタンス間を流れるネットワークトラフィックを見てみましょう。

layers

注記

パフォーマンスが高いハードウェアルーターでも、この設定にレイテンシーが加えられます。

4.9.1. 可能な範囲でのスイッチの使用

スイッチは、ネットワークの下層 (レイヤー 2) で行われるため、レイヤー 3 で行われるルーティングよりもはるかに早く機能することが可能です。頻繁に通信のあるシステム間では、ホップ数をできる限り少なくすることを推奨します。たとえば、この図ではスイッチ付きのネットワークで 2 つの物理ノードをつなげ、ナビゲーションにルーターを使用せずに 2 つのインスタンスが直接通信できるようにしている点が描写されています。これらのインスタンスで同じサブネットが共有されており、同じ論理ネットワークに存在することが分かります。

switching

別のノードにあるインスタンスが同じ論理ネットワークにあるかのように通信できるようにするためには、VXLAN または GRE などのカプセル化されたトンネルを使用する必要があります。トンネルヘッダーに必要な追加のビットに対応するためにエンドツーエンドでの MTU サイズの調節を検討することを推奨します。そうしなかった場合には、断片化が原因でネットワークのパフォーマンスが悪影響を受ける可能性があります。詳しい情報は、「MTU の設定」を参照してください。

VXLAN オフロード機能を搭載したサポート対象のハードウェアを使用すると、VXLAN トンネリングのパフォーマンスをさらに向上させることができます。完全な一覧は「Network Adapter Feature Support in RHEL」のアーティクルを参照してください。

パート I. 一般的なタスク

一般的な管理タスクと基本的なトラブルシューティングのステップを説明します。

第5章 一般的な管理タスク

OpenStack Networking (neutron) は、Red Hat OpenStack Platform のソフトウェア定義ネットワークのコンポーネントです。仮想ネットワークインフラストラクチャーにより、インスタンスと外部の物理ネットワークとの間の接続が可能になります。

本項では、お使いの Red Hat OpenStack Platform デプロイメントに合わせてサブネットやルーターを追加/削除するなど、一般的な管理タスクについて説明します。

5.1. ネットワークの作成

インスタンスが相互に通信し DHCP を使用して IP アドレスを受け取ることができるように、ネットワークを作成します。ネットワークを Red Hat OpenStack Platform デプロイメント内の外部ネットワークと統合することや、他の物理ネットワークと統合することも可能です。このような統合を行うと、インスタンスは外部のシステムと通信できるようになります。外部ネットワーク接続に関する詳しい情報は、「物理ネットワークのブリッジ」を参照してください。

ネットワークの作成時には、ネットワークで複数のサブネットをホスト可能である点を認識しておくことが重要です。これは、まったく異なるシステムを同じネットワークでホストし、それらのシステムを分離する場合に役立ちます。たとえば、1 つのサブネットでは Web サーバーのトラフィックだけが伝送されるようにする一方で、別のサブネットはデータベースのトラフィックが通過するように指定することができます。サブネットは相互に分離され、別のサブネットと通信する必要のあるインスタンスのトラフィックは、ルーターによって転送する必要があります。大量のトラフィックを必要とする複数のシステムを、同じサブネットに配置すると、ルーティングの必要がなく、ルーティングに伴うレイテンシーや負荷を回避することができます。

1. Dashboard で プロジェクト > ネットワーク > ネットワーク を選択します。

2. +ネットワークの作成 をクリックして、以下の項目を指定します。

フィールド説明

ネットワーク名

そのネットワークが果たす役割に基づいた説明的な名前。ネットワークを外部の VLAN と統合する場合には、名前に VLAN ID 番号を追記することを検討してください。たとえば、このサブネットで HTTP Web サーバーをホストし、VLAN タグが 122 の場合には webservers_122 とします。また、ネットワークトラフィックをプライベートにして、外部ネットワークと統合しない場合には、internal-only とします。

管理状態有効

このオプションにより、ネットワークを即時に利用可能にするかどうかを制御することができます。ネットワークを作成して、Down の状態に維持することが可能です。この場合、そのネットワークは論理的には存在しますが、アクティブではありません。このような設定は、そのネットワークを直ちに稼働させない場合に有用です。

3. 次へ ボタンをクリックして、サブネット タブで以下の項目を指定します。

フィールド説明

サブネットの作成

サブネットを作成するかどうかを決定します。たとえば、ネットワーク接続のないプレースホルダーとしてこのネットワークを維持する場合には、サブネットを作成しない方がよいでしょう。

サブネット名

サブネットの説明的な名前を入力します。

ネットワークアドレス

IP アドレス範囲とサブネットマスクが 1 つの値としてまとめられた CIDR 形式でアドレスを入力します。アドレスを判断するには、サブネットマスクでマスキングされたビット数を算出して、IP アドレス範囲の値に追記します。たとえば、サブネットマスク 255.255.255.0 でマスクされるビット数は 24 です。このマスクを IPv4 アドレス範囲 192.168.122.0 に使用するには、アドレスを 192.168.122.0/24 と指定します。

IP バージョン

インターネットプロトコルバージョンを指定します (有効なタイプは IPv4 または IPv6)。ネットワークアドレス フィールドの IP アドレスの範囲は、選択したバージョンと一致する必要があります。

ゲートウェイ IP

デフォルトゲートウェイに指定したルーターのインターフェースの IP アドレス。このアドレスは、外部ロケーションを宛先とするトラフィックルーティングの次のホップとなり、ネットワークアドレス フィールドで指定した範囲内でなければなりません。たとえば、CIDR 形式のネットワークアドレスが 192.168.122.0/24 の場合には、通常デフォルトのゲートウェイは 192.168.122.1 となります。

ゲートウェイなし

転送を無効にして、サブネットを分離した状態に保ちます。

4. 次へ をクリックして DHCP オプションを指定します。

  • DHCP 有効: そのサブネットの DHCP サービスを有効にします。DHCP を使用して、インスタンスへの IP 設定の割り当てを自動化することができます。
  • IPv6 アドレス: IPv6 ネットワークを作成する際の設定モード。IPv6 アドレスと追加の情報をどのように割り当てるかを指定します。

    • オプション指定なし: IP アドレスを手動で設定する場合または OpenStack が対応していない方法を使用してアドレスを割り当てる場合にはこのオプションを選択します。
    • SLAAC (Stateless Address Autoconfiguration): インスタンスは、ルーターから送信されるルーター広告 (RA) メッセージに基づいて IPv6 アドレスを生成します。OpenStack Networking ルーターオプションまたは外部ルーターオプションを選択します。この設定を使用すると、ra_mode が slaac に、address_mode が slaac に、それぞれ設定された OpenStack Networking サブネットが作成されます。
    • DHCPv6 stateful: インスタンスは、OpenStack Networking DHCPv6 サービスから、IPv6 アドレスや追加のオプション (例: DNS) を受信します。この設定を使用すると、ra_mode が dhcpv6-stateful に、address_mode が dhcpv6-stateful に、それぞれ設定されたサブネットが作成されます。
    • DHCPv6 stateless: インスタンスは、OpenStack Networking ルーターから送信されるルーター広告 (RA) メッセージに基づいて IPv6 アドレスを生成します。追加のオプション (例: DNS) は、OpenStack Networking DHCPv6 サービスから割り当てられます。この設定を使用すると、ra_mode が dhcpv6-stateless に、address_mode が dhcpv6-stateless に、それぞれ設定されたサブネットが作成されます。
  • IP アドレス割り当てプール: DHCP によって割り当てられる IP アドレスの範囲。たとえば、192.168.22.100,192.168.22.100 という値を指定すると、その範囲内で使用可能なアドレスはすべて 割り当ての対象 として考慮されます。
  • DNS サーバー: ネットワーク上で利用可能な DNS サーバーの IP アドレス。DHCP はこれらの IP アドレスをインスタンスに割り当てて名前解決します。
  • 追加のルート設定: 静的ホストルート。まず CIDR 形式で宛先のネットワークを指定し、続いてルーティングに使用する必要のある次のホップを指定します (例: 192.168.23.0/24, 10.1.31.1)。静的ルートをインスタンスに分散する必要がある場合には、この値を指定します。

5. 作成 をクリックします。

作成が完了したネットワークは、ネットワーク タブに表示されます。必要に応じて、ネットワークの編集 をクリックしてオプションを変更することもできます。インスタンスの作成時には、そのサブネットを使用するように設定できるようになりました。さらに、指定した DHCP オプションがインスタンスに適用されます。

5.2. 高度なネットワークの作成

管理者は、管理 の画面からネットワークを作成する際に高度なネットワークオプションを使用することができます。これらのオプションにより、使用するネットワーク種別を定義し、テナントを指定することができます。

1. Dashboard で、管理 > ネットワーク > ネットワーク > +ネットワークの作成 > プロジェクト を選択します。プロジェクト から新規ネットワークのホスト先となるプロジェクトを選択します。

2. プロバイダーネットワーク種別 でオプションを確認します。

  • ローカル: トラフィックはローカルの Compute ホストに残り、実質的には外部のネットワークから分離されます。
  • フラット: トラフィックは単一のネットワーク上に残り、ホストと共有することも可能となります。VLAN タグ付けやその他のネットワーク分離は行われません。
  • VLAN: 物理ネットワークに存在する VLAN に対応した VLAN ID を使用してネットワークを作成します。これにより、インスタンスは同じレイヤー 2 VLAN 上のシステムと通信することができます。
  • GRE: 複数のノードにまたがるネットワークオーバーレイを使用して、インスタンス間のプライベート通信を行います。オーバーレイの外部に送信されるトラフィックは、ルーティングする必要があります。
  • VXLAN: GRE と同様に、複数のノードにまたがるネットワークオーバーレイを使用して、インスタンス間のプライベート通信を行います。オーバーレイの外部に送信されるトラフィックは、ルーティングする必要があります。

ネットワークの作成 をクリックし、プロジェクトのネットワークトポロジーをチェックして、ネットワークが適切に作成されたことを確認します。

5.3. ネットワークルーティングの追加

新規ネットワークからのトラフィックのルーティングを許可するには、そのサブネットを既存の仮想ルーターへのインターフェースとして追加する必要があります。

1. Dashboard で プロジェクト > ネットワーク > ルーター を選択します。

2. ルーター 一覧で仮想ルーターの名前をクリックし、+インターフェースの追加 をクリックします。サブネット一覧で、新規サブネットの名前を選択します。インターフェースの IP アドレスを任意で指定することができます。

3. 送信 をクリックします。

ネットワーク上のインスタンスで、サブネットの外部のシステムとの通信ができるようになりました。

5.4. ネットワークの削除

以前に作成したネットワークを削除しなければならない場合があります (例: ハウスキーピングやデコミッションプロセスの一環としての処理など)。ネットワークを正常に削除するには、まず始めにまだネットワークを使用しているインターフェースを削除または切断する必要があります。以下の手順で、関連するインターフェースと共にプロジェクト内のネットワークを削除する方法について説明します。

1. Dashboard で プロジェクト > ネットワーク > ネットワーク を選択します。対象のネットワークサブネットに関連付けられたルーターインターフェースをすべて削除します。インターフェースを削除するには、ネットワーク 一覧で削除するネットワークをクリックして ID フィールドを確認し、対象ネットワークの ID 番号を特定します。このネットワークに関連付けられたすべてのサブネットの ネットワーク ID フィールドには、この値が使用されます。

2. プロジェクト > ネットワーク > ルーター を選択して、ルーター 一覧で対象の仮想ルーターの名前をクリックし、削除するサブネットに接続されているインターフェースを特定します。ゲートウェイ IP として機能していた IP アドレスで、他のサブネットと区別することができます。また、以前のステップで書き留めた ID とインターフェースのネットワーク ID が一致するかどうかを確認することで、さらに確実に識別することができます。

3. 対象のインターフェースの インターフェースの削除 ボタンをクリックします。

プロジェクト > ネットワーク > ネットワーク を選択して、ネットワークの名前をクリックします。対象のサブネットの サブネットの削除 ボタンをクリックします。

注記

この時点でサブネットをまだ削除できない場合には、インスタンスがすでにそのサブネットを使用していないかどうかを確認してください。

4. プロジェクト > ネットワーク > ネットワーク を選択し、削除するネットワークを選択します。

5. ネットワークの削除 をクリックします。

5.5. テナントのネットワークの削除

以前のリリースでは、過去にプロジェクトに割り当てられた古いリソースがプロジェクトの削除後にも残っている場合がありました。これには、ネットワーク、ルーター、ポートなどが含まれます。以前のリリースでは、これらの古いリソースは、正しい順序で慎重に手動で削除する必要がありました。Red Hat OpenStack Platform 10 はこの問題に対処し、neutron purge コマンドを使用して、特定のプロジェクトに以前に割り当てられた neutron リソースをすべて削除できるようになりました。

たとえば、削除前に test-project の neutron リソースを削除するには、以下の操作を実施します。

# openstack project list
+----------------------------------+--------------+
| ID                               | Name         |
+----------------------------------+--------------+
| 02e501908c5b438dbc73536c10c9aac0 | test-project |
| 519e6344f82e4c079c8e2eabb690023b | services     |
| 80bf5732752a41128e612fe615c886c6 | demo         |
| 98a2f53c20ce4d50a40dac4a38016c69 | admin        |
+----------------------------------+--------------+

# neutron purge 02e501908c5b438dbc73536c10c9aac0
Purging resources: 100% complete.
Deleted 1 security_group, 1 router, 1 port, 1 network.

# openstack project delete 02e501908c5b438dbc73536c10c9aac0

5.6. サブネットの作成

サブネットは、インスタンスにネットワーク接続を付与する手段です。インスタンスの作成プロセスの一環として、各インスタンスはサブネットに割り当てられるため、最適なインスタンスの配置を考慮してインスタンスの接続性の要件に対応することが重要です。サブネットは既存のネットワークに作成されます。OpenStack Networking のテナントネットワークでは、複数のサブネットをホストできることを念頭に置いておいてください。これは、まったく異なるシステムを同じネットワークでホストし、それらのシステムを分離する場合に役立ちます。たとえば、1 つのサブネットでは Web サーバーのトラフィックだけが伝送されるようにする一方で、別のサブネットはデータベースのトラフィックが通過するように指定することができます。サブネットは相互に分離され、別のサブネットと通信する必要のあるインスタンスのトラフィックは、ルーターによって転送する必要があります。大量のトラフィックを必要とする複数のシステムを、同じサブネットに配置すると、ルーティングの必要がなく、ルーティングに伴うレイテンシーや負荷を回避することができます。

5.6.1. 新規サブネットの作成

Dashboard で プロジェクト > ネットワーク > ネットワーク を選択して、ネットワーク ビューで対象のネットワークの名前をクリックします。

1. サブネットの作成 をクリックして、以下の項目を指定します。

フィールド説明

サブネット名

サブネットの説明的な名前

ネットワークアドレス

IP アドレス範囲とサブネットマスクが 1 つの値としてまとめられた CIDR 形式のアドレス。アドレスを判断するには、サブネットマスクでマスキングされたビット数を算出して、IP アドレス範囲の値に追記します。たとえば、サブネットマスク 255.255.255.0 でマスクされるビット数は 24 です。このマスクを IPv4 アドレス範囲 192.168.122.0 に使用するには、アドレスを 192.168.122.0/24 と指定します。

IP バージョン

インターネットプロトコルバージョン (有効なタイプは IPv4 または IPv6)。ネットワークアドレス フィールドの IP アドレスの範囲は、選択したバージョンと一致する必要があります。

ゲートウェイ IP

デフォルトゲートウェイに指定したルーターのインターフェースの IP アドレス。このアドレスは、外部ロケーションを宛先とするトラフィックルーティングの次のホップとなり、ネットワークアドレス フィールドで指定した範囲内でなければなりません。たとえば、CIDR 形式のネットワークアドレスが 192.168.122.0/24 の場合には、通常デフォルトのゲートウェイは 192.168.122.1 となります。

ゲートウェイなし

転送を無効にして、サブネットを分離した状態に保ちます。

2. 次へ をクリックして DHCP オプションを指定します。

  • DHCP 有効: そのサブネットの DHCP サービスを有効にします。DHCP を使用して、インスタンスへの IP 設定の割り当てを自動化することができます。
  • IPv6 アドレス: IPv6 ネットワークを作成する際の設定モード。IPv6 アドレスと追加の情報をどのように割り当てるかを指定します。

    • オプション指定なし: IP アドレスを手動で設定する場合または OpenStack が対応していない方法を使用してアドレスを割り当てる場合にはこのオプションを選択します。
    • SLAAC (Stateless Address Autoconfiguration): インスタンスは、ルーターから送信されるルーター広告 (RA) メッセージに基づいて IPv6 アドレスを生成します。OpenStack Networking ルーターオプションまたは外部ルーターオプションを選択します。この設定を使用すると、ra_mode が slaac に、address_mode が slaac に、それぞれ設定された OpenStack Networking サブネットが作成されます。
    • DHCPv6 stateful: インスタンスは、OpenStack Networking DHCPv6 サービスから、IPv6 アドレスや追加のオプション (例: DNS) を受信します。この設定を使用すると、ra_mode が dhcpv6-stateful に、address_mode が dhcpv6-stateful に、それぞれ設定されたサブネットが作成されます。
    • DHCPv6 stateless: インスタンスは、OpenStack Networking ルーターから送信されるルーター広告 (RA) メッセージに基づいて IPv6 アドレスを生成します。追加のオプション (例: DNS) は、OpenStack Networking DHCPv6 サービスから割り当てられます。この設定を使用すると、ra_mode が dhcpv6-stateless に、address_mode が dhcpv6-stateless に、それぞれ設定されたサブネットが作成されます。
  • IP アドレス割り当てプール: DHCP によって割り当てられる IP アドレスの範囲。たとえば、192.168.22.100,192.168.22.100 という値を指定すると、その範囲内で使用可能なアドレスはすべて 割り当ての対象 として考慮されます。
  • DNS サーバー: ネットワーク上で利用可能な DNS サーバーの IP アドレス。DHCP はこれらの IP アドレスをインスタンスに割り当てて名前解決します。
  • 追加のルート設定: 静的ホストルート。まず CIDR 形式で宛先のネットワークを指定し、続いてルーティングに使用する必要のある次のホップを指定します (例: 192.168.23.0/24, 10.1.31.1)。静的ルートをインスタンスに分散する必要がある場合には、この値を指定します。

3. 作成 をクリックします。

作成した新規サブネットは、ネットワークのサブネット一覧に表示されます。必要に応じて、編集 をクリックしてオプションを変更することができます。インスタンスの作成時に、このサブネットを使用するよう設定できるようになりました。その際、指定した DHCP オプションがインスタンスに適用されます。

5.7. サブネットの削除

使用しなくなったサブネットは削除することができます。ただし、インスタンスがまだそのサブネットを使用するように設定されている場合には、削除を試みても失敗し、Dashboard にエラーメッセージが表示されます。以下の手順では、ネットワーク内にある特定のサブネットを削除する方法を説明します。

Dashboard で プロジェクト > ネットワーク > ネットワーク を選択して、ネットワークの名前をクリックします。目的のサブネットを選択して、サブネットの削除 をクリックします。

5.8. ルーターの追加

OpenStack Networking は、SDN をベースとする仮想ルーターを使用したルーティングサービスを提供します。インスタンスが外部のサブネット (物理ネットワーク内のサブネットを含む) と通信するには、ルーターは必須です。ルーターとサブネットはインターフェースを使用して接続します。各サブネットにはルーターに接続するための独自のインターフェースが必要です。ルーターのデフォルトゲートウェイは、そのルーターが受信するトラフィックの次のホップを定義します。そのネットワークは通常、仮想ブリッジを使用して、外部の物理ネットワークにトラフィックをルーティングするように設定されます。

1. Dashboard で プロジェクト > ネットワーク > ルーター を選択し、+ルーターの作成 をクリックします。

2. 新規ルーターの説明的な名前を入力し、ルーターの作成 をクリックします。

3. ルーター 一覧に新たに追加されたルーターのエントリーの横にある ゲートウェイの設定 をクリックします。

4. 外部ネットワーク の一覧で、外部ロケーション宛のトラフィックを受信するネットワークを指定します。

5. 送信 をクリックします。ルーターを追加した後に行う次のステップでは、作成済みのサブネットがこのルーターを使用してトラフィックを送信するように設定します。そのためには、サブネットとルーター間のインターフェースを作成します。

5.9. ルーターの削除

インターフェースが接続されていないルーターは削除することができます。以下の手順では、最初にルーターのインターフェースを削除してからルーター自体を削除するステップを説明します。

1. Dashboard で プロジェクト > ネットワーク > ルーター を選択し、削除するルーターの名前をクリックします。

2. 種別が 内部インタフェース のインターフェースを選択します。インターフェースの削除 をクリックします。

3. ルーター 一覧から対象のルーターを選択して ルーターの削除 をクリックします。

5.10. インターフェースの追加

インターフェースにより、ルーターをサブネットと相互接続することができます。これにより、ルーターはインスタンスが中継サブネット外部の宛先に送信したトラフィックを転送することができます。以下の手順では、ルーターのインターフェースを追加して、サブネットに接続します。以下の手順では、ネットワークトポロジー機能を使用します。この画面には、全仮想ルーターとネットワークを示した図が表示され、ネットワーク管理タスクを実行することができます。

1. Dashboard で プロジェクト > ネットワーク > ネットワークトポロジー を選択します。

2. 管理するルーターを特定してその上にカーソルを移動し、+インターフェースの追加 をクリックします。

3. ルーターを接続するサブネットを指定します。オプションで IP アドレスを指定することができます。インターフェースに対して ping を実行して成功した場合には、トラフィックのルーティングが想定通りに機能していることが確認できるので、このアドレスを指定しておくとテストやトラブルシューティングに役立ちます。

4. 送信 をクリックします。

ネットワークトポロジー の図が自動的に更新され、ルーターとサブネットの間の新規インターフェース接続が反映されます。

5.11. インターフェースの削除

ルーターがサブネットのトラフィックを転送する必要がなくなった場合には、サブネットへのインターフェースを削除することができます。以下の手順では、インターフェースの削除に必要なステップを説明します。

1. Dashboard で プロジェクト > ネットワーク > ルーター を選択します。

2. 削除するインターフェースをホストしているルーターの名前をクリックします。

3. (種別が 内部インタフェース の) インターフェースを選択し、インターフェースの削除 をクリックします。

5.12. IP アドレスの設定

本項に記載する手順に従って OpenStack Networking における IP アドレスの確保を管理することができます。

5.12.1. Floating IP アドレスプールの作成

Floating IP アドレスにより、ネットワークの受信トラフィックを OpenStack インスタンスに転送することができます。まず、適切にルーティング可能な外部 IP アドレスのプールを定義します。それらの IP アドレスは、インスタンスに動的に割り当てることができます。OpenStack Networking は、特定の Floating IP アドレス宛の受信トラフィックをすべて、その Floating IP アドレスが割り当てられたインスタンスにルーティングする必要があることを認識します。

注記

OpenStack Networking は、同じ IP 範囲/CIDR から全プロジェクト (テナント) に Floating IP アドレスを確保します。これは、Floating IP のサブネットはすべて、全プロジェクトまたはいずれかのプロジェクトで使用できることを意味します。この動作は、個別のプロジェクトごとのクォータを使用することで管理できます。たとえば、ProjectAProjectB のクォータのデフォルトを 10 に設定する一方、ProjectC のクォータを 0 に設定することができます。

Floating IP アドレスを確保するプールは、外部サブネットの作成時に定義されます。サブネットが Floating IP アドレスのみをホストする場合には、enable_dhcp=False オプションを使用して DHCP の割り当てを無効にすることを検討してください。

# neutron subnet-create --name SUBNET_NAME --enable_dhcp=False --allocation_pool start=IP_ADDRESS,end=IP_ADDRESS --gateway=IP_ADDRESS NETWORK_NAME CIDR

以下に例を示します。

# neutron subnet-create --name public_subnet --enable_dhcp=False --allocation_pool start=192.168.100.20,end=192.168.100.100 --gateway=192.168.100.1 public 192.168.100.0/24

5.12.2. 特定の Floating IP アドレスの割り当て

nova コマンドを使用して (あるいは Dashboard を使用して:「インスタンスの更新 (アクションメニュー)」セクションを参照)、特定の Floating IP アドレスをインスタンスに割り当てることが可能です。

# nova floating-ip-associate INSTANCE_NAME IP_ADDRESS

以下の例では、Floating IP アドレスは corp-vm-01 という名前のインスタンスに確保されます。

# nova floating-ip-associate corp-vm-01 192.168.100.20

5.12.3. Floating IP アドレスの無作為な割り当て

Floating IP アドレスはインスタンスに動的に確保することができます。特定の IP アドレスを選択する代わりに、OpenStack Networking がプールからアドレスを 1 つ確保するように要求します。以前に作成したプールから Floating IP アドレスを確保します。

# neutron floatingip-create public
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| fixed_ip_address    |                                      |
| floating_ip_address | 192.168.100.20                       |
| floating_network_id | 7a03e6bc-234d-402b-9fb2-0af06c85a8a3 |
| id                  | 9d7e2603482d                         |
| port_id             |                                      |
| router_id           |                                      |
| status              | ACTIVE                               |
| tenant_id           | 9e67d44eab334f07bf82fa1b17d824b6     |
+---------------------+--------------------------------------+

IP アドレスが確保されたら、特定のインスタンスに割り当てることができます。インスタンスに関連付けられているポートの ID を特定します (これは、インスタンスに確保されている Fixed IP と一致します)。このポート ID は、以下のステップでインスタンスのポート ID を Floating IP アドレスの ID に関連付けるのに使用します。3 番目のコラムの MAC アドレスがインスタンスの MAC アドレスと一致するようにすることで、正しいポート ID をさらに区別することが可能です。

# neutron port-list
+--------+------+-------------+--------------------------------------------------------+
| id     | name | mac_address | fixed_ips                                              |
+--------+------+-------------+--------------------------------------------------------+
| ce8320 |      | 3e:37:09:4b | {"subnet_id": "361f27", "ip_address": "192.168.100.2"} |
| d88926 |      | 3e:1d:ea:31 | {"subnet_id": "361f27", "ip_address": "192.168.100.5"} |
| 8190ab |      | 3e:a3:3d:2f | {"subnet_id": "b74dbb", "ip_address": "10.10.1.25"}|
+--------+------+-------------+--------------------------------------------------------+

neutron コマンドを使用して、対象となるインスタンスのポート ID に Floating IP アドレスを関連付けます。

# neutron floatingip-associate 9d7e2603482d 8190ab

5.13. 複数の Floating IP アドレスプールの作成

OpenStack Networking は、1 つの L3 エージェントにつき 1 つの Floating IP プールをサポートします。したがって、L3 エージェントをスケールアウトすることによって追加の Floating IP プールを作成することができます。

注記

/etc/neutron/neutron.confhandle_internal_only_routers の値が環境内の 1 つの L3 エージェントに対してのみ True に設定されていることを確認してください。このオプションにより、L3 エージェントは外部ルーター以外だけを管理するようになります。

5.14. 物理ネットワークのブリッジ

以下の手順では、仮想ネットワークを物理ネットワークにブリッジして仮想インスタンスとの間の接続を可能にします。以下の手順では、例として示した物理インターフェース eth0 はブリッジ br-ex にマッピングされます。この仮想ブリッジは、物理ネットワークと仮想ネットワーク間を中継する機能を果たします。これにより、eth0 を通過するすべてのトラフィックは、設定した Open vSwitch を使用してインスタンスに到達します。物理 NIC を仮想 Open vSwitch ブリッジにマッピングします (詳しくは、「13章ブリッジマッピングの設定」を参照)。

注記

IPADDRNETMASK GATEWAY、および DNS1 (ネームサーバー) は、対象のネットワークと一致するように更新する必要があります。

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
TYPE=OVSPort
DEVICETYPE=ovs
OVS_BRIDGE=br-ex
ONBOOT=yes

eth0 に以前確保されていた IP アドレスの情報を使用して仮想ブリッジを設定します。

# vi /etc/sysconfig/network-scripts/ifcfg-br-ex
DEVICE=br-ex
DEVICETYPE=ovs
TYPE=OVSBridge
BOOTPROTO=static
IPADDR=192.168.120.10
NETMASK=255.255.255.0
GATEWAY=192.168.120.1
DNS1=192.168.120.1
ONBOOT=yes

インスタンスに Floating IP アドレスを割り当てて、物理ネットワークが利用できるようにすることができます。

第6章 IP アドレス使用のプランニング

OpenStack のデプロイメントでは、予想以上の数の IP アドレスが使用される可能性があります。本項は、必要な数のアドレスを適切に予測できるようにサポートすることを目的とし、さらに IP アドレスがどこで使用されるかを説明します。

注記

VIP (別称: 仮想 IP アドレス): 仮想 IP アドレスとは HA サービスをホストし、基本的に複数のコントローラーノード間で共有される IP アドレスです。

6.1. 複数の VLAN の使用

OpenStack のデプロイメントを計画する際には、デプロイメントに使用するサブネットの数から開始します。この数に基づいて、各アドレスをどのように使用していくかを割り当てることができるはずです。複数のサブネットを使用すると、システム間のトラフィックを VLAN に分割することができます。たとえば、通常は、管理または API トラフィックは、Web トラフィックにサービスを提供するシステムと同じネットワークを共有しないようにする必要があります。また VLAN 間のトラフィックは、ルーター経由で伝送する必要があります。この構成では、ファイアウォールを設置してトラフィックフローをさらに制御することができます。

6.2. VLAN トラフィックの分離

通常、異種のネットワークトラフィックをホストする場合には、別個の VLAN をトラフィックに割り当てます。たとえば、各種ネットワークごとに別の VLAN を指定します。この中で、外部ネットワークだけは外部の物理ネットワークにルーティングが可能でなければなりません。本リリースでは、DHCP サービスは director により提供されます。

注記

本項で説明するすべての分離 VLAN が、すべての OpenStack デプロイメントで必要な訳ではありません。たとえば、クラウドユーザーがアドホックの仮想ネットワークをオンデマンドで作成する必要がない場合には、テナントネットワークが必要ない可能性があります。各仮想マシンを他の物理システムと同じスイッチに直接接続する必要があるだけの場合には、コンピュートノードをプロバイダーネットワークに直接接続し、インスタンスがプロバイダーネットワークを直接使用するようにするだけでよいでしょう。

  • プロビジョニングネットワーク: この VLAN は、PXE ブートで director を使用して新規ノードをデプロイするためだけに特化されています。OpenStack Orchestration (heat) は、OpenStack をオーバークラウドのベアメタルサーバーにインストールします。これらのサーバーは、物理ネットワークにアタッチされており、アンダークラウドのインフラストラクチャーから OpenStack Platform のインストールイメージを取得します。
  • 内部 API ネットワーク: 内部 API ネットワークは、API 通信、RPC メッセージ、データベース通信経由で OpenStack のサービス間の通信を行う際に使用します。さらに、このネットワークは、コントローラーノード間の稼働メッセージの通信にも使用されます。IP アドレスの割り当てを計画する際には、各 API サービスには独自の IP アドレスが必要である点を念頭に置いてください。具体的には、以下のサービスごとに IP アドレスが必要です。

    • vip-msg (ampq)
    • vip-keystone-int
    • vip-glance-int
    • vip-cinder-int
    • vip-nova-int
    • vip-neutron-int
    • vip-horizon-int
    • vip-heat-int
    • vip-ceilometer-int
    • vip-swift-int
    • vip-keystone-pub
    • vip-glance-pub
    • vip-cinder-pub
    • vip-nova-pub
    • vip-neutron-pub
    • vip-horizon-pub
    • vip-heat-pub
    • vip-ceilometer-pub
    • vip-swift-pub
注記

高可用性を使用する場合には、Pacemaker による仮想 IP アドレスの物理ノード間の移動が可能でなければなりません。

  • ストレージ: Block Storage、NFS、iSCSI など。理想的には、これはパフォーマンスの関係上、別の物理イーサネットリンクに分離します。
  • ストレージ管理: OpenStack Object Storage (swift) は、参加するレプリカノード間でデータオブジェクトを同期するために、このネットワークを使用します。プロキシーサービスは、ユーザー要求と下層のストレージレイヤーの間の仲介インターフェースとして機能します。プロキシーは、受信要求を受け取り、必要なレプリカの位置を特定して要求データを取得します。Ceph バックエンドを使用するサービスは、Ceph と直接対話せずにフロントエンドのサービスを使用するため、ストレージ管理ネットワーク経由で接続を確立します。RBD ドライバーは例外で、このトラフィックは直接 Ceph に接続する点に注意してください。
  • テナントネットワーク: Neutron は、VLAN 分離 (各テナントネットワークがネットワーク VLAN) または VXLAN か GRE によるトンネリングを使用した独自のネットワークを各テナントに提供します。ネットワークトラフィックは、テナントのネットワークごとに分離されます。テナントネットワークには IP サブネットが割り当てられており、複数のテナントネットワークが同じアドレスを使用する場合があります。
  • 外部: 外部ネットワークは、パブリック API エンドポイントと Dashboard (horizon) への接続をホストします。オプションでこれと同じネットワークを SNAT に使用することもできますが、必須ではありません。実稼働環境のデプロイでは、大抵の場合、Floating IP アドレスと NAT に別のネットワークが使用されます。
  • プロバイダーネットワーク: これらのネットワークでは、インスタンスを既存のネットワークインフラストラクチャーにアタッチすることができます。フラットネットワークまたは VLAN タグでデータセンターの既存の物理ネットワークに直接マッピングするために、プロバイダーネットワークを使用することができます。これにより、インスタンスは、OpenStack Networking インフラストラクチャー外部のシステムと同じレイヤー 2 ネットワークを共有することができます。

6.3. IP アドレスの消費

以下のシステムは割り当てられた範囲からの IP アドレスを消費します。

  • 物理ノード: 物理 NIC ごとに IP アドレスが 1 つ必要です。物理 NIC に固有の機能を割り当てるのが一般的な慣習です。たとえば、管理トラフィックと NFS トラフィックは、それぞれ 1つずつ物理 NIC が割り当てられます (時には複数の NIC を使用して冗長化の目的で異なるスイッチ間を接続します)。
  • 高可用性の仮想 IP (VIP): コントローラーノード間で共有されるネットワーク 1 つにつき 1 - 3 個程度割り当てられることが予想されます。

6.4. 仮想ネットワーク

これらの仮想リソースは、OpenStack Networking の IP アドレスを消費します。これらはクラウドインフラストラクチャーではローカルとみなされ、外部の物理ネットワークにあるシステムから到達可能である必要はありません。

  • テナントネットワーク: 各テナントネットワークには、IP アドレスをインスタンスに割り当てるためのサブネットが必要です。
  • 仮想ルーター: サブネットに結線する各ルーターのインターフェースには IP アドレス が 1 つ必要です (DHCP が有効化されている場合には追加でもう 1 つアドレスが必要です)。
  • インスタンス: 各インスタンスには、ホストされるテナントのサブネットからのアドレスが必要です。受信トラフィックが必要な場合には、指定の外部ネットワークから、追加の Floating IP アドレスを確保する必要があります。
  • 管理トラフィック: OpenStack サービスと API トラフィックを含みます。Red Hat OpenStack Platform 10 では、仮想 IP アドレスに対する要件が軽減され、代わりにすべてのサービスが少数の仮想 IP を共有するようになりました。API、RPC、データベースサービスは、内部 API の仮想 IP で通信します。

6.5. ネットワークプランの例

以下の例には、複数のサブネットに対応する、さまざまなネットワークを示しています。各サブネットには IP アドレスの範囲が 1 つ割り当てられます。

表6.1 サブネットプランの例

サブネット名アドレス範囲アドレス数サブネットマスク

プロビジョニングネットワーク

192.168.100.1 - 192.168.100.250

250

255.255.255.0

内部 API ネットワーク

172.16.1.10 - 172.16.1.250

241

255.255.255.0

ストレージ

172.16.2.10 - 172.16.2.250

241

255.255.255.0

ストレージ管理

172.16.3.10 - 172.16.3.250

241

255.255.255.0

テナントネットワーク (GRE/VXLAN)

172.19.4.10 - 172.16.4.250

241

255.255.255.0

外部ネットワーク (Floating IP など)

10.1.2.10 - 10.1.3.222

469

255.255.254.0

プロバイダーネットワーク (インフラストラクチャー)

10.10.3.10 - 10.10.3.250

241

255.255.252.0

第7章 OpenStack Networking ルーターポートのレビュー

OpenStack Networking の仮想ルーターは、ポートを使用してサブネットと相互接続します。これらのポートの状態を確認して、想定通りに接続されているかどうかを判断できます。

7.1. ポートの現在のステータスの表示

以下の手順では、特定のルーターに接続されたポートをすべて一覧表示し、ポートの状態 (DOWN または ACTIVE) を取得する方法を解説します。

1. r1 という名前のルーターにアタッチされているポートをすべて表示します。

#  neutron router-port-list r1

結果の例:

+--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+
| id                                   | name | mac_address       | fixed_ips                                                                            |
+--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+
| b58d26f0-cc03-43c1-ab23-ccdb1018252a |      | fa:16:3e:94:a7:df | {"subnet_id": "a592fdba-babd-48e0-96e8-2dd9117614d3", "ip_address": "192.168.200.1"} |
| c45e998d-98a1-4b23-bb41-5d24797a12a4 |      | fa:16:3e:ee:6a:f7 | {"subnet_id": "43f8f625-c773-4f18-a691-fd4ebfb3be54", "ip_address": "172.24.4.225"}  |
+--------------------------------------+------+-------------------+--------------------------------------------------------------------------------------+

2. ポートの ID (値は左のコラムに記載) に対して以下のコマンドを実行して、各ポートの詳細を表示します。コマンドの結果にはポートの ステータス が含まれており、以下の例ではステータスが ACTIVE であることが分かります。

# neutron port-show b58d26f0-cc03-43c1-ab23-ccdb1018252a

結果の例:

+-----------------------+--------------------------------------------------------------------------------------+
| Field                 | Value                                                                                |
+-----------------------+--------------------------------------------------------------------------------------+
| admin_state_up        | True                                                                                 |
| allowed_address_pairs |                                                                                      |
| binding:host_id       | node.example.com                                                      |
| binding:profile       | {}                                                                                   |
| binding:vif_details   | {"port_filter": true, "ovs_hybrid_plug": true}                                       |
| binding:vif_type      | ovs                                                                                  |
| binding:vnic_type     | normal                                                                               |
| device_id             | 49c6ebdc-0e62-49ad-a9ca-58cea464472f                                                 |
| device_owner          | network:router_interface                                                             |
| extra_dhcp_opts       |                                                                                      |
| fixed_ips             | {"subnet_id": "a592fdba-babd-48e0-96e8-2dd9117614d3", "ip_address": "192.168.200.1"} |
| id                    | b58d26f0-cc03-43c1-ab23-ccdb1018252a                                                 |
| mac_address           | fa:16:3e:94:a7:df                                                                    |
| name                  |                                                                                      |
| network_id            | 63c24160-47ac-4140-903d-8f9a670b0ca4                                                 |
| security_groups       |                                                                                      |
| status                | ACTIVE                                                                               |
| tenant_id             | d588d1112e0f496fb6cac22f9be45d49                                                     |
+-----------------------+--------------------------------------------------------------------------------------+

ポートごとにこの手順を実行して、ステータスを取得します。

第8章 プロバイダーネットワークのトラブルシューティング

仮想ルーターとスイッチのデプロイメントは、ソフトウェア定義ネットワーク (SDN) としても知られており、一見すると (デプロイメントが) 複雑化しているように感じる場合があります。しかし、OpenStack Networking のネットワークの接続性をトラブルシュートする診断プロセスは、物理ネットワークの診断プロセスとよく似ています。VLAN を使用する場合は、仮想インフラストラクチャーは、全く別の環境ではなく、物理ネットワークのトランク接続による広帯域化と考えることができます。

8.1. 本項の構成

  • 基本的な ping 送信テスト
  • VLAN ネットワークのトラブルシューティング
  • テナントネットワーク内からのトラブルシューティング

8.2. 基本的な ping 送信テスト

ping コマンドは、ネットワーク接続の問題解析に役立つツールです。ping コマンドで返される結果は、ネットワーク接続に関する基本的な指標として機能しますが、実際のアプリケーショントラフィックをブロックするファイアウォールなど、すべての接続性の問題を完全に除外する訳ではありません。ping コマンドは、指定の宛先にトラフィックを送信することで機能し、次に ping 送信の試行に問題がなかったかどうかを報告します。

注記

ping コマンドは、ICMP トラフィックが途中にあるファイアウォールを通過できることを想定します。

ping テストは、ネットワークの問題が発生しているマシンから実行すると最も有効です。そのため、マシンが完全にオフラインの場合には、VNC 管理コンソール経由でコマンドラインに接続する必要がある場合があります。

たとえば、以下の ping のテストコマンドを成功させるには、複数のネットワークインフラストラクチャー層を検証する必要があります。つまり、名前の解決、IP ルーティング、ネットワークスイッチのすべてが正常に機能していなければなりません。

$ ping www.redhat.com

PING e1890.b.akamaiedge.net (125.56.247.214) 56(84) bytes of data.
64 bytes from a125-56.247-214.deploy.akamaitechnologies.com (125.56.247.214): icmp_seq=1 ttl=54 time=13.4 ms
64 bytes from a125-56.247-214.deploy.akamaitechnologies.com (125.56.247.214): icmp_seq=2 ttl=54 time=13.5 ms
64 bytes from a125-56.247-214.deploy.akamaitechnologies.com (125.56.247.214): icmp_seq=3 ttl=54 time=13.4 ms
^C

ping コマンドの結果のサマリーが表示されたら、Ctrl+c で ping コマンドを終了することができます。パケットロスがない場合は、タイムリーかつ安定した接続であることが分かります。

--- e1890.b.akamaiedge.net ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 13.461/13.498/13.541/0.100 ms

さらに、テストする宛先によっては、ping テストの結果は非常に明確な場合があります。たとえば、以下の図では、VM1 において何らかの接続性の問題が発生しています。接続が可能な宛先を青の番号で示しています。また、成功結果または失敗結果から導かれた結論を記載しています。 path troubleshooting

1. インターネット: 一般的な最初のステップは、www.redhat.com などのインターネットロケーションに ping テストを送信することです。

  • 成功: このテストは、送信元と送信先の間にあるさまざまなネットワークポイントすべてが期待通りに機能していることを示します。これには、仮想/物理インフラストラクチャーが含まれます。
  • 失敗: 遠隔にあるインターネットロケーションへの ping テストは、さまざまな部分で失敗する可能性があります。ネットワーク上の他のマシンがインターネットに正常に ping 送信できる場合には、インターネット接続は機能していることが分かり、使用しているマシンにもう少し近い箇所でトラブルシューティングを行う必要があります。

2. 物理ルーター: これは、外部の宛先にトラフィックを転送するために、ネットワーク管理者が指定したルーターインターフェースです。

  • 成功: 物理ルーターに ping テストを行って、ローカルネットワークと基盤のスイッチが機能しているかどうかを検証することができます。このパケットは、ルーターを通過しないため、デフォルトのゲートウェイにルーティングの問題があるかどうかは分かりません。
  • 失敗: これは、VM1 とデフォルトゲートウェイの間で問題があることを示しています。ルーター/スイッチがダウンしているか、不正なデフォルトゲートウェイを使用している可能性があります。機能していることを確認済みの別のサーバーと、設定内容を比較してください。また、ローカルネットワーク上の別のサーバーに ping 送信を試行してみてください。

3. Neutron ルーター: これは、Red Hat OpenStack Platform が仮想マシントラフィックの転送に使用する仮想 SDN (ソフトウェア定義ネットワーク) ルーターです。

  • 成功: ファイアウォールが ICMP トラフィックを許可し、ネットワークノードがオンラインの状態です。
  • 失敗: インスタンスのセキュリティーグループで、ICMP トラフィックが許可されているかどうかを確認してください。また、ネットワークノードがオンラインで、必要なサービスすべてが実行中であることをチェックし、L3 エージェントのログ (/var/log/neutron/l3-agent.log) を確認してください。

4. 物理スイッチ: 物理スイッチは、同じ物理ネットワーク上にあるノード間のトラフィックを管理する役割を果たします。

  • 成功: 仮想マシンが物理スイッチへ送信したトラフィックは、仮想ネットワークインフラストラクチャーを通過する必要があります。つまり、このセグメントが想定通りに機能していることが分かります。
  • 失敗: 必要な VLAN をトランク接続するように物理スイッチポートが設定されていることを確認します。

5. VM2: 同じコンピュートノード上にある、同じサブネットの仮想マシンに ping 送信を試行します。

  • 成功: VM1 上の NIC ドライバーと基本的な IP 設定が機能しています。
  • 失敗: VM1 のネットワーク設定を検証します。問題がない場合には、VM2 のファイアウォールが単に ping トラフィックをブロックしている可能性があります。また、仮想スイッチが正しく設定されていることをチェックし、Open vSwitch (または Linux Bridge) のログファイルを確認します。

8.3. VLAN ネットワークのトラブルシューティング

OpenStack Newtorking は、VLAN ネットワークをトランク接続して SDN スイッチに到達することができます。VLAN のタグ付けがされたプロバイダーネットワークに対するサポートがあると、仮想インスタンスを物理ネットワークにあるサーバーのサブネットと統合することができます。

VLAN プロバイダーネットワークへの接続のトラブルシューティングを行うには、ネットワークの作成時に指定したゲートウェイ IP に ping 送信をしてみてください。たとえば、以下のコマンドでネットワークを作成している場合には、

# neutron net-create provider --provider:network_type=vlan --provider:physical_network=phy-eno1 --provider:segmentation_id=120
# neutron subnet-create "provider" --allocation-pool start=192.168.120.1,end=192.168.120.253 --disable-dhcp --gateway 192.168.120.254 192.168.120.0/24

定義済みのゲートウェイの IP 192.168.120.254 に ping を送信してください。

これに失敗した場合には、関連付けられた VLAN (ネットワーク作成時に定義済み) へのネットワークフローがあることを確認してください。上記の例では、OpenStack Networking は VLAN 120 をプロバイダーネットワークにトランク接続するように設定されています。このオプションは --provider:segmentation_id=120 のパラメーターを使用して設定します。

ブリッジインターフェース (今回の場合は br-ex という名前) の VLAN フローを確認します。

# ovs-ofctl dump-flows br-ex

 NXST_FLOW reply (xid=0x4):
  cookie=0x0, duration=987.521s, table=0, n_packets=67897, n_bytes=14065247, idle_age=0, priority=1 actions=NORMAL
  cookie=0x0, duration=986.979s, table=0, n_packets=8, n_bytes=648, idle_age=977, priority=2,in_port=12 actions=drop

8.3.1. VLAN 設定とログファイルの確認

  • OpenStack Networking (neutron) エージェント: neutron コマンドを使用して、すべてのエージェントが稼働し、正しい名前で登録されていることを確認します。
# neutron agent-list
+--------------------------------------+--------------------+-----------------------+-------+----------------+
| id                                   | agent_type         | host                  | alive | admin_state_up |
+--------------------------------------+--------------------+-----------------------+-------+----------------+
| a08397a8-6600-437d-9013-b2c5b3730c0c | Metadata agent     | rhelosp.example.com   | :-)   | True           |
| a5153cd2-5881-4fc8-b0ad-be0c97734e6a | L3 agent           | rhelosp.example.com   | :-)   | True           |
| b54f0be7-c555-43da-ad19-5593a075ddf0 | DHCP agent         | rhelosp.example.com   | :-)   | True           |
| d2be3cb0-4010-4458-b459-c5eb0d4d354b | Open vSwitch agent | rhelosp.example.com   | :-)   | True           |
+--------------------------------------+--------------------+-----------------------+-------+----------------+
  • /var/log/neutron/openvswitch-agent.log を確認します。このログでは、作成プロセスで ovs-ofctl コマンドを使用して VLAN のトランク接続が設定されたことが確認できるはずです。
  • /etc/neutron/l3_agent.ini ファイルで external_network_bridge を確認します。ここで値がハードコードされている場合は、L3 エージェント経由でプロバイダーネットワークを使用できず、必要なフローが作成されません。したがって、この値は external_network_bridge = "" のようになるはずです。
  • /etc/neutron/plugin.ini ファイルで network_vlan_ranges を確認します。プロバイダーネットワークを使用している場合には、数字の VLAN ID を指定する必要はありません。VLAN を分離したテナントネットワークを使用している場合にのみ、ここに ID を指定する必要があります。
  • OVS エージェントの設定ファイルのブリッジマッピングを検証し、phy-eno1 にマッピングされているブリッジが存在することと、eno1 に適切に接続されていることを確認します。

8.4. テナントネットワーク内からのトラブルシューティング

OpenStack Networking では、テナントトラフィックはすべて、ネットワークの名前空間に含まれます。これにより、テナントは、テナント間の干渉なしにネットワークの設定が可能になります。たとえば、ネットワーク名前空間を使用することで異なるテナントが干渉することなしに 192.168.1.1/24 の同じサブネット範囲を指定することができます。

テナントネットワークのトラブルシューティングを開始するに、まず対象のネットワークがどのネットワーク名前空間に含まれているかを確認します。

1. neutron コマンドを使用して、すべてのテナントネットワークを一覧表示します。

# neutron net-list
+--------------------------------------+-------------+-------------------------------------------------------+
| id                                   | name        | subnets                                               |
+--------------------------------------+-------------+-------------------------------------------------------+
| 9cb32fe0-d7fb-432c-b116-f483c6497b08 | web-servers | 453d6769-fcde-4796-a205-66ee01680bba 192.168.212.0/24 |
| a0cc8cdd-575f-4788-a3e3-5df8c6d0dd81 | private     | c1e58160-707f-44a7-bf94-8694f29e74d3 10.0.0.0/24      |
| baadd774-87e9-4e97-a055-326bb422b29b | private     | 340c58e1-7fe7-4cf2-96a7-96a0a4ff3231 192.168.200.0/24 |
| 24ba3a36-5645-4f46-be47-f6af2a7d8af2 | public      | 35f3d2cb-6e4b-4527-a932-952a395c4bb3 172.24.4.224/28  |
+--------------------------------------+-------------+-------------------------------------------------------+

この例では、web-servers ネットワークを検証します。web-server の行の id の値をメモしてください (この例では 9cb32fe0-d7fb-432c-b116-f483c6497b08 です)。この値は、ネットワーク名前空間に追加されており、次のステップで特定がしやすくなります。

2. ip コマンドを使用して、ネットワークの名前空間をすべて一覧表示します。

# ip netns list
qdhcp-9cb32fe0-d7fb-432c-b116-f483c6497b08
qrouter-31680a1c-9b3e-4906-bd69-cb39ed5faa01
qrouter-62ed467e-abae-4ab4-87f4-13a9937fbd6b
qdhcp-a0cc8cdd-575f-4788-a3e3-5df8c6d0dd81
qrouter-e9281608-52a6-4576-86a6-92955df46f56

この結果では、web-server のネットワーク ID と一致する名前空間が存在します。この例では、qdhcp-9cb32fe0-d7fb-432c-b116-f483c6497b08 と表示されています。

3. この名前空間内でコマンドを実行して web-servers ネットワークの設定を検証します。これには、トラブルシューティングのコマンドの先頭に ip netns exec (namespace) を追加します。以下に例を示します。

a) web-servers ネットワークのルーティングテーブルを表示する場合:

# ip netns exec qrouter-62ed467e-abae-4ab4-87f4-13a9937fbd6b route -n

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.24.4.225    0.0.0.0         UG    0      0        0 qg-8d128f89-87
172.24.4.224    0.0.0.0         255.255.255.240 U     0      0        0 qg-8d128f89-87
192.168.200.0   0.0.0.0         255.255.255.0   U     0      0        0 qr-8efd6357-96

b) web-servers ネットワークのルーティングテーブルを表示する場合:

# ip netns exec qrouter-62ed467e-abae-4ab4-87f4-13a9937fbd6b route -n

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.24.4.225    0.0.0.0         UG    0      0        0 qg-8d128f89-87
172.24.4.224    0.0.0.0         255.255.255.240 U     0      0        0 qg-8d128f89-87
192.168.200.0   0.0.0.0         255.255.255.0   U     0      0        0 qr-8efd6357-96

8.4.1. 名前空間内での高度な ICMP テストの実行

1. tcpdump コマンドを使用して、ICMP トラフィックを取得します。

# ip netns exec qrouter-62ed467e-abae-4ab4-87f4-13a9937fbd6b tcpdump -qnntpi any icmp

次のステップを実行するまで何も出力が表示されない可能性があります。

2. 別のコマンドラインウィンドウで、外部ネットワークへの ping テストを実行します。

# ip netns exec qrouter-62ed467e-abae-4ab4-87f4-13a9937fbd6b  ping www.redhat.com

3. tcpdump セッションを実行するターミナルで、ping テストの詳細結果を確認します。

tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 65535 bytes
IP (tos 0xc0, ttl 64, id 55447, offset 0, flags [none], proto ICMP (1), length 88)
    172.24.4.228 > 172.24.4.228: ICMP host 192.168.200.20 unreachable, length 68
	IP (tos 0x0, ttl 64, id 22976, offset 0, flags [DF], proto UDP (17), length 60)
    172.24.4.228.40278 > 192.168.200.21: [bad udp cksum 0xfa7b -> 0xe235!] UDP, length 32
注記

トラフィックの tcpdump 分析を実行する際には、インスタンスではなくルータインターフェース方向の応答パケットが確認される場合があります。これは、qrouter によりリターンパケットで DNAT が実行されるため、想定通りの動作です。

第9章 物理ネットワークへのインスタンスの接続

本章では、プロバイダーネットワークを使用して外部ネットワークに直接インスタンスを接続する方法を説明します。

OpenStack Networking トポロジーの概要

OpenStack Networking (neutron) には、さまざまなノード種別に分散される 2 種類のサービスがあります。

  • Neutron サーバー: このサービスは、エンドユーザーとサービスが OpenStack Networking と対話するための API を提供する OpenStack Networking API サーバーを実行します。このサーバーは、下層のデータベースと統合して、テナントネットワーク、ルーター、ロードバランサーの詳細などを保管します。
  • Neutron エージェント: これらは、OpenStack Networking のネットワーク機能を実行するサービスです。

    • neutron-dhcp-agent: テナントプライベートネットワークの DHCP IP アドレスを管理します。
    • neutron-l3-agent: テナントプライベートネットワーク、外部ネットワークなどの間のレイヤー 3 ルーティングを実行します。
    • neutron-lbaas-agent: テナントにより作成された LBaaS ルーターをプロビジョニングします。
  • コンピュートノード: このノードは、仮想マシン (別称: インスタンス) を実行するハイパーバイザーをホストします。コンピュートノードは、インスタンスに外部への接続を提供するために、ネットワークに有線で直接接続する必要があります。このノードは通常、neutron-openvswitch-agent などの L2 エージェントが実行される場所です。

サービスの配置:

OpenStack Networking サービスは、同じ物理サーバーまたは別の専用サーバー (役割によって名付けられる) で実行することができます。

  • コントローラーノード: API サービスを実行するサーバー
  • ネットワークノード: OpenStack Networking エージェントを実行するサーバー
  • コンピュートノード: インスタンスをホストするハイパーバイザー

本章の以下の手順では、環境に上記の 3 種類のノード種別がデプロイされていることが前提です。お使いのデプロイメントで、同じ物理ノードがコントローラーノードとネットワークノードの両方の役割を果たしている場合には、そのサーバーで両ノードのセクションの手順を実行する必要があります。これは、3 つの全ノードにおいてコントローラーノードおよびネットワークノードサービスが HA で実行されている高可用性 (HA) 環境にも適用されます。そのため、コントローラーノードとネットワークノードに該当するセクションの手順を全 3 ノードで実行する必要があります。

9.1. フラットプロバイダーネットワークの使用

以下の手順では、外部ネットワークの直接インスタンスを接続可能なフラットプロバイダーネットワークを作成します。複数の物理ネットワーク (physnet1physnet2) およびそれぞれ別の物理インターフェース (eth0 -> physnet1 および eth1 -> physnet2) があり、各コンピュートノードとネットワークノードをこれらの外部ネットワークに接続する必要がある場合に実行します。

注記

単一の NIC 上の VLAN タグ付けされた複数のインターフェースを複数のプロバイダーネットワークに接続する場合には、「VLAN プロバイダーネットワークの使用」を参照してください。

コントローラーノードの設定

1. /etc/neutron/plugin.ini (/etc/neutron/plugins/ml2/ml2_conf.ini へのシンボリックリンク) を編集し、既存の値リストに flat を追加し、flat_networks* に設定します。

type_drivers = vxlan,flat
flat_networks =*

2. フラットな外部ネットワークを作成して、設定済みの physical_network に関連付けます。共有ネットワークとしてこのネットワークを作成することで、他のユーザーが直接インスタンスを接続できるようにします。

neutron net-create public01 --provider:network_type flat --provider:physical_network physnet1 --router:external=True --shared

3. neutron subnet-create または OpenStack Dashboard を使用して、この外部ネットワーク内にサブネットを作成します。以下に例を示します。

neutron subnet-create --name public_subnet --enable_dhcp=False --allocation_pool start=192.168.100.20,end=192.168.100.100 --gateway=192.168.100.1 public01 192.168.100.0/24

4. neutron-server サービスを再起動して、この変更を適用します。

# systemctl restart neutron-server.service

ネットワークノードとコンピュートノードの両方の設定

以下のステップは、ネットワークノードとコンピュートノードで完了する必要があります。このステップを完了するとノードが外部ネットワークに接続され、インスタンスが直接外部ネットワークと通信できるようになります。

1. Open vSwitch ブリッジとポートを作成します。この手順では外部ネットワークのブリッジ (br-ex) を作成して、対応のポート (eth1) を追加します。

i. /etc/sysconfig/network-scripts/ifcfg-eth1 を編集します。

DEVICE=eth1
TYPE=OVSPort
DEVICETYPE=ovs
OVS_BRIDGE=br-ex
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none

ii. /etc/sysconfig/network-scripts/ifcfg-br-ex を編集します。

DEVICE=br-ex
TYPE=OVSBridge
DEVICETYPE=ovs
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none

2. network サービスを再起動してこれらの変更を適用します。

# systemctl restart network.service

3. /etc/neutron/plugins/ml2/openvswitch_agent.ini で物理ネットワークを設定して、ブリッジを物理ネットワークにマッピングします。

注記

bridge_mappings の設定に関する詳しい情報は、「13章ブリッジマッピングの設定」を参照してください。

bridge_mappings = physnet1:br-ex

4. ネットワークノードとコンピュートノード上で neutron-openvswitch-agent サービスを再起動して、変更を適用します。

systemctl restart neutron-openvswitch-agent

ネットワークノードの設定

1. /etc/neutron/l3_agent.iniexternal_network_bridge = に空の値を設定します。これにより、外部プロバイダーネットワークが使用できるようになります。

# Name of bridge used for external network traffic. This should be set to
# empty value for the linux bridge
external_network_bridge =

2. neutron-l3-agent を再起動して変更を適用します。

systemctl restart neutron-l3-agent.service
注記

複数のフラットプロバイダーネットワークが存在する場合には、それぞれに異なる物理インターフェースとブリッジを使用して外部ネットワークに接続すべきです。ifcfg-*スクリプトを適切に設定し、bridge_mappings にコンマ区切りリストでネットワーク別のマッピングを指定してください。bridge_mappings の設定に関する詳しい情報は、「13章ブリッジマッピングの設定」を参照してください。

外部ネットワークへのインスタンスの接続

このネットワークが作成されると、インスタンスを接続して、接続性をテストすることができます。

1. 新規インスタンスを作成します。

2. Dashboard の ネットワーク タブから、新たに作成した外部ネットワークに新規インスタンスを直接追加します。

パケットフローについて

フラットプロバイダーネットワークが設定された状況でのインスタンスに対するトラフィックの流れについて、以下で詳しく説明します。

9.1.1. 送信トラフィックのフロー

インスタンスから送信され、直接外部ネットワークに到達するトラフィックのパケットフロー: br-ex を設定し、物理インターフェースを追加してインスタンスをコンピュートノードに作成すると、作成されるインターフェースとブリッジは以下の図のようになります (iptables_hybrid ファイアウォールドライバーを使用する場合)。

flat provider out

1. インスタンスの eth0 インターフェースからのパケットは最初に linux ブリッジ qbr-xx に到達します。

2. ブリッジ qbr-xx は、veth ペア qvb-xx <-> qvo-xxx を使用して br-int に接続されます。これは、セキュリティーグループによって定義されている受信/送信のファイアウォールルールの適用にブリッジが使用されるためです。

3. インターフェース qvbxxqbr-xx linux ブリッジに、qvoxxbr-int Open vSwitch (OVS) ブリッジに接続されています。

Linux ブリッジ上の qbr-xx の設定

qbr269d4d73-e7		8000.061943266ebb	no		qvb269d4d73-e7
							tap269d4d73-e7

br-int 上の qvoxx の設定:

  Bridge br-int
        fail_mode: secure
            Interface "qvof63599ba-8f"
        Port "qvo269d4d73-e7"
            tag: 5
            Interface "qvo269d4d73-e7"

注記

ポート qvoxx は、フラットなプロバイダーネットワークに関連付けられた内部 VLAN タグでタグ付けされます。この例では VLAN タグは 5 です。パケットが qvoxx に到達すると、VLAN タグがパケットのヘッダーに追加されます。

次にこのパケットは、パッチピア int-br-ex <-> phy-br-ex を使用して br-ex OVS ブリッジに移動します。

br-int でのパッチピアの設定例を以下に示します。

    Bridge br-int
        fail_mode: secure
       Port int-br-ex
            Interface int-br-ex
                type: patch
                options: {peer=phy-br-ex}

br-ex でのパッチピアの設定例を以下に示します。

    Bridge br-ex
        Port phy-br-ex
            Interface phy-br-ex
                type: patch
                options: {peer=int-br-ex}
        Port br-ex
            Interface br-ex
                type: internal

このパケットが br-exphy-br-ex に到達すると、br-ex 内の OVS フローにより VLAN タグ (5) が取り除かれ、物理インターフェースに転送されます。

以下の出力例では、phy-br-ex のポート番号は 2 となっています。

# ovs-ofctl show br-ex
OFPT_FEATURES_REPLY (xid=0x2): dpid:00003440b5c90dc6
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE

 2(phy-br-ex): addr:ba:b5:7b:ae:5c:a2
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max

以下の出力例では、VLAN タグが 5 (dl_vlan=5) の phy-br-ex (in_port=2) に到達するパケットを示しています。さらに、VLAN タグは削除され、パケットが転送されます (actions=strip_vlan,NORMAL)。

# ovs-ofctl dump-flows br-ex
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=4703.491s, table=0, n_packets=3620, n_bytes=333744, idle_age=0, priority=1 actions=NORMAL
 cookie=0x0, duration=3890.038s, table=0, n_packets=13, n_bytes=1714, idle_age=3764, priority=4,in_port=2,dl_vlan=5 actions=strip_vlan,NORMAL
 cookie=0x0, duration=4702.644s, table=0, n_packets=10650, n_bytes=447632, idle_age=0, priority=2,in_port=2 actions=drop

このパケットは、次に物理インターフェースに転送されます。物理インターフェースが別の VLAN タグ付けされたインターフェースの場合、そのインターフェースはパケットにタグを追加します。

9.1.2. 受信トラフィックのフロー

以下の項では、外部ネットワークからインスタンスのインターフェースに到達するまでの受信トラフィックのフローを説明します。

flat provider in

1. 受信トラフィックは、まず物理ノードの eth1 に到達します。

2. 次にパケットは br-ex ブリッジに渡されます。

3. パッチピア phy-br-ex <--> int-br-ex を使用して、このパケットは br-int に移動します。

以下の例では、int-br-ex がポート番号 15 を使用します。15(int-br-ex) が含まれるエントリーに注目してください。

ovs-ofctl show br-int
OFPT_FEATURES_REPLY (xid=0x2): dpid:00004e67212f644d
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE
 15(int-br-ex): addr:12:4e:44:a9:50:f4
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max

br-int のトラフィックフローの確認

1. パケットが int-br-ex に到達すると、br-int ブリッジ内の OVS フロールールにより、内部 VLAN タグ 5 を追加するようにパケットが変更されます。actions=mod_vlan_vid:5 のエントリーを参照してください。

# ovs-ofctl dump-flows br-int
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=5351.536s, table=0, n_packets=12118, n_bytes=510456, idle_age=0, priority=1 actions=NORMAL
 cookie=0x0, duration=4537.553s, table=0, n_packets=3489, n_bytes=321696, idle_age=0, priority=3,in_port=15,vlan_tci=0x0000 actions=mod_vlan_vid:5,NORMAL
 cookie=0x0, duration=5350.365s, table=0, n_packets=628, n_bytes=57892, idle_age=4538, priority=2,in_port=15 actions=drop
 cookie=0x0, duration=5351.432s, table=23, n_packets=0, n_bytes=0, idle_age=5351, priority=0 actions=drop

2. 2 番目のルールは、VLAN タグのない (vlan_tci=0x0000) int-br-ex (in_port=15) に到達するパケットを管理します。これにより、パケットに VLAN タグ 5 が追加され (actions=mod_vlan_vid:5,NORMAL)、qvoxxx に転送されます。

3. qvoxxx は、VLAN タグを削除した後に、パケットを受け入れて qvbxx に転送します。

4. 最終的にパケットはインスタンスに到達します。

注記

VLAN tag 5 は、フラットプロバイダーネットワークを使用するテスト用コンピュートノードで使用したサンプルの VLAN です。この値は neutron-openvswitch-agent により自動的に割り当てられました。この値は、お使いのフラットプロバイダーネットワークの値とは異なる可能性があり、2 つの異なるコンピュートノード上にある同じネットワークにおいても異なる可能性があります。

9.1.3. トラブルシューティング

前述の「パケットフローについて」で提供される出力で、フラットプロバイダーネットワークで問題が発生した場合にトラブルシューティングを行うのに十分なデバッグ情報が得られます。以下の手順で、トラブルシューティングのプロセスについてさらに詳しく説明します。

1. bridge_mappings を確認します。

使用する物理ネットワーク名 (例: physnet1) が bridge_mapping 設定の内容と一致していることを確認します。以下に例を示します。以下に例を示します。

# grep bridge_mapping /etc/neutron/plugins/ml2/openvswitch_agent.ini
bridge_mappings = physnet1:br-ex

# neutron net-show provider-flat
...
| provider:physical_network | physnet1
...

2. ネットワークの設定を確認します。

ネットワークが external として作成され、flat の種別が使用されていることを確認します。

# neutron net-show provider-flat
...
| provider:network_type     | flat                                 |
| router:external           | True                                 |
...

3. パッチピアを確認します。

ovs-vsctl show を実行し、パッチピア int-br-ex <--> phy-br-ex を使用して br-intbr-ex が接続されていることを確認します。

この接続は、neutron-openvswitch-agent サービスを再起動する際に作成されます。ただし、作成されるのは /etc/neutron/plugins/ml2/openvswitch_agent.inibridge_mapping が正しく設定されている場合に限ります。サービスを再起動してもこの接続が作成されない場合には bridge_mapping の設定を再確認してください。

注記

bridge_mappings の設定に関する詳しい情報は、「13章ブリッジマッピングの設定」を参照してください。

4. ネットワークフローを確認します。

ovs-ofctl dump-flows br-exovs-ofctl dump-flows br-int を実行して、フローにより送信パケットの内部 VLAN ID が削除されたかどうかを確認します。まず、このフローは、特定のコンピュートノード上のこのネットワークにインスタンスを作成すると追加されます。

  • インスタンスの起動後にこのフローが作成されなかった場合には、ネットワークが flat として作成されていて、external であることと、physical_network の名前が正しいことを確認します。また、bridge_mapping の設定を確認してください。
  • 最後に ifcfg-br-exifcfg-ethx の設定を確認します。ethXbr-ex 内のポートとして追加されており、ip a の出力でどちらのインターフェースにも UP フラグが表示されることを確認します。

たとえば、以下の出力では eth1br-ex のポートであることが分かります。

    Bridge br-ex
        Port phy-br-ex
            Interface phy-br-ex
                type: patch
                options: {peer=int-br-ex}
        Port "eth1"
            Interface "eth1"

以下の例では eth1 は OVS ポートとして設定されていて、カーネルはこのインターフェースからのパケットをすべて転送して OVS ブリッジ br-ex に送信することを認識していることが分かります。これは、master ovs-system のエントリーで確認することができます。

# ip a
5: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master ovs-system state UP qlen 1000

9.2. VLAN プロバイダーネットワークの使用

以下の手順では、外部ネットワークの直接インスタンスを接続可能な VLAN プロバイダーネットワークを作成します。複数のプロバイダーネットワークに (単一の NIC 上で) VLAN タグが付けられたインターフェースを複数接続するには、この手順を実行します。以下の例では、VLAN 範囲が 171-172physnet1 と呼ばれる物理ネットワークを使用します。ネットワークノードとコンピュートノードは、eth1 という名前の物理インターフェースを使用して物理ネットワークに接続します。これらのインターフェースの接続先のスイッチポートは、必要な VLAN 範囲をトランク接続するように設定する必要があります。
以下の手順では、サンプルの VLAN ID と上記で指定した名前を使用して VLAN プロバイダーネットワークを設定します。

コントローラーノードの設定

1. /etc/neutron/plugin.ini (/etc/neutron/plugins/ml2/ml2_conf.ini へのシンボリックリンク) を編集して vlan メカニズムドライバーを有効にし、vlan を既存の値リストに追加します。以下に例を示します。

[ml2]
type_drivers = vxlan,flat,vlan

2. network_vlan_ranges の設定を行い、使用する物理ネットワークおよび VLAN 範囲を反映します。以下に例を示します。

[ml2_type_vlan]
network_vlan_ranges=physnet1:171:172

3. neutron-server サービスを再起動して変更を適用します。

systemctl restart neutron-server

4. 外部ネットワークを vlan 種別として作成して、設定済みの physical_network に関連付けます。--shared ネットワークとして作成して、他のユーザーが直接インスタンスに接続できるようにします。以下の例では、VLAN 171 と VLAN 172 の 2 つのネットワークを作成します。

neutron net-create provider-vlan171 \
			--provider:network_type vlan \
			--router:external true \
			--provider:physical_network physnet1 \
			--provider:segmentation_id 171 --shared

neutron net-create provider-vlan172 \
			--provider:network_type vlan \
			--router:external true \
			--provider:physical_network physnet1 \
			--provider:segmentation_id 172 --shared

5. 複数のサブネットを作成して、外部ネットワークを使用するように設定します。これは、neutron subnet-create または Dashboard のいずれかを使用して設定できます。ネットワーク管理者から取得した外部サブネットの詳細が正しく各 VLAN に関連付けられていることを確認します。以下の例では、VLAN 171 はサブネット 10.65.217.0/24 を、VLAN 172 は 10.65.218.0/24 を、それぞれ使用しています。

neutron subnet-create \
			--name subnet-provider-171 provider-171 10.65.217.0/24 \
			--enable-dhcp \
			--gateway 10.65.217.254 \

neutron subnet-create \
			--name subnet-provider-172 provider-172 10.65.218.0/24 \
			--enable-dhcp \
			--gateway 10.65.218.254 \

ネットワークノードとコンピュートノードの設定

以下のステップは、ネットワークノードとコンピュートノードで実行する必要があります。この手順を実行すると、外部ネットワークにノードを接続して、インスタンスが外部ネットワークと直接通信できるようになります。

1. 外部ネットワークブリッジ (br-ex) を作成し、ポート (eth1) をそのブリッジに関連付けます。

  • 以下の例では、eth1br-ex を使用するように設定します。
/etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
TYPE=OVSPort
DEVICETYPE=ovs
OVS_BRIDGE=br-ex
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
  • 以下の例では、br-ex ブリッジを設定します。
/etc/sysconfig/network-scripts/ifcfg-br-ex:

DEVICE=br-ex
TYPE=OVSBridge
DEVICETYPE=ovs
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none

2. ノードを再起動するか、network サービスを再起動して、ネットワークの変更を有効にします。以下に例を示します。

# systemctl restart network

3. /etc/neutron/plugins/ml2/openvswitch_agent.ini で物理ネットワークを設定して、物理ネットワークに応じてブリッジをマッピングします。

bridge_mappings = physnet1:br-ex
注記

bridge_mappings の設定に関する詳しい情報は、「13章ブリッジマッピングの設定」を参照してください。

4. ネットワークノードとコンピュートノードで neutron-openvswitch-agent サービスを再起動して、変更を有効にします。

systemctl restart neutron-openvswitch-agent

ネットワークノードの設定

1. /etc/neutron/l3_agent.iniexternal_network_bridge = に空の値を設定します。これは、ブリッジベースの外部ネットワークではなく、プロバイダーの外部ネットワークを使用するために必要です。ブリッジベースの外部ネットワークの場合は external_network_bridge = br-ex を指定します。

# Name of bridge used for external network traffic. This should be set to
# empty value for the linux bridge
external_network_bridge =

2. neutron-l3-agent を再起動して変更を適用します。

systemctl restart neutron-l3-agent

3. 新規インスタンスを作成して、Dashboard の ネットワーク タブを使用して新規作成した外部ネットワークに直接、新しいインスタンスを追加します。

パケットフローについて

VLAN プロバイダーネットワークが設定された状況でのインスタンスに対するトラフィックの流れについて、以下で詳しく説明します。

9.2.1. 送信トラフィックのフロー

本項では、インスタンスから直接 VLAN プロバイダーの外部ネットワークに到達するトラフィックのパケットフローについて説明します。この例では、2 つの VLAN ネットワーク (171 および 172) にアタッチされた 2 つのインスタンスを使用します。br-ex を設定して物理インターフェースを追加し、コンピュートノードにインスタンスを作成すると、作成されたインターフェースとブリッジは以下の図のようになります。

vlan provider

1. 上記の図のように、インスタンスの eth0 を出たパケットは、まずインスタンスに接続された linux ブリッジ qbr-xx に到達します。

2. qbr-xx は、veth ペア qvbxx <→ qvoxx を使用して br-int に接続されます。

3. qvbxx は linux ブリッジ qbr-xx に、qvoxx は Open vSwitch ブリッジ br-int に接続されています。

Linux ブリッジ上の qbr-xx の設定

インスタンスが 2 つあるため、linux ブリッジが 2 つになります。

# brctl show
bridge name	bridge id		STP enabled	interfaces
qbr84878b78-63		8000.e6b3df9451e0	no		qvb84878b78-63
							tap84878b78-63

qbr86257b61-5d		8000.3a3c888eeae6	no		qvb86257b61-5d
							tap86257b61-5d

br-int 上の qvoxx の設定

                options: {peer=phy-br-ex}
        Port "qvo86257b61-5d"
            tag: 3

            Interface "qvo86257b61-5d"
        Port "qvo84878b78-63"
            tag: 2
            Interface "qvo84878b78-63"

  • qvoxx には、VLAN プロバイダーネットワークが関連付けられた内部 VLAN のタグが付けられます。この例では、内部 VLAN タグ 2 には VLAN プロバイダーネットワーク provider-171、VLAN タグ 3 には VLAN プロバイダーネットワーク provider-172 が関連付けられます。パケットが qvoxx に到達すると、パケットのヘッダーにこの VLAN タグが追加されます。
  • パケットは次に、パッチピア int-br-ex <→ phy-br-ex を使用して br-ex OVS ブリッジに移動します。br-int 上のパッチピアの例を以下に示します。
    Bridge br-int
        fail_mode: secure
       Port int-br-ex
            Interface int-br-ex
                type: patch
                options: {peer=phy-br-ex}

br-ex 上のパッチピアの設定例を以下に示します。

    Bridge br-ex
        Port phy-br-ex
            Interface phy-br-ex
                type: patch
                options: {peer=int-br-ex}
        Port br-ex
            Interface br-ex
                type: internal
  • このパケットが br-ex 上の phy-br-ex に到達すると、br-ex 内の OVS フローが内部 VLAN タグを VLAN プロバイダーネットワークに関連付けられた実際の VLAN タグに置き換えます。

以下のコマンドの出力では、phy-br-ex のポート番号は 4 となっています。

# ovs-ofctl show br-ex
 4(phy-br-ex): addr:32:e7:a1:6b:90:3e
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max

以下のコマンドでは、VLAN タグ 2 (dl_vlan=2) が付いた phy-br-ex (in_port=4) に到達するパケットを表示します。Open vSwitch により、VLAN タグは 171 に置き換えられ (actions=mod_vlan_vid:171,NORMAL)、パケットが次の宛先に転送されます。また、このコマンドで、VLAN タグ 3 (dl_vlan=3) が付いた phy-br-ex (in_port=4) に到達するパケットが表示されます。Open vSwitch により VLAN タグは 172 に置き換えられ (actions=mod_vlan_vid:172,NORMAL)、次の宛先にパケットが転送されます。これらのルールは、neutron-openvswitch-agent により自動的に追加されます。

# ovs-ofctl dump-flows br-ex
NXST_FLOW reply (xid=0x4):
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=6527.527s, table=0, n_packets=29211, n_bytes=2725576, idle_age=0, priority=1 actions=NORMAL
 cookie=0x0, duration=2939.172s, table=0, n_packets=117, n_bytes=8296, idle_age=58, priority=4,in_port=4,dl_vlan=3 actions=mod_vlan_vid:172,NORMAL
 cookie=0x0, duration=6111.389s, table=0, n_packets=145, n_bytes=9368, idle_age=98, priority=4,in_port=4,dl_vlan=2 actions=mod_vlan_vid:171,NORMAL
 cookie=0x0, duration=6526.675s, table=0, n_packets=82, n_bytes=6700, idle_age=2462, priority=2,in_port=4 actions=drop
  • このパケットは、次に物理インターフェース eth1 に転送されます。

9.2.2. 受信トラフィックのフロー

  • 外部ネットワークから受信するインスタンスのパケットは、eth1 に到達してから br-ex に届きます。
  • このパケットは、br-ex からパッチピア phy-br-ex <-> int-br-ex を経由して br-int に移動します。

以下のコマンドを実行すると、ポート番号 18 を使用する int-br-ex が表示されます。

# ovs-ofctl show br-int
 18(int-br-ex): addr:fe:b7:cb:03:c5:c1
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
  • パケットが int-br-ex に到着すると、br-int 内の OVS フローにより、provider-171 の場合は内部 VLAN タグ 2 が、provider-172 の場合は VLAN タグ 3 がパケットに追加されます。
# ovs-ofctl dump-flows br-int
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=6770.572s, table=0, n_packets=1239, n_bytes=127795, idle_age=106, priority=1 actions=NORMAL
 cookie=0x0, duration=3181.679s, table=0, n_packets=2605, n_bytes=246456, idle_age=0, priority=3,in_port=18,dl_vlan=172 actions=mod_vlan_vid:3,NORMAL
 cookie=0x0, duration=6353.898s, table=0, n_packets=5077, n_bytes=482582, idle_age=0, priority=3,in_port=18,dl_vlan=171 actions=mod_vlan_vid:2,NORMAL
 cookie=0x0, duration=6769.391s, table=0, n_packets=22301, n_bytes=2013101, idle_age=0, priority=2,in_port=18 actions=drop
 cookie=0x0, duration=6770.463s, table=23, n_packets=0, n_bytes=0, idle_age=6770, priority=0 actions=drop

2 番目のルールは、VLAN タグ 172 (dl_vlan=172) が付いた int-br-ex (in_port=18) に到達するパケットは VLAN タグが 3 (actions=mod_vlan_vid:3,NORMAL) に置き換えられ、次に進むように記載されています。次に 3 番目のルールは、VLAN タグ 171 (dl_vlan=171) が付いた int-br-ex (in_port=18) に到達するパケットは VLAN タグが 2 (actions=mod_vlan_vid:2,NORMAL) に置き換えられ、次に進むように記載されています。

  • in-br-ex から内部 VLAN タグがパケットに追加されると、qvoxxx はそのパケットを受け入れ、VLAN タグを削除してから qvbxx に転送します。パケットは、その後にインスタンスに到達します。

VLAN タグ 2 および 3 は、テスト用のコンピュートノードで、VLAN プロバイダーネットワーク (provider-171 および provider-172) に使用した一例である点に注意してください。お使いの VLAN プロバイダーネットワークに必要な設定は異なる場合があります。また、同じネットワークを使用する 2 つの異なるコンピュートノードで VLAN タグが異なる場合もあります。

9.2.3. トラブルシューティング

VLAN プロバイダーネットワークの接続についてトラブルシューティングを行う場合は、前述のパケットフローを参照してください。さらに、以下の設定オプションを確認してください。

1. 一貫した物理ネットワーク名が使用されていることを確認してください。以下の例では、ネットワークの作成時と、bridge_mapping の設定において、一貫して physnet1 が使用されています。

# grep bridge_mapping /etc/neutron/plugins/ml2/openvswitch_agent.ini
bridge_mappings = physnet1:br-ex

# neutron net-show provider-vlan171
...
| provider:physical_network | physnet1
...

2. ネットワークが external として vlan の種別で作成され、正しい segmentation_id の値が使用されていることを確認します。

# neutron net-show provider-vlan171
...
| provider:network_type     | vlan                                 |
| provider:physical_network | physnet1                             |
| provider:segmentation_id  | 171                                  |
...

3. ovs-vsctl show を実行して、br-int および br-ex がパッチピア int-br-ex <→ phy-br-ex を使用して接続されていることを確認します。
この接続は、/etc/neutron/plugins/ml2/openvswitch_agent.inibridge_mapping が正しく設定されていることを前提として、neutron-openvswitch-agent の再起動の後に作成されます。
サービスを再起動してもこの接続が作成されない場合には bridge_mapping の設定を再確認してください。

4. 送信パケットのフローを確認するには、ovs-ofctl dump-flows br-ex および ovs-ofctl dump-flows br-int を実行して、このフローにより VLAN ID が外部 VLAN id (segmentation_id) にマッピングされていることを確認します。受信パケットには、外部 VLAN ID が内部 VLAN ID にマッピングされます。
このフローは、このネットワークに初めてインスタンスを作成した場合に neutron OVS エージェントにより追加されます。インスタンスの起動後にこのフローが作成されなかった場合には、ネットワークが vlan として作成されていて、external であることと、physical_network の名前が正しいことを確認します。また、bridge_mapping の設定を再確認してください。

5. 最後に、ifcfg-br-exifcfg-ethx の設定を再確認します。ethXbr-ex の中にポートとして追加されており、いずれも ip a コマンドの出力において UP フラグが表示されることを確認します。
たとえば、以下の出力例では、eth1br-ex 内のポートとなっています。

    Bridge br-ex
        Port phy-br-ex
            Interface phy-br-ex
                type: patch
                options: {peer=int-br-ex}
        Port "eth1"
            Interface "eth1"

以下のコマンドでは、eth1 がポートとして追加され、カーネルがこのインターフェースから OVS ブリッジ br-ex にすべてのパケットを移動することを認識していることが分かります。これは、エントリー master ovs-system で確認できます。

# ip a
5: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master ovs-system state UP qlen 1000

9.3. コンピュートのメタデータアクセスの有効化

この方法で接続されたインスタンスは、プロバイダーの外部ネットワークに直接アタッチされ、OpenStack Networking (neutron) ルーターではなく、外部ルーターがデフォルトゲートウェイとして設定されます。これは、neutron ルーターはインスタンスから nova-metadata サーバーへのメタデータ要求をプロキシー化するために使用することができないため、cloud-init の実行中にエラーが発生する可能性があることを意味します。ただし、この問題は、dhcp エージェントがメタデータ要求をプロキシー化するように設定することによって解決することができます。この機能は、/etc/neutron/dhcp_agent.ini で有効にすることができます。以下に例を示します。

enable_isolated_metadata = True

9.4. Floating IP アドレス

同時にプライベートネットワークに追加された場合でも、同じネットワークを利用して、Floating IP アドレスをインスタンスに割り当てることができる点に注意してください。このネットワークから Floating IP として割り当てられたアドレスは、ネットワークノードの qrouter-xxx の名前空間にバインドされ、関連付けられたプライベート IP アドレスに DNAT-SNAT を実行します。反対に、直接外部ネットワークにアクセスできるように割り当てられた IP アドレスはインスタンス内に直接バインドされ、インスタンスが外部ネットワークと直接通信できるようになります。

第10章 OpenStack Networking の物理スイッチの設定

本章では、OpenStack Networking に必要な一般的な物理スイッチの設定手順を説明します。以下のスイッチに関するベンダー固有の設定を記載しています。

10.1. 物理ネットワーク環境のプランニング

OpenStack ノード内の物理ネットワークアダプターは、異なる種別のネットワークトラフィックを伝送することが想定される場合があります。これには、インスタンストラフィック、ストレージデータ、認証要求が含まれます。NIC が伝送するトラフィックの種別によって、物理スイッチ上でのポートの設定方法が異なります。

最初のステップでは、コンピュートノード上の物理 NIC で伝送するトラフィックの種別を決定する必要があります。次に、NIC が物理スイッチポートに接続されると、そのスイッチポートはトラックトラフィックまたは一般のトラフィックを許可するように特別に設定する必要があります。

たとえば、以下の図は、eth0 と eth1 の 2 つの NIC を搭載したコンピュートノードを示しています。各 NIC は、物理スイッチ上のギガビットイーサネットポートに接続され、eth0 がインスタンストラフィックを伝送し、eth1 が OpenStack サービスの接続性を提供します。

ネットワークレイアウト例

switch example

注記

この図には、耐障害性に必要な追加の冗長 NIC は含まれていません。

10.2. Cisco Catalyst スイッチの設定

10.2.1. トランクポートの設定

OpenStack Networking により、インスタンスは物理ネットワーク上にすでに存在する VLAN に接続することができますトランク という用語は、単一のポートで複数 VLAN の通過を許可することを意味します。トランクにより、VLAN は、仮想スイッチを含む複数のスイッチ間にまたがることができます。たとえば、物理ネットワークで VLAN110 としてタグされたトラフィックが、コンピュートノードに到達すると、8021q モジュールによってタグ付けされたトラフィックが vSwitch 上の適切な VLAN に転送されます。

10.2.1.1. Cisco Catalyst スイッチのトランクポートの設定

Cisco IOS を実行する Cisco Catalyst スイッチを使用する場合には、以下の設定構文を使用して、VLAN 110 と 111 のトラフィックがインスタンスに到達できるように設定することが可能です。この設定では、物理ノードの NIC がイーサネットケーブルにより物理スイッチポート (インターフェース GigabitEthernet1/0/12) に接続されていることを前提としています。

注記

これらの値は、単なる例に過ぎません。変更せずにそのままコピーしてスイッチの設定に貼り付けると、機能が予期せず停止してしまう可能性があります。

interface GigabitEthernet1/0/12
  description Trunk to Compute Node
  spanning-tree portfast trunk
  switchport trunk encapsulation dot1q
  switchport mode trunk
  switchport trunk native vlan 2
  switchport trunk allowed vlan 2,110,111

これらの設定についての説明を以下に記載します。

フィールド説明

interface GigabitEthernet1/0/12

ノードの NIC が結線されるスイッチポートです。これは単なる一例なので、最初に正しいポートをここで設定するように確認することが重要です。show interface コマンドでポートの一覧を表示することができます。

description Trunk to Compute Node

show interface コマンドを使用して全インターフェースを一覧表示する際に表示される説明。どのシステムがこのポートに結線されていて、その接続の目的とする機能がわかるのに十分な説明である必要があります。

spanning-tree portfast trunk

環境で STP を使用することを前提として、Port Fast に対してこのポートがトランクトラフィックに使用されることを伝えます。

switchport trunk encapsulation dot1q

802.1q のトランク標準 (ISL ではなく) を有効にします。これは、スイッチが何をサポートするかによって異なります。

switchport mode trunk

このポートは、アクセスポートではなく、トランクポートとして設定します。これで VLAN トラフィックが仮想スイッチに到達できるようになります。

switchport trunk native vlan 2

ネイティブ VLAN を設定して、タグの付いていない (VLAN 以外の) トラフィックの送信先をスイッチに指示します。

switchport trunk allowed vlan 2,110,111

トランクを通過できる VLAN を定義します。

10.2.2. アクセスポートの設定

コンピュートノード上の全 NIC がインスタンスのトラフィックを伝送するわけではないので、複数の VLAN が通過できるように設定する必要はありません。このようなポートに設定する必要があるのは VLAN 1 つのみで、管理トラフィックやブロックストレージデータの転送などの他の運用上の要件を満たす必要がある可能性があります。これらのポートは一般的にアクセスポートと呼ばれ、必要な設定は通常、トランクポートよりも簡単です。

10.2.2.1. Cisco Catalyst スイッチのアクセスポートの設定

ネットワークレイアウト例」の図に示した例を使用して、GigabitEthernet1/0/13 (Cisco Catalyst スイッチ上) を eth1 のアクセスポートとして設定します。この設定では、物理ノードの NIC がイーサネットケーブルにより物理スイッチポート (インターフェース GigabitEthernet1/0/12) に接続されていることを前提としています。

注記

これらの値は、単なる例に過ぎません。変更せずにそのままコピーしてスイッチの設定に貼り付けると、機能が予期せず停止してしまう可能性があります。

interface GigabitEthernet1/0/13
 description Access port for Compute Node
 switchport mode access
 switchport access vlan 200
 spanning-tree portfast

これらの設定についての説明を以下に記載します。

フィールド説明

interface GigabitEthernet1/0/13

ノードの NIC が結線されるスイッチポートです。インターフェースの値は単なる一例なので、最初に正しいポートをここで設定するように確認することが重要です。show interface コマンドでポートの一覧を表示することができます。

description Access port for Compute Node

show interface コマンドを使用して全インターフェースを一覧表示する際に表示される説明。どのシステムがこのポートに結線されていて、その接続の目的とする機能がわかるのに十分な説明である必要があります。

switchport mode access

このポートは、トランクポートとしてではなく、アクセスポートとして設定します。

switchport access vlan 200

VLAN 200 上でトラフィックを許可するポートを設定します。コンピュートノードには、この VLAN からの IP アドレスを設定すべきです。

spanning-tree portfast

STP を使用する場合には、この設定は、STP がこのポートをトランクとして初期化を試みないように指示して、初回接続時 (例: サーバーの再起動時など) のポートハンドシェイクをより迅速に行うことができます。

10.2.3. LACP ポートアグリゲーションの設定

LACP により、複数の物理 NIC をバンドルして単一の論理チャネルを形成することができます。LACP は 802.3ad (または、Linux ではボンディングモード 4) としても知られており、負荷分散と耐障害性のための動的なボンディングを作成します。LACP は、物理 NIC と物理スイッチポートの両方の物理エンドで設定する必要があります。

10.2.3.1. 物理 NIC 上での LACP の設定

1. /home/stack/network-environment.yaml ファイルを編集します。

- type: linux_bond
  name: bond1
  mtu: 9000
  bonding_options:{get_param: BondInterfaceOvsOptions};
  members:
    - type: interface
      name: nic3
      mtu: 9000
      primary: true
    - type: interface
      name: nic4
      mtu: 9000

2. Open vSwitch ブリッジが LACP を使用するように設定します。

BondInterfaceOvsOptions:
    "mode=802.3ad"

ネットワークボンディングの設定方法についての説明は、「Open vSwitch ボンディングのオプション」を参照してください。

10.2.3.2. Cisco Catalyst スイッチ上での LACP の設定

以下の例では、コンピュートノードに VLAN 100 を使用する NIC が 2 つあります。

1. コンピュートノードの 2 つの NIC を物理的にスイッチ (例: ポート 12 と 13) に接続します。

2. LACP ポートチャネルを作成します。

interface port-channel1
  switchport access vlan 100
  switchport mode access
  spanning-tree guard root

3. スイッチポート 12 (Gi1/0/12) および 13 (Gi1/0/13) を設定します。

sw01# config t
Enter configuration commands, one per line.  End with CNTL/Z.

sw01(config) interface GigabitEthernet1/0/12
   switchport access vlan 100
   switchport mode access
   speed 1000
   duplex full
   channel-group 10 mode active
   channel-protocol lacp

interface GigabitEthernet1/0/13
  switchport access vlan 100
  switchport mode access
  speed 1000
  duplex full
  channel-group 10 mode active
  channel-protocol lacp

4. 新しいポートチャネルを確認します。出力には、新規ポートチャネル Po1 と、メンバーポートの Gi1/0/12 および Gi1/0/13 が表示されます。

sw01# show etherchannel summary
<snip>

Number of channel-groups in use: 1
Number of aggregators:           1

Group  Port-channel  Protocol    Ports
------+-------------+-----------+-----------------------------------------------
1      Po1(SD)         LACP      Gi1/0/12(D)  Gi1/0/13(D)
注記

copy running-config startup-config コマンドを実行して running-config を startup-config にコピーし、変更を適用するのを忘れないようにしてください。

10.2.4. MTU の設定

特定の種別のネットワークトラフィックには、MTU サイズの調整が必要な場合があります。たとえば、特定の NFS または iSCSI のトラフィックには、ジャンボフレーム (9000 バイト) が推奨される場合があります。

注記

MTU の設定は、エンドツーエンド (トラフィックが通過すると想定されている全ホップ) で変更する必要があります。これには、仮想スイッチが含まれます。OpenStack 環境における MTU の変更についての説明は、「11章MTU の設定」を参照してください。

10.2.4.1. Cisco Catalyst スイッチ上での MTU の設定

以下の例では、Cisco Catalyst 3750 スイッチでジャンボフレームを有効にします。

1. 現在の MTU 設定を確認します。

sw01# show system mtu

System MTU size is 1600 bytes
System Jumbo MTU size is 1600 bytes
System Alternate MTU size is 1600 bytes
Routing MTU size is 1600 bytes

2. 3750 のスイッチでは、MTU 設定はインターフェースごとではなく、スイッチ全体で変更されます。以下のコマンドは、スイッチが 9000 バイトのジャンボフレームを使用するように設定します。お使いのスイッチがサポートしている場合には、インターフェースごとに MTU を設定した方がよいかもしれません。

sw01# config t
Enter configuration commands, one per line.  End with CNTL/Z.

sw01(config)# system mtu jumbo 9000
Changes to the system jumbo MTU will not take effect until the next reload is done
注記

copy running-config startup-config コマンドを実行して running-config を startup-config にコピーし、変更を保存するのを忘れないようにしてください。

3. 可能な場合には、スイッチを再読み込みして変更を適用してください。この操作を実行すると、そのスイッチに依存しているデバイスでネットワークが停止することになります。

sw01# reload
Proceed with reload? [confirm]

4. スイッチが再読み込みの操作を完了したら、新しいジャンボ MTU のサイズを確認します。スイッチのモデルによって実際の出力は異なる場合があります。たとえば、System MTU がギガビット非対応のインターフェースに適用され、Jumbo MTU は全ギガビット対応インターフェースを記述する可能性があります。

sw01# show system mtu

System MTU size is 1600 bytes
System Jumbo MTU size is 9000 bytes
System Alternate MTU size is 1600 bytes
Routing MTU size is 1600 bytes

10.2.5. LLDP ディスカバリーの設定

ironic-python-agent サービスは、接続されたスイッチからの LLDP パケットをリッスンします。収集される情報には、スイッチ名、ポートの詳細、利用可能な VLAN を含めることができます。Cisco Discovery Protocol (CDP) と同様に、LLDP は、director の イントロスペクション プロセス中の物理ハードウェアの検出を補助します。

10.2.5.1. Cisco Catalyst スイッチ上での LLDP の設定

1. lldp run を使用して、Cisco Catalyst スイッチで LLDP をグローバルに有効にします。

sw01# config t
Enter configuration commands, one per line.  End with CNTL/Z.

sw01(config)# lldp run

2. 隣接する LLDP 対応デバイスを表示します。

sw01# show lldp neighbor
Capability codes:
    (R) Router, (B) Bridge, (T) Telephone, (C) DOCSIS Cable Device
    (W) WLAN Access Point, (P) Repeater, (S) Station, (O) Other

Device ID           Local Intf     Hold-time  Capability      Port ID
DEP42037061562G3     Gi1/0/11       180        B,T             422037061562G3:P1

Total entries displayed: 1
注記

copy running-config startup-config コマンドを実行して running-config を startup-config にコピーし、変更を保存するのを忘れないようにしてください。

10.3. Cisco Nexus スイッチの設定

10.3.1. トランクポートの設定

OpenStack Networking により、インスタンスは物理ネットワーク上にすでに存在する VLAN に接続することができますトランク という用語は、単一のポートで複数 VLAN の通過を許可することを意味します。トランクにより、VLAN は、仮想スイッチを含む複数のスイッチ間にまたがることができます。たとえば、物理ネットワークで VLAN110 としてタグされたトラフィックが、コンピュートノードに到達すると、8021q モジュールによってタグ付けされたトラフィックが vSwitch 上の適切な VLAN に転送されます。

10.3.1.1. Cisco Nexus スイッチのトランクポートの設定

Cisco Nexus を使用する場合には、以下の設定構文を使用して、VLAN 110 と 111 のトラフィックがインスタンスに到達できるように設定することが可能です。この設定では、物理ノードの NIC がイーサネットケーブルにより物理スイッチポート (インターフェース Ethernet1/12) に接続されていることを前提としています。

注記

これらの値は、単なる例に過ぎません。変更せずにそのままコピーしてスイッチの設定に貼り付けると、機能が予期せず停止してしまう可能性があります。

interface Ethernet1/12
  description Trunk to Compute Node
  switchport mode trunk
  switchport trunk allowed vlan 2,110,111
  switchport trunk native vlan 2
end

10.3.2. アクセスポートの設定

コンピュートノード上の全 NIC がインスタンスのトラフィックを伝送するわけではないので、複数の VLAN が通過できるように設定する必要はありません。このようなポートに設定する必要があるのは VLAN 1 つのみで、管理トラフィックやブロックストレージデータの転送などの他の運用上の要件を満たす必要がある可能性があります。これらのポートは一般的にアクセスポートと呼ばれ、必要な設定は通常、トランクポートよりも簡単です。

10.3.2.1. Cisco Nexus スイッチのアクセスポートの設定

ネットワークレイアウト例」の図に示した例を使用して、Ethernet1/13 (Cisco Nexus スイッチ上) を eth1 のアクセスポートとして設定します。この設定では、物理ノードの NIC がイーサネットケーブルにより物理スイッチポート (インターフェース Ethernet1/13) に接続されていることを前提としています。

注記

これらの値は、単なる例に過ぎません。変更せずにそのままコピーしてスイッチの設定に貼り付けると、機能が予期せず停止してしまう可能性があります。

interface Ethernet1/13
 description Access port for Compute Node
 switchport mode access
 switchport access vlan 200

10.3.3. LACP ポートアグリゲーションの設定

LACP により、複数の物理 NIC をバンドルして単一の論理チャネルを形成することができます。LACP は 802.3ad (または、Linux ではボンディングモード 4) としても知られており、負荷分散と耐障害性のための動的なボンディングを作成します。LACP は、物理 NIC と物理スイッチポートの両方の物理エンドで設定する必要があります。

10.3.3.1. 物理 NIC 上での LACP の設定

1. /home/stack/network-environment.yaml ファイルを編集します。

- type: linux_bond
  name: bond1
  mtu: 9000
  bonding_options:{get_param: BondInterfaceOvsOptions};
  members:
    - type: interface
      name: nic3
      mtu: 9000
      primary: true
    - type: interface
      name: nic4
      mtu: 9000

2. Open vSwitch ブリッジが LACP を使用するように設定します。

BondInterfaceOvsOptions:
    "mode=802.3ad"

ネットワークボンディングの設定方法についての説明は、「Open vSwitch ボンディングのオプション」を参照してください。

10.3.3.2. Cisco Nexus スイッチ上での LACP の設定

以下の例では、コンピュートノードに VLAN 100 を使用する NIC が 2 つあります。

1. コンピュートノードの 2 つの NIC を物理的にスイッチ (例: ポート 12 と 13) に接続します。

2. LACP が有効なことを確認します。

(config)# show feature | include lacp
lacp                  1         enabled

3. ポート 1/12 と 1/13 をアクセスポートおよびチャネルグループのメンバーとして設定します。デプロイメントによっては、アクセスインターフェースの代わりにトランクインターフェースを使用するようにデプロイすることができます。たとえば、Cisco UCI の場合には、NIC は仮想インターフェースなので、全アクセスポートを設定した方がよいでしょう。また、インターフェースで VLAN タグ付けが設定されている可能性が高くなります。

interface Ethernet1/13
 description Access port for Compute Node
 switchport mode access
 switchport access vlan 200
 channel-group 10 mode active

interface Ethernet1/13
 description Access port for Compute Node
 switchport mode access
 switchport access vlan 200
 channel-group 10 mode active

10.3.4. MTU の設定

特定の種別のネットワークトラフィックには、MTU サイズの調整が必要な場合があります。たとえば、特定の NFS または iSCSI のトラフィックには、ジャンボフレーム (9000 バイト) が推奨される場合があります。

注記

MTU の設定は、エンドツーエンド (トラフィックが通過すると想定されている全ホップ) で変更する必要があります。これには、仮想スイッチが含まれます。OpenStack 環境における MTU の変更についての説明は、「11章MTU の設定」を参照してください。

10.3.4.1. Cisco Nexus 7000 スイッチ上での MTU の設定

MTU の設定は、7000 シリーズのスイッチ上の単一のインターフェースに適用することができます。以下のコマンドは、インターフェース 1/12 が 9000 バイトのジャンボフレームを使用するように設定します。

interface ethernet 1/12
  mtu 9216
  exit

10.3.5. LLDP ディスカバリーの設定

ironic-python-agent サービスは、接続されたスイッチからの LLDP パケットをリッスンします。収集される情報には、スイッチ名、ポートの詳細、利用可能な VLAN を含めることができます。Cisco Discovery Protocol (CDP) と同様に、LLDP は、director の イントロスペクション プロセス中の物理ハードウェアの検出を補助します。

10.3.5.1. Cisco Nexus 7000 スイッチ上での LLDP の設定

LLDP は、Cisco Nexus 7000 シリーズスイッチ上の個別のインターフェースに対して有効化することができます。

interface ethernet 1/12
  lldp transmit
  lldp receive
  no lacp suspend-individual
  no lacp graceful-convergence

interface ethernet 1/13
  lldp transmit
  lldp receive
  no lacp suspend-individual
  no lacp graceful-convergence
注記

copy running-config startup-config コマンドを実行して running-config を startup-config にコピーし、変更を保存するのを忘れないようにしてください。

10.4. Cumulus Linux スイッチの設定

10.4.1. トランクポートの設定

OpenStack Networking により、インスタンスは物理ネットワーク上にすでに存在する VLAN に接続することができますトランク という用語は、単一のポートで複数 VLAN の通過を許可することを意味します。トランクにより、VLAN は、仮想スイッチを含む複数のスイッチ間にまたがることができます。たとえば、物理ネットワークで VLAN110 としてタグされたトラフィックが、コンピュートノードに到達すると、8021q モジュールによってタグ付けされたトラフィックが vSwitch 上の適切な VLAN に転送されます。

10.4.1.1. Cumulus Linux スイッチのトランクポートの設定

Cumulus Linux スイッチを使用する場合には、以下のような設定構文を使用して、VLAN 100 と 200 のトラフィックがインスタンスに到達できるように設定することが可能です。この設定は、物理ノードでトランシーバーが物理スイッチ上のスイッチポート swp1 および swp2 に接続されていることを前提としています。

注記

これらの値は、単なる例に過ぎません。変更せずにそのままコピーしてスイッチの設定に貼り付けると、機能が予期せず停止してしまう可能性があります。

auto bridge
iface bridge
  bridge-vlan-aware yes
  bridge-ports glob swp1-2
  bridge-vids 100 200

10.4.2. アクセスポートの設定

コンピュートノード上の全 NIC がインスタンスのトラフィックを伝送するわけではないので、複数の VLAN が通過できるように設定する必要はありません。このようなポートに設定する必要があるのは VLAN 1 つのみで、管理トラフィックやブロックストレージデータの転送などの他の運用上の要件を満たす必要がある可能性があります。これらのポートは一般的にアクセスポートと呼ばれ、必要な設定は通常、トランクポートよりも簡単です。

10.4.2.1. Cumulus Linux スイッチでのアクセスポートの設定

ネットワークレイアウト例」の図に示した例を使用して、swp1 (Cumulus Linux スイッチ上) をアクセスポートとして設定します。この設定では、物理ノードの NIC がイーサネットケーブルにより物理スイッチのインターフェースに接続されていることを前提としています。Cumulus Linux スイッチは、管理インターフェースに eth を、アクセス/トランクポートに swp を使用します。

注記

これらの値は、単なる例に過ぎません。変更せずにそのままコピーしてスイッチの設定に貼り付けると、機能が予期せず停止してしまう可能性があります。

auto bridge
iface bridge
  bridge-vlan-aware yes
  bridge-ports glob swp1-2
  bridge-vids 100 200


auto swp1
iface swp1
  bridge-access 100


auto swp2
iface swp2
  bridge-access 200

10.4.3. LACP ポートアグリゲーションの設定

LACP により、複数の物理 NIC をバンドルして単一の論理チャネルを形成することができます。LACP は 802.3ad (または、Linux ではボンディングモード 4) としても知られており、負荷分散と耐障害性のための動的なボンディングを作成します。LACP は、物理 NIC と物理スイッチポートの両方の物理エンドで設定する必要があります。

10.4.3.1. 物理 NIC 上での LACP の設定

Cumulus Linux では物理 NIC を設定する必要はありません。

10.4.3.2. Cumulus Linux スイッチでの LACP の設定

ボンディングの設定には、/etc/network/interfaces を編集して bond0 の内容を追加します。

auto bond0
iface bond0
   address 10.0.0.1/30
   bond-slaves swp1 swp2 swp3 swp4
注記

sudo ifreload -a コマンドを実行して更新した設定を 再読み込みし、変更を適用するのを忘れないようにしてください。

10.4.4. MTU の設定

特定の種別のネットワークトラフィックには、MTU サイズの調整が必要な場合があります。たとえば、特定の NFS または iSCSI のトラフィックには、ジャンボフレーム (9000 バイト) が推奨される場合があります。

注記

MTU の設定は、エンドツーエンド (トラフィックが通過すると想定されている全ホップ) で変更する必要があります。これには、仮想スイッチが含まれます。OpenStack 環境における MTU の変更についての説明は、「11章MTU の設定」を参照してください。

10.4.4.1. Cumulus Linux スイッチでの MTU の設定

以下の例では、Cumulus Linux スイッチでジャンボフレームを有効にします。

auto swp1
iface swp1
  mtu 9000

sudo ifreload -a コマンドを実行して更新した設定を 再読み込みし、変更を適用するのを忘れないようにしてください。

10.4.5. LLDP ディスカバリーの設定

デフォルトでは、LLDP サービスはデーモン (lldpd) として実行され、スイッチのブート時に起動します。

全ポート/インターフェースの LLDP

cumulus@switch$ netshow lldp
Local Port  Speed  Mode         Remote Port   Remote Host Summary
----------  ---    ---------    -----  -----  ----------- --------
eth0        10G    Mgmt         ====   swp6   mgmt-sw     IP: 10.0.1.11/24
swp51       10G    Interface/L3 ====   swp1   spine01     IP: 10.0.0.11/32
swp52       10G    Interface/L  ====   swp1   spine02     IP: 10.0.0.11/32

10.5. Extreme Networks EXOS スイッチの設定

10.5.1. トランクポートの設定

OpenStack Networking により、インスタンスは物理ネットワーク上にすでに存在する VLAN に接続することができますトランク という用語は、単一のポートで複数 VLAN の通過を許可することを意味します。トランクにより、VLAN は、仮想スイッチを含む複数のスイッチ間にまたがることができます。たとえば、物理ネットワークで VLAN110 としてタグされたトラフィックが、コンピュートノードに到達すると、8021q モジュールによってタグ付けされたトラフィックが vSwitch 上の適切な VLAN に転送されます。

10.5.1.1. Extreme Networks EXOS スイッチでのトランクポートの設定

X-670 シリーズのスイッチを使用する場合には、以下の例を参考にして、VLAN 110 と 111 のトラフィックがインスタンスに到達できるようにすることが可能です。この設定では、物理ノードの NIC がイーサネットケーブルにより物理スイッチポート (インターフェース 24) に接続されていることを前提としています。この例では、DATAMNGT が VLAN 名です。

注記

これらの値は、単なる例に過ぎません。変更せずにそのままコピーしてスイッチの設定に貼り付けると、機能が予期せず停止してしまう可能性があります。

#create vlan DATA tag 110
#create vlan MNGT tag 111
#configure vlan DATA add ports 24 tagged
#configure vlan MNGT add ports 24 tagged

10.5.2. アクセスポートの設定

コンピュートノード上の全 NIC がインスタンスのトラフィックを伝送するわけではないので、複数の VLAN が通過できるように設定する必要はありません。このようなポートに設定する必要があるのは VLAN 1 つのみで、管理トラフィックやブロックストレージデータの転送などの他の運用上の要件を満たす必要がある可能性があります。これらのポートは一般的にアクセスポートと呼ばれ、必要な設定は通常、トランクポートよりも簡単です。

10.5.2.1. Extreme Networks EXOS スイッチのアクセスポートの設定

上記の図の例を続行するには、以下の例で (Extreme Networks X-670 シリーズスイッチ上の) 10 を eth1 のアクセスポイントとして設定します。次の設定を使用して、VLAN 110111 のトラフィックがインスタンスに到達できるようにすることが可能です。この設定では、物理ノードの NIC がイーサネットケーブルにより物理スイッチポート (インターフェース 10) に接続されていることを前提としています。

注記

これらの値は、単なる例に過ぎません。変更せずにそのままコピーしてスイッチの設定に貼り付けると、機能が予期せず停止してしまう可能性があります。

create vlan VLANNAME tag NUMBER
configure vlan Default delete ports PORTSTRING
configure vlan VLANNAME add ports PORTSTRING untagged

以下に例を示します。

#create vlan DATA tag 110
#configure vlan Default delete ports 10
#configure vlan DATA add ports 10 untagged

10.5.3. LACP ポートアグリゲーションの設定

LACP により、複数の物理 NIC をバンドルして単一の論理チャネルを形成することができます。LACP は 802.3ad (または、Linux ではボンディングモード 4) としても知られており、負荷分散と耐障害性のための動的なボンディングを作成します。LACP は、物理 NIC と物理スイッチポートの両方の物理エンドで設定する必要があります。

10.5.3.1. 物理 NIC 上での LACP の設定

1. /home/stack/network-environment.yaml ファイルを編集します。

- type: linux_bond
  name: bond1
  mtu: 9000
  bonding_options:{get_param: BondInterfaceOvsOptions};
  members:
    - type: interface
      name: nic3
      mtu: 9000
      primary: true
    - type: interface
      name: nic4
      mtu: 9000

2. Open vSwitch ブリッジが LACP を使用するように設定します。

BondInterfaceOvsOptions:
    "mode=802.3ad"

ネットワークボンディングの設定方法についての説明は、「Open vSwitch ボンディングのオプション」を参照してください。

10.5.3.2. Extreme Networks EXOS スイッチでの LACP の設定

以下の例では、コンピュートノードに VLAN 100 を使用する NIC が 2 つあります。

enable sharing MASTERPORT grouping ALL_LAG_PORTS lacp
configure vlan VLANNAME add ports PORTSTRING tagged

以下に例を示します。

#enable sharing 11 grouping 11,12 lacp
#configure vlan DATA add port 11 untagged
注記

LACP ネゴシエーションスクリプトでタイムアウトの期間を修正する必要がある場合があります。詳しくは、「LACP configured ports interfere with PXE/DHCP on servers」を参照してください。

10.5.4. MTU の設定

特定の種別のネットワークトラフィックには、MTU サイズの調整が必要な場合があります。たとえば、特定の NFS または iSCSI のトラフィックには、ジャンボフレーム (9000 バイト) が推奨される場合があります。

注記

MTU の設定は、エンドツーエンド (トラフィックが通過すると想定されている全ホップ) で変更する必要があります。これには、仮想スイッチが含まれます。OpenStack 環境における MTU の変更についての説明は、「11章MTU の設定」を参照してください。

10.5.4.1. Extreme Networks EXOS スイッチでの MTU の設定

この例では、任意の Extreme Networks EXOS スイッチでジャンボフレームを有効にし、9000 バイトでの IP パケットの転送をサポートします。

enable jumbo-frame ports PORTSTRING
configure ip-mtu 9000 vlan VLANNAME

以下に例を示します。

# enable jumbo-frame ports 11
# configure ip-mtu 9000 vlan DATA

10.5.5. LLDP ディスカバリーの設定

ironic-python-agent サービスは、接続されたスイッチからの LLDP パケットをリッスンします。収集される情報には、スイッチ名、ポートの詳細、利用可能な VLAN を含めることができます。Cisco Discovery Protocol (CDP) と同様に、LLDP は、director の イントロスペクション プロセス中の物理ハードウェアの検出を補助します。

10.5.5.1. Extreme Networks EXOS スイッチでの LLDP の設定

以下の例は、任意の Extreme Networks EXOS スイッチで LLDP を設定できるようにします。この例では、11 がポートの文字列を示しています。

enable lldp ports 11

10.6. Juniper EX シリーズスイッチの設定

10.6.1. トランクポートの設定

OpenStack Networking により、インスタンスは物理ネットワーク上にすでに存在する VLAN に接続することができますトランク という用語は、単一のポートで複数 VLAN の通過を許可することを意味します。トランクにより、VLAN は、仮想スイッチを含む複数のスイッチ間にまたがることができます。たとえば、物理ネットワークで VLAN110 としてタグされたトラフィックが、コンピュートノードに到達すると、8021q モジュールによってタグ付けされたトラフィックが vSwitch 上の適切な VLAN に転送されます。

10.6.1.1. Juniper EX シリーズスイッチでのトランクポートの設定

Juniper JunOS を実行する Juniper EX シリーズのスイッチを使用する場合には、以下の設定を使用して、VLAN 110111 のトラフィックがインスタンスに到達できるようにことが可能です。この設定では、物理ノードの NIC がイーサネットケーブルにより物理スイッチポート (インターフェース ge-1/0/12) に接続されていることを前提としています。

注記

これらの値は、単なる例に過ぎません。変更せずにそのままコピーしてスイッチの設定に貼り付けると、機能が予期せず停止してしまう可能性があります。

 ge-1/0/12 {
          description Trunk to Compute Node;
              unit 0 {
                  family ethernet-switching {
                      port-mode trunk;
                      vlan {
                          members [110 111];
                           }
                      native-vlan-id 2;
                  }
              }
}

10.6.2. アクセスポートの設定

コンピュートノード上の全 NIC がインスタンスのトラフィックを伝送するわけではないので、複数の VLAN が通過できるように設定する必要はありません。このようなポートに設定する必要があるのは VLAN 1 つのみで、管理トラフィックやブロックストレージデータの転送などの他の運用上の要件を満たす必要がある可能性があります。これらのポートは一般的にアクセスポートと呼ばれ、必要な設定は通常、トランクポートよりも簡単です。

10.6.2.1. Juniper EX シリーズスイッチのアクセスポートの設定

上記の図の例を続行するには、以下の例で (Juniper EX シリーズスイッチ上の) ge-1/0/13 を eth1 のアクセスポイントとして設定します。この設定では、物理ノードの NIC がイーサネットケーブルにより物理スイッチポート (インターフェース ge-1/0/13) に接続されていることを前提としています。

注記

これらの値は、単なる例に過ぎません。変更せずにそのままコピーしてスイッチの設定に貼り付けると、機能が予期せず停止してしまう可能性があります。

 ge-1/0/13 {
          description Access port for Compute Node
              unit 0 {
                  family ethernet-switching {
                      port-mode access;
                      vlan {
                          members 200;
                           }
                      native-vlan-id 2;
                  }
              }
}

10.6.3. LACP ポートアグリゲーションの設定

LACP により、複数の物理 NIC をバンドルして単一の論理チャネルを形成することができます。LACP は 802.3ad (または、Linux ではボンディングモード 4) としても知られており、負荷分散と耐障害性のための動的なボンディングを作成します。LACP は、物理 NIC と物理スイッチポートの両方の物理エンドで設定する必要があります。

10.6.3.1. 物理 NIC 上での LACP の設定

1. /home/stack/network-environment.yaml ファイルを編集します。

- type: linux_bond
  name: bond1
  mtu: 9000
  bonding_options:{get_param: BondInterfaceOvsOptions};
  members:
    - type: interface
      name: nic3
      mtu: 9000
      primary: true
    - type: interface
      name: nic4
      mtu: 9000

2. Open vSwitch ブリッジが LACP を使用するように設定します。

BondInterfaceOvsOptions:
    "mode=802.3ad"

ネットワークボンディングの設定方法についての説明は、「Open vSwitch ボンディングのオプション」を参照してください。

10.6.3.2. Juniper EX シリーズスイッチでの LACP の設定

以下の例では、コンピュートノードに VLAN 100 を使用する NIC が 2 つあります。

1. コンピュートノードの 2 つの NIC を物理的にスイッチ (例: ポート 12 と 13) に接続します。

2. ポートアグリゲートを作成します。

chassis {
    aggregated-devices {
        ethernet {
            device-count 1;
        }
    }
}

3. スイッチポート 12 (ge-1/0/12) と 13 (ge-1/0/13) を設定して、ポートアグリゲート ae1 のメンバーに入れます。

interfaces {
    ge-1/0/12 {
        gigether-options {
            802.3ad ae1;
        }
    }
    ge-1/0/13 {
        gigether-options {
            802.3ad ae1;
            }
        }
}
注記

Red Hat OpenStack Platform director を使用したデプロイメントの場合、ボンディングから PXE ブートするには、ボンディングのメンバーのいずれかを lacp force-up として設定する必要があります。これにより、イントロスペクションと初回ブート時には 1 つのボンディングメンバーのみが稼働状態になります。lacp force-up で設定されているボンディングメンバーは、instackenv.json に MAC アドレスが記載されているのと同じボンディングメンバーである必要があります (ironic に認識される MAC アドレスが force-up で設定されている MAC アドレスと同じである必要があります)。

4. ポートアグリゲート ae1 で LACP を有効にします。

interfaces {
    ae1 {
        aggregated-ether-options {
            lacp {
                active;
            }
        }
    }
}

5. アグリゲート ae1 を VLAN 100 に追加します。

interfaces {
    ae1 {
        vlan-tagging;
        native-vlan-id 2;
        unit 100 {
            vlan-id 100;
        }
    }
}

6. 新しいポートチャネルを確認します。出力には、新規ポートアグリゲート ae1 と、メンバーポートの ge-1/0/12 および ge-1/0/13 が表示されます。

> show lacp statistics interfaces ae1

Aggregated interface: ae1
LACP Statistics: LACP Rx LACP Tx Unknown Rx Illegal Rx
ge-1/0/12 0 0 0 0
ge-1/0/13 0 0 0 0
注記

commit コマンドを実行して変更を適用するのを忘れないようにしてください。

10.6.4. MTU の設定

特定の種別のネットワークトラフィックには、MTU サイズの調整が必要な場合があります。たとえば、特定の NFS または iSCSI のトラフィックには、ジャンボフレーム (9000 バイト) が推奨される場合があります。

注記

MTU の設定は、エンドツーエンド (トラフィックが通過すると想定されている全ホップ) で変更する必要があります。これには、仮想スイッチが含まれます。OpenStack 環境における MTU の変更についての説明は、「11章MTU の設定」を参照してください。

10.6.4.1. Juniper EX シリーズスイッチでの MTU の設定

以下の例では、Juniper EX4200 スイッチでジャンボフレームを有効にします。

注記

MTU 値の計算は、Juniper と Cisco のどちらのデバイスを使用しているかによって異なります。たとえば、Juniper の 9216 は、Cisco の 9202 に相当します。追加のバイトが L2 ヘッダーに使用され、Cisco はこれを指定された MTU 値に自動的に追加しますが、Juniper を使用する場合には、使用可能な MTU は指定値よりも 14 バイト少なくなります。したがって、VLAN で MTU 値 9000 をサポートするには、Juniper で MTU 値を 9014 に設定する必要があります。

1. Juniper EX シリーズスイッチの場合は、インターフェースごとに MTU の設定を実行します。以下のコマンドは、ge-1/0/14 および ge-1/0/15 ポート上のジャンボフレームを設定します。

set interfaces ge-1/0/14 mtu 9216
set interfaces ge-1/0/15 mtu 9216
注記

commit コマンドを実行して変更を保存するのを忘れないようにしてください。

2. LACP アグリゲートを使用する場合には、メンバーの NIC ではなく、そのアグリゲートで MTU サイズを設定する必要があります。たとえば、以下のコマンドを実行すると、ae1 アグリゲートの MTU サイズが設定されます。

 set interfaces ae1 mtu 9216

10.6.5. LLDP ディスカバリーの設定

ironic-python-agent サービスは、接続されたスイッチからの LLDP パケットをリッスンします。収集される情報には、スイッチ名、ポートの詳細、利用可能な VLAN を含めることができます。Cisco Discovery Protocol (CDP) と同様に、LLDP は、director の イントロスペクション プロセス中の物理ハードウェアの検出を補助します。

10.6.5.1. Juniper EX シリーズスイッチでの LLDP の設定

LLDP は、全インターフェースでローバルに有効にすることや、特定のインターフェースでのみ有効にすることができます。

1. たとえば、LLDP を Juniper EX 4200 スイッチでグローバルに有効にします。

lldp {
	interface all{
		enable;
	}
	}
}

2. または、LLDP を単一のインターフェース ge-1/0/14 のみで有効にします。

lldp {
	interface ge-1/0/14{
		enable;
	}
	}
}
注記

commit コマンドを実行して変更を適用するのを忘れないようにしてください。

パート II. 高度な設定

高度な OpenStack Networking の機能に関するクックブック形式のシナリオが含まれています。

第11章 MTU の設定

11.1. MTU の概要

OpenStack Networking は、インスタンスに安全に適用することができる許容最大 MTU サイズの計算が可能です。MTU の値は、単一のネットワークパケットで転送できる最大データ量を指定します。この数は、アプリケーションに最も適したサイズによって変わります。たとえば、NFS 共有で必要な MTU サイズは VoIP アプリケーションで必要なサイズとは異なる場合があります。

注記

OpenStack Networking では、許容最大 MTU 値を計算して、neutron net-show コマンドで表示することができます。net-mtu は neutron API の拡張機能なので、一部の実装には含まれていない可能性があります。インスタンスがサポートしている場合には、必要な MTU 値を DHCPv4 クライアントに通知して自動設定を行うことが可能です。また、ルーター広告 (RA) パケットを使用して IPv6 クライアントに通知することも可能です。ルーター広告を送信するには、ネットワークがルーターに接続されている必要がある点に注意してください。

MTU 設定を正しく機能させるにはエンドツーエンドで一貫して設定する必要があります。つまり、MTU 設定は、仮想マシン自体、仮想ネットワークのインフラストラクチャー、物理ネットワーク、宛先のサーバー自体など、パケットが通過するすべてのポイントで同じサイズに指定する必要があります。

たとえば、以下の図の丸印は、インスタンスと物理サーバーの間のトラフィックに合わせて MTU 値を調節する必要があるポイントを示しています。ネットワークトラフィックを処理する全インターフェースの MTU 値は、特定の MTU サイズのパケットに対応するように変更する必要があります。トラフィックがインスタンス 192.168.200.15 から物理サーバー 10.20.15.25 に伝送されることが想定される場合には、この変更が必要です。

MTU settings

MTU 値に一貫性がないと、ネットワークにさまざまな問題が発生します。最も一般的な問題は、ランダムなパケットロスにより接続が中断して、ネットワークのパフォーマンスが低下することです。このような問題は、可能なすべてのネットワークポイントを特定してから、正しい MTU 値が設定されていることを検証する必要があるため、トラブルシューティングが困難です。

11.1.1. MTU 広告の設定

MTU 広告により、自動化された DHCP 設定や IPv6 RA 設定のレルムに MTU 設定が移動されるため、MTU 設定プロセスが簡素化されます。その結果、DHCPv4 または IPv6 RA を使用してインスタンスに最適な MTU サイズが広告されます。

MTU 広告は /etc/neutron/neutron.conf で有効にします。

advertise_mtu = True

このオプションは、Mitaka ではデフォルトで有効化されていますが、Newton では非推奨となり、今後のリリースでは削除される見込みです。このオプションを設定した場合には、テナントネットワークの設定済み MTU オプションが DHCPv4 および IPv6 RA を使用してインスタンスに広告されます。

注記

すべての DHCPv4 クライアントが MTU 値の自動設定をサポートしている訳ではありません。

11.1.2. テナントネットワークの設定

Red Hat OpenStack Platform 10 director により、ネットワーク環境ファイルの 1 つのパラメーターを使用して、すべてのテナントネットワークのデフォルト MTU を定義することができます。これにより、設定を物理 MTU に容易に整合させることができます。

  • NeutronTenantMtu: 物理ネットワークの機能を反映したベース MTU を設定します。neutron はこのベース値を使用して、管理するネットワークの MTU を計算します。たとえば、VLAN およびフラットネットワークでは、値はそのまま使用されますが、VXLAN および GRE ネットワークでは、トンネルヘッダーのオーバーヘッド分を確保するために値が低く抑えられます。VXLAN/GRE トンネリングを使用する場合、これは物理ネットワーク上で動作している MTU と同じでなければなりません。

11.1.3. director での MTU の設定

以下の例では、NIC 設定テンプレートを使用した MTU の設定方法について説明します。MTU は、ブリッジ、ボンディング (該当する場合)、インターフェース、VLAN で設定する必要があります。

            -
              type: ovs_bridge
              name: br-isolated
              use_dhcp: false
              mtu: 9000    # <--- Set MTU
              members:
                -
                  type: ovs_bond
                  name: bond1
                  mtu: 9000    # <--- Set MTU
                  ovs_options: {get_param: BondInterfaceOvsOptions}
                  members:
                    -
                      type: interface
                      name: ens15f0
                      mtu: 9000    # <--- Set MTU
                      primary: true
                    -
                      type: interface
                      name: enp131s0f0
                      mtu: 9000    # <--- Set MTU
                -
                  type: vlan
                  device: bond1
                  vlan_id: {get_param: InternalApiNetworkVlanID}
                  mtu: 9000    # <--- Set MTU
                  addresses:
                  -
                    ip_netmask: {get_param: InternalApiIpSubnet}
                -
                  type: vlan
                  device: bond1
                  mtu: 9000    # <--- Set MTU
                  vlan_id: {get_param: TenantNetworkVlanID}
                  addresses:
                  -
                    ip_netmask: {get_param: TenantIpSubnet}

11.1.4. MTU 計算の確認

計算された MTU 値を確認します。これは、インスタンスが使用可能な MTU の最大許容値を計算した結果です。次に、ネットワークトラフィックの経路で関連する全インターフェースにこの値を設定して先に進むことができます。

# neutron net-show <network>

第12章 Quality-of-Service (QoS) の設定

Red Hat OpenStack Platform 10 では、ネットワークの quality-of-service (QoS) ポリシーがサポートされるようになりました。これらのポリシーにより、OpenStack の管理者は、インスタンスの送信トラフィックに速度制限を適用して、さまざまなサービスレベルを提供することができます。QoS ポリシーを実装すると、指定したレートを超過するトラフィックはドロップされるようになります。

12.1. QoS ポリシースコープ

QoS ポリシーは個々のポートまたは特定のテナントネットワークに適用されます。テナントネットワークに適用される場合、そのポリシーは、ポリシーが適用されていないポートに継承されます。

12.2. QoS ポリシー管理

QoS ポリシーは、動的に適用、変更、削除することができます。以下の例では、帯域幅を制限するルールを手動で作成して、1 つのポートに適用します。

  1. テナントの一覧を確認して、QoS ポリシーを作成するテナントの ID を決定します。

    # openstack project list
    +----------------------------------+----------+
    | ID                               | Name     |
    +----------------------------------+----------+
    | 4b0b98f8c6c040f38ba4f7146e8680f5 | auditors |
    | 519e6344f82e4c079c8e2eabb690023b | services |
    | 80bf5732752a41128e612fe615c886c6 | demo     |
    | 98a2f53c20ce4d50a40dac4a38016c69 | admin    |
    +----------------------------------+----------+
  2. admin テナントに bw-limiter という名前の QoS ポリシーを作成します。

    # neutron qos-policy-create 'bw-limiter' --tenant-id 98a2f53c20ce4d50a40dac4a38016c69
  3. bw-limiter の規制ルールを設定します。

    # neutron qos-bandwidth-limit-rule-create bw-limiter --max_kbps 3000 --max_burst_kbps 3000
  4. bw-limiter ポリシーを適用する neutron ポートを設定します

    # neutron port-update <port id> --qos-policy bw-limiter
  5. QoS ルールを確認します。以下に例を示します。

    # neutron qos-rule-show 9be535c3-daa2-4d7b-88ea-e8de16
    
    +-------------------+---------------------------------+
    | Field             | Value                           |
    +-------------------+---------------------------------+
    | id                | 9be535c3-daa2-4d7b-88ea-e8de16  |
    | rule_type         | bandwidth_limit                 |
    | description       |                                 |
    | max_kbps          | 3000                            |
    | max_burst_kbps    | 300                             |
    +-------------------+---------------------------------+

以下の値により、規制のアルゴリズムを適宜に設定することができます。

  • max_kbps: インスタンスが送信可能な最大レート (Kbps 単位)
  • max_burst_kbps: トークンのバッファーが満杯であった場合にそのポートが一度に送信することができたデータの最大量 (キロビット単位)。トークンのバッファーは「max_kbps」のレートで補充されます。

12.3. 送信トラフィックの DSCP マーキング

Differentiated Services Code Point (DSCP) では、IP ヘッダーに関連の値を埋め込むことで、ネットワーク上に QoS を実装することができます。OpenStack Networking (neutron) QoS ポリシーは、DSCP マーキングを使用して、neutron ポートとネットワーク上で送信トラフィックを管理することができます。現在、DSCP は Open vSwitch (OVS) を使用する VLAN とフラットプロバイダーネットワークのみに利用できます。今後、VXLAN もサポートされる予定です。

この実装では、最初にポリシーが作成され、DSCP ルールが定義されてポリシーに適用されます。これらのルールは、--dscp-mark パラメーターを使用して、DSCP マークに 10 進数の値を指定します。以下に例を示します。

1. 新規 QoS ポリシーを作成します。

neutron qos-policy-create qos-web-servers --tenant-id 98a2f53c20ce4d50a40dac4a38016c69

2. DSCP マーク 18 を使用して、DSCP ルールを作成してそれを qos-web-servers ポリシーに適用します。

neutron qos-dscp-marking-rule-create qos-web-servers --dscp-mark 18
Created a new dscp_marking_rule:
+-----------+--------------------------------------+
| Field     | Value                                |
+-----------+--------------------------------------+
| dscp_mark | 18                                   |
| id        | d7f976ec-7fab-4e60-af70-f59bf88198e6 |
+-----------+--------------------------------------+

3. QoS ポリシー qos-web-servers の DSCP ルールを表示します。

neutron qos-dscp-marking-rule-list qos-web-servers
+-----------+--------------------------------------+
| dscp_mark | id                                   |
+-----------+--------------------------------------+
|        18 | d7f976ec-7fab-4e60-af70-f59bf88198e6 |
+-----------+--------------------------------------+

4. qos-web-servers ポリシーに割り当てられた DSCP ルールの詳細を表示します。

neutron qos-dscp-marking-rule-show d7f976ec-7fab-4e60-af70-f59bf88198e6 qos-web-servers
+-----------+--------------------------------------+
| Field     | Value                                |
+-----------+--------------------------------------+
| dscp_mark | 18                                   |
| id        | d7f976ec-7fab-4e60-af70-f59bf88198e6 |
+-----------+--------------------------------------+

5. ルールに割り当てられた DSCP 値を変更します。

neutron qos-dscp-marking-rule-update d7f976ec-7fab-4e60-af70-f59bf88198e6 qos-web-servers --dscp-mark 22
Updated dscp_marking_rule: d7f976ec-7fab-4e60-af70-f59bf88198e6

6. DSCP ルールを削除します。

neutron qos-dscp-marking-rule-delete d7f976ec-7fab-4e60-af70-f59bf88198e6 qos-web-servers
Deleted dscp_marking_rule(s): d7f976ec-7fab-4e60-af70-f59bf88198e6

12.4. QoS ポリシーの RBAC

Red Hat OpenStack Platform 10 では、QoS ポリシーにロールベースアクセス制御 (RBAC) が追加されました。これにより、QoS ポリシーを特定のプロジェクトに適用できるようになりました。

たとえば、優先順位が低いネットワークトラフィックを許可する QoS ポリシーを作成して、特定のプロジェクトにのみ適用することができます。以下のコマンドでは、以前に作成した bw-limiter ポリシーが demo テナントに割り当てられます。

# neutron rbac-create 'bw-limiter' --type qos-policy --target-tenant 80bf5732752a41128e612fe615c886c6 --action access_as_shared

第13章 ブリッジマッピングの設定

本章では、Red Hat OpenStack Platform の ブリッジマッピング の設定方法を説明します。

13.1. ブリッジマッピングを使用する目的

ブリッジマッピングにより、プロバイダーネットワークのトラフィックは、物理ネットワークに到達することが可能となります。トラフィックは、ルーターの qg-xxx インターフェースからプロバイダーネットワークの外部に送出されて、br-int に達します。次に br-intbr-ex の間のパッチポートにより、トラフィックはプロバイダーネットワークのブリッジを通過して物理ネットワークまで到達することができます。

13.1.1. ブリッジマッピングの設定

以下は、br-intbr-ex のパッチピアの例です。

int-br-ex <-> phy-br-ex

この接続は、bridge_mappings で設定します。以下に例を示します。

bridge_mappings = physnet1:br-ex,physnet2:br-ex2
注記

bridge_mapping エントリーが見つからない場合には、ネットワーク接続が存在しないか、物理ネットワークへの通信が機能していません。

この設定の最初のエントリーは、パッチピアケーブルを使用して br-intbr-ex の間の接続を作成します。2 番目のエントリーは、br-ex2 のパッチピアを作成します。

13.1.2. コントローラーノードの設定

bridge_mappings の設定は、コントローラーノードの network_vlan_ranges オプションと相関する必要があります。たとえば、上記の例では、コントローラーノードを以下のように設定します。

network_vlan_ranges = physnet1:10:20,physnet2:21:25

これらの値により、対応する外部ネットワークを表すプロバイダーが作成されてから、外部ネットワークはルーターのインターフェースを介してテナントのネットワークに接続されます。このため、ルーターがスケジュールされているネットワークノード上で bridge_mappings を設定する必要があります。これは、プロバイダーネットワークによって表されているルーターのトラフィックが正しい物理ネットワーク (例: physnet1) を使用して送信できることを意味します。

13.1.3. トラフィックの流れ

この設定は、接続の作成以外に、br-intbr-ex で OVS フローを設定し、外部ネットワークとの間でネットワークトラフィックの送受信が可能になります。外部ネットワークはそれぞれ、内部 VLAN id で表され、ルーターの qg-xxx ポートにタグ付けされます。パケットが phy-br-ex に到達すると、br-ex ポートは VLAN タグをストリップ化して、このパケットを物理インターフェース、その後に外部ネットワークに移動します。外部ネットワークからのリターンパケットは br-ex に到達して、phy-br-ex <→ int-br-ex を使用することで br-int に移動されます。パケットが int-br-ex に到達すると、br-int の別のフローがパケットに内部 VLAN タグを追加します。これにより、パケットは qg-xxx により受理可能になります。

13.2. ブリッジマッピングのメンテナンス

マッピングを削除した後には、patch port のクリーンアップを実行する必要があります。この操作により、ブリッジ設定から誤ったエントリーが確実に消去されます。このタスクを実行するには 2 つのオプションを利用できます。

  • 手動ポートクリーンアップ: 不要なポートを慎重に削除する必要があります。ネットワーク接続を停止する必要はありません。
  • neutron-ovs-cleanup を使用した自動ポートクリーンアップ: クリーンアップが自動で実行されますが、ネットワーク接続を停止する必要があります。また、必要なマッピングを再度追加する必要があります。このオプションは、ネットワーク接続を停止しても支障がない場合に選択してください。

各オプションの例を以下に示します。

13.2.1. 手動ポートクリーンアップ

手動ポートクリーンアッププロセスは、不要なポートを削除します。システムを停止する必要はありません。これらのポートは命名規則により特定することができます。br-$external_bridge では "phy-"$external_bridgebr-int では "int-"$external_bridge という名前が指定されます。

以下の例に記載する手順では、bridge_mappings からブリッジを削除し、対応するポートをクリーンアップします。1. openvswitch_agent.ini を編集して、bridge_mappings から physnet2:br-ex2 のエントリーを削除します。

bridge_mappings = physnet1:br-ex,physnet2:br-ex2

physnet2:br-ex2 のエントリーを削除します。削除した後の bridge_mappings は以下のようになります。

bridge_mappings = physnet1:br-ex

2. ovs-vsctl を使用して、削除した physnet2:br-ex2 エントリーに関連付けられたパッチポートを削除します。

# ovs-vsctl del-port br-ex2 phy-br-ex2
# ovs-vsctl del-port br-int int-br-ex2
注記

bridge_mappings エントリー全体が削除またはコメントアウトされた場合には、各エントリーに対してクリーンアップコマンドを実行する必要があります。

3. neutron-openvswitch-agent を再起動します。

# service neutron-openvswitch-agent restart

13.2.2. 「neutron-ovs-cleanup」を使用した自動ポートクリーンアップ

この操作は neutron-ovs-cleanup コマンドに --ovs_all_ports フラグを指定して実行します。neutron サービスまたはノード全体を再起動して、ブリッジを通常の稼動状態に戻します。このプロセスでは、ネットワーク接続を完全に停止する必要があります。

neutron-ovs-cleanup コマンドは、すべての OVS ブリッジから全ポート (インスタンス、qdhcp/qrouter など) を抜線します。--ovs_all_ports フラグを使用すると br-int から全ポートが削除されて、br-tun からトンネルエンドが、またブリッジ間からはパッチポートがクリーンアップされます。また、物理インターフェース (例: eth0、eth1) はブリッジ (例: br-ex、br-ex2) から削除されます。これにより、ovs-vsctl を使用してポートを手動で再度追加するまでの間は、インスタンスへの接続はできなくなります。

# ovs-vsctl add-port br-ex eth1

13.2.2.1. neutron-ovs-cleanup の使用例

1. openvswitch_agent.ini に記載されている bridge_mapping のエントリーをバックアップします。

2. --ovs_all_ports フラグを指定して neutron-ovs-cleanup コマンドを実行します。このステップにより、ネットワーク接続が完全に停止される点に注意してください。

# /usr/bin/neutron-ovs-cleanup
--config-file /etc/neutron/plugins/ml2/openvswitch_agent.ini
--log-file /var/log/neutron/ovs-cleanup.log --ovs_all_ports

3. OpenStack Networking サービスを再起動します。

# systemctl restart neutron-openvswitch-agent
# systemctl restart neutron-l3-agent.service
# systemctl restart neutron-dhcp-agent.service

4. openvswitch_agent.inibridge_mapping エントリーを再度追加して、接続を回復します。

5. neutron-openvswitch-agent サービスを再起動します。

# systemctl restart neutron-openvswitch-agent
注記

OVS エージェントを再起動する際には、bridge_mappings に設定されていない接続には影響はありません。br-intbr-ex2 に接続していて、かつ br-ex2 にフローがある場合には、bridge_mappings 設定から削除 (または完全にコメントアウト) してしまうと、サービスやノードを再起動するなど、どのような操作を行っても、2 つのブリッジは切断されません。

13.3. VLAN 対応のインスタンス

13.3.1. 概要

インスタンスは、単一の仮想 NIC を使用して、VLAN のタグが付いたトラフィックを送受信できるようになりました。この機能は、単一の仮想 NIC で複数の顧客/サービスに対応できるので、特に VLAN のタグが付いたトラフィックを想定する NFV アプリケーション (VNF) に役立ちます。

たとえば、テナントのデータネットワークは VLAN またはトンネリング (VXLAN/GRE) の分割を使用できますが、インスタンスからは VLAN ID がタグ付けされたトラフィックが見えます。したがって、ネットワークパケットはネットワーク全体でタグ付けが必要な訳ではなく、インスタンスに注入される直前にタグ付けされます。

親ポートを作成して、既存の neutron ネットワークにアタッチすることで実装を開始します。これにより、作成した親ポートにトランクの接続が追加されます。次にサブポートを作成します。このサブポートは、VLAN とインスタンスを接続するポートで、このポートを使用することでトランクに接続を確立できます。インスタンスのオペレーティングシステム内で、サブポートが関連付けられた VLAN のトラフィックをタグ付けするサブインターフェースを作成する必要があります。

13.3.2. トランクプラグインのレビュー

director ベースのデプロイメントでは、トランクプラグインはデフォルトでオンになっています。コントローラーノードで設定をレビューすることができます。

1. コントローラーノード上で、/etc/neutron/neutron.conftrunk プラグインが有効化されていることを確認します。以下に例を示します。

service_plugins=router,qos,trunk

13.3.3. トランク接続の作成

1. トランクポートの接続を必要とするネットワークを特定します。これは、トランキングされた VLAN へのアクセスを必要とするインタンスが含まれるネットワークのことです。以下の例では、このネットワークは public ネットワークです。

openstack network list
+--------------------------------------+---------+--------------------------------------+
| ID                                   | Name    | Subnets                              |
+--------------------------------------+---------+--------------------------------------+
| 82845092-4701-4004-add7-838837837621 | private | 434c7982-cd96-4c41-a8c9-b93adbdcb197 |
| 8d8bc6d6-5b28-4e00-b99e-157516ff0050 | public  | 3fd811b4-c104-44b5-8ff8-7a86af5e332c |
+--------------------------------------+---------+--------------------------------------+

2. 親のトランクポートを作成して、インスタンスの接続先ネットワークにアタッチします。以下の例では、parent-trunk-port という名前の neutron ポートが パブリック ネットワーク上に作成されます。このトランクは、サブポート の作成に使用できるので、 ポートと見なされます。

openstack port create --network public parent-trunk-port
+-----------------------+-----------------------------------------------------------------------------+
| Field                 | Value                                                                       |
+-----------------------+-----------------------------------------------------------------------------+
| admin_state_up        | UP                                                                          |
| allowed_address_pairs |                                                                             |
| binding_host_id       |                                                                             |
| binding_profile       |                                                                             |
| binding_vif_details   |                                                                             |
| binding_vif_type      | unbound                                                                     |
| binding_vnic_type     | normal                                                                      |
| created_at            | 2016-10-20T02:02:33Z                                                        |
| description           |                                                                             |
| device_id             |                                                                             |
| device_owner          |                                                                             |
| extra_dhcp_opts       |                                                                             |
| fixed_ips             | ip_address='172.24.4.230', subnet_id='dc608964-9af3-4fed-9f06-6d3844fb9b9b' |
| headers               |                                                                             |
| id                    | 20b6fdf8-0d43-475a-a0f1-ec8f757a4a39                                        |
| mac_address           | fa:16:3e:33:c4:75                                                           |
| name                  | parent-trunk-port                                                           |
| network_id            | 871a6bd8-4193-45d7-a300-dcb2420e7cc3                                        |
| project_id            | 745d33000ac74d30a77539f8920555e7                                            |
| project_id            | 745d33000ac74d30a77539f8920555e7                                            |
| revision_number       | 4                                                                           |
| security_groups       | 59e2af18-93c6-4201-861b-19a8a8b79b23                                        |
| status                | DOWN                                                                        |
| updated_at            | 2016-10-20T02:02:33Z                                                        |
+-----------------------+-----------------------------------------------------------------------------+

4. 前のステップで作成したポートを使用して、トランクを作成します。以下の例では、トランクは parent-trunk という名前です。

openstack network trunk create --parent-port parent-trunk-port parent-trunk
+-----------------+--------------------------------------+
| Field           | Value                                |
+-----------------+--------------------------------------+
| admin_state_up  | UP                                   |
| created_at      | 2016-10-20T02:05:17Z                 |
| description     |                                      |
| id              | 0e4263e2-5761-4cf6-ab6d-b22884a0fa88 |
| name            | parent-trunk                         |
| port_id         | 20b6fdf8-0d43-475a-a0f1-ec8f757a4a39 |
| revision_number | 1                                    |
| status          | DOWN                                 |
| sub_ports       |                                      |
| tenant_id       | 745d33000ac74d30a77539f8920555e7     |
| updated_at      | 2016-10-20T02:05:17Z                 |
+-----------------+--------------------------------------+

5. トランクの接続を確認します。

openstack network trunk list
+--------------------------------------+--------------+--------------------------------------+-------------+
| ID                                   | Name         | Parent Port                          | Description |
+--------------------------------------+--------------+--------------------------------------+-------------+
| 0e4263e2-5761-4cf6-ab6d-b22884a0fa88 | parent-trunk | 20b6fdf8-0d43-475a-a0f1-ec8f757a4a39 |             |
+--------------------------------------+--------------+--------------------------------------+-------------+
  • トランク接続の詳細を表示します。
openstack network trunk show parent-trunk
+-----------------+--------------------------------------+
| Field           | Value                                |
+-----------------+--------------------------------------+
| admin_state_up  | UP                                   |
| created_at      | 2016-10-20T02:05:17Z                 |
| description     |                                      |
| id              | 0e4263e2-5761-4cf6-ab6d-b22884a0fa88 |
| name            | parent-trunk                         |
| port_id         | 20b6fdf8-0d43-475a-a0f1-ec8f757a4a39 |
| revision_number | 1                                    |
| status          | DOWN                                 |
| sub_ports       |                                      |
| tenant_id       | 745d33000ac74d30a77539f8920555e7     |
| updated_at      | 2016-10-20T02:05:17Z                 |
+-----------------+--------------------------------------+

13.3.4. トランクへのサブポートの追加

1. neutron ポートを作成します。このポートは、トランクへのサブポート接続として使用されます。また、親ポートに割り当てられた MAC アドレスを指定する必要があります。

openstack port create --network private --mac-address fa:16:3e:33:c4:75 subport-trunk-port
+-----------------------+--------------------------------------------------------------------------+
| Field                 | Value                                                                    |
+-----------------------+--------------------------------------------------------------------------+
| admin_state_up        | UP                                                                       |
| allowed_address_pairs |                                                                          |
| binding_host_id       |                                                                          |
| binding_profile       |                                                                          |
| binding_vif_details   |                                                                          |
| binding_vif_type      | unbound                                                                  |
| binding_vnic_type     | normal                                                                   |
| created_at            | 2016-10-20T02:08:14Z                                                     |
| description           |                                                                          |
| device_id             |                                                                          |
| device_owner          |                                                                          |
| extra_dhcp_opts       |                                                                          |
| fixed_ips             | ip_address='10.0.0.11', subnet_id='1a299780-56df-4c0b-a4c0-c5a612cef2e8' |
| headers               |                                                                          |
| id                    | 479d742e-dd00-4c24-8dd6-b7297fab3ee9                                     |
| mac_address           | fa:16:3e:33:c4:75                                                        |
| name                  | subport-trunk-port                                                       |
| network_id            | 3fe6b758-8613-4b17-901e-9ba30a7c4b51                                     |
| project_id            | 745d33000ac74d30a77539f8920555e7                                         |
| project_id            | 745d33000ac74d30a77539f8920555e7                                         |
| revision_number       | 4                                                                        |
| security_groups       | 59e2af18-93c6-4201-861b-19a8a8b79b23                                     |
| status                | DOWN                                                                     |
| updated_at            | 2016-10-20T02:08:15Z                                                     |
+-----------------------+--------------------------------------------------------------------------+
注記

HttpException: Conflict のエラーが発生した場合には、親のトランクポートのあるネットワークとは異なるネットワークで、サブポートを作成していることを確認してください。この例では、親トランクポートに パブリック ネットワークを、サブポートには プライベート ネットワークを使用しています。

2. トランク (parent-trunk) とポートを関連付けて、VLAN ID (55) を指定します。

openstack network trunk set --subport port=subport-trunk-port,segmentation-type=vlan,segmentation-id=55 parent-trunk

13.4. トランクを使用するためのインスタンスの設定

neutron がサブポートに割り当てた MAC アドレスを使用するには、インスタンスのオペレーティングシステムを設定する必要があります。サブポート作成のステップで、固有の MAC アドレスを使用するようにサブポートも設定してください。

1. ネットワークトランクの設定を確認します。

$ openstack network trunk list
+--------------------------------------+--------------+--------------------------------------+-------------+
| ID                                   | Name         | Parent Port                          | Description |
+--------------------------------------+--------------+--------------------------------------+-------------+
| 0e4263e2-5761-4cf6-ab6d-b22884a0fa88 | parent-trunk | 20b6fdf8-0d43-475a-a0f1-ec8f757a4a39 |             |
+--------------------------------------+--------------+--------------------------------------+-------------+


$ openstack network trunk show parent-trunk
+-----------------+------------------------------------------------------------------------------------------------+
| Field           | Value                                                                                          |
+-----------------+------------------------------------------------------------------------------------------------+
| admin_state_up  | UP                                                                                             |
| created_at      | 2016-10-20T02:05:17Z                                                                           |
| description     |                                                                                                |
| id              | 0e4263e2-5761-4cf6-ab6d-b22884a0fa88                                                           |
| name            | parent-trunk                                                                                   |
| port_id         | 20b6fdf8-0d43-475a-a0f1-ec8f757a4a39                                                           |
| revision_number | 2                                                                                              |
| status          | DOWN                                                                                           |
| sub_ports       | port_id='479d742e-dd00-4c24-8dd6-b7297fab3ee9', segmentation_id='55', segmentation_type='vlan' |
| tenant_id       | 745d33000ac74d30a77539f8920555e7                                                               |
| updated_at      | 2016-10-20T02:10:06Z                                                                           |
+-----------------+------------------------------------------------------------------------------------------------+

2. 親ポート id を仮想 NIC として使用するインスタンスを作成します。

nova boot --image cirros --flavor m1.tiny testInstance --security-groups default --key-name sshaccess --nic port-id=20b6fdf8-0d43-475a-a0f1-ec8f757a4a39


+--------------------------------------+-----------------------------------------------+
| Property                             | Value                                         |
+--------------------------------------+-----------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                        |
| OS-EXT-AZ:availability_zone          |                                               |
| OS-EXT-SRV-ATTR:host                 | -                                             |
| OS-EXT-SRV-ATTR:hostname             | testinstance                                  |
| OS-EXT-SRV-ATTR:hypervisor_hostname  | -                                             |
| OS-EXT-SRV-ATTR:instance_name        |                                               |
| OS-EXT-SRV-ATTR:kernel_id            |                                               |
| OS-EXT-SRV-ATTR:launch_index         | 0                                             |
| OS-EXT-SRV-ATTR:ramdisk_id           |                                               |
| OS-EXT-SRV-ATTR:reservation_id       | r-juqco0el                                    |
| OS-EXT-SRV-ATTR:root_device_name     | -                                             |
| OS-EXT-SRV-ATTR:user_data            | -                                             |
| OS-EXT-STS:power_state               | 0                                             |
| OS-EXT-STS:task_state                | scheduling                                    |
| OS-EXT-STS:vm_state                  | building                                      |
| OS-SRV-USG:launched_at               | -                                             |
| OS-SRV-USG:terminated_at             | -                                             |
| accessIPv4                           |                                               |
| accessIPv6                           |                                               |
| adminPass                            | uMyL8PnZRBwQ                                  |
| config_drive                         |                                               |
| created                              | 2016-10-20T03:02:51Z                          |
| description                          | -                                             |
| flavor                               | m1.tiny (1)                                   |
| hostId                               |                                               |
| host_status                          |                                               |
| id                                   | 88b7aede-1305-4d91-a180-67e7eac8b70d          |
| image                                | cirros (568372f7-15df-4e61-a05f-10954f79a3c4) |
| key_name                             | sshaccess                                     |
| locked                               | False                                         |
| metadata                             | {}                                            |
| name                                 | testInstance                                  |
| os-extended-volumes:volumes_attached | []                                            |
| progress                             | 0                                             |
| security_groups                      | default                                       |
| status                               | BUILD                                         |
| tags                                 | []                                            |
| tenant_id                            | 745d33000ac74d30a77539f8920555e7              |
| updated                              | 2016-10-20T03:02:51Z                          |
| user_id                              | 8c4aea738d774967b4ef388eb41fef5e              |
+--------------------------------------+-----------------------------------------------+

第14章 RBAC の設定

OpenStack Networking の Role-based Access Control (RBAC) により、細かな粒度で neutron 共有ネットワークを制御することができます。以前のリリースでは、ネットワークは全テナントで共有するか、全く共有しないかのいずれかでした。本リリースでは、OpenStack Networking は RBAC テーブルを使用してテナント間における neutron ネットワークの共有を制御するようになりました。
これにより、クラウド管理者は一部のテナントからネットワーク作成機能を削除し、逆にそのプロジェクトに対応した既存ネットワークへの接続を許可することができます。

14.1. 新規 RBAC ポリシーの作成

以下の手順では、RBAC ポリシーを使用してテナントに共有ネットワークへのアクセスを許可する方法の実例を紹介します。

  1. 利用可能なネットワークの一覧を表示します。

    # neutron net-list
    +--------------------------------------+-------------+-------------------------------------------------------+
    | id                                   | name        | subnets                                               |
    +--------------------------------------+-------------+-------------------------------------------------------+
    | fa9bb72f-b81a-4572-9c7f-7237e5fcabd3 | web-servers | 20512ffe-ad56-4bb4-b064-2cb18fecc923 192.168.200.0/24 |
    | bcc16b34-e33e-445b-9fde-dd491817a48a | private     | 7fe4a05a-4b81-4a59-8c47-82c965b0e050 10.0.0.0/24      |
    | 9b2f4feb-fee8-43da-bb99-032e4aaf3f85 | public      | 2318dc3b-cff0-43fc-9489-7d4cf48aaab9 172.24.4.224/28  |
    +--------------------------------------+-------------+-------------------------------------------------------+
  2. テナントの一覧を表示します。

    # openstack project list
    +----------------------------------+----------+
    | ID                               | Name     |
    +----------------------------------+----------+
    | 4b0b98f8c6c040f38ba4f7146e8680f5 | auditors |
    | 519e6344f82e4c079c8e2eabb690023b | services |
    | 80bf5732752a41128e612fe615c886c6 | demo     |
    | 98a2f53c20ce4d50a40dac4a38016c69 | admin    |
    +----------------------------------+----------+
  3. web-servers ネットワークの RBAC エントリーを作成し、auditors テナント (4b0b98f8c6c040f38ba4f7146e8680f5) にアクセスを許可します。

    # neutron rbac-create fa9bb72f-b81a-4572-9c7f-7237e5fcabd3 --type network --target-tenant 4b0b98f8c6c040f38ba4f7146e8680f5 --action access_as_shared
    Created a new rbac_policy:
    +---------------+--------------------------------------+
    | Field         | Value                                |
    +---------------+--------------------------------------+
    | action        | access_as_shared                     |
    | id            | 314004d0-2261-4d5e-bda7-0181fcf40709 |
    | object_id     | fa9bb72f-b81a-4572-9c7f-7237e5fcabd3 |
    | object_type   | network                              |
    | target_tenant | 4b0b98f8c6c040f38ba4f7146e8680f5     |
    | tenant_id     | 98a2f53c20ce4d50a40dac4a38016c69     |
    +---------------+--------------------------------------+

これにより、auditors プロジェクトでインスタンスを web-servers ネットワークに接続できるようになります。

14.2. 設定したRBAC ポリシーの確認

  1. 既存の RBAC ポリシーの ID を取得するには、neutron rbac-list オプションを使用してください。

    # neutron rbac-list
    +--------------------------------------+-------------+--------------------------------------+
    | id                                   | object_type | object_id                            |
    +--------------------------------------+-------------+--------------------------------------+
    | 314004d0-2261-4d5e-bda7-0181fcf40709 | network     | fa9bb72f-b81a-4572-9c7f-7237e5fcabd3 |
    | bbab1cf9-edc5-47f9-aee3-a413bd582c0a | network     | 9b2f4feb-fee8-43da-bb99-032e4aaf3f85 |
    +--------------------------------------+-------------+--------------------------------------+
  2. neutron rbac-show を使用して、特定の RBAC エントリーの詳細を表示します。

    # neutron rbac-show 314004d0-2261-4d5e-bda7-0181fcf40709
    +---------------+--------------------------------------+
    | Field         | Value                                |
    +---------------+--------------------------------------+
    | action        | access_as_shared                     |
    | id            | 314004d0-2261-4d5e-bda7-0181fcf40709 |
    | object_id     | fa9bb72f-b81a-4572-9c7f-7237e5fcabd3 |
    | object_type   | network                              |
    | target_tenant | 4b0b98f8c6c040f38ba4f7146e8680f5     |
    | tenant_id     | 98a2f53c20ce4d50a40dac4a38016c69     |
    +---------------+--------------------------------------+

14.3. RBAC ポリシーの削除

  1. 既存の RBAC の ID を取得するには、neutron rbac-list オプションを使用してください。

    # neutron rbac-list
    +--------------------------------------+-------------+--------------------------------------+
    | id                                   | object_type | object_id                            |
    +--------------------------------------+-------------+--------------------------------------+
    | 314004d0-2261-4d5e-bda7-0181fcf40709 | network     | fa9bb72f-b81a-4572-9c7f-7237e5fcabd3 |
    | bbab1cf9-edc5-47f9-aee3-a413bd582c0a | network     | 9b2f4feb-fee8-43da-bb99-032e4aaf3f85 |
    +--------------------------------------+-------------+--------------------------------------+
  2. neutron rbac-delete コマンドで対象の ID 値を使用して RBAC を削除します。

    # neutron rbac-delete 314004d0-2261-4d5e-bda7-0181fcf40709
    Deleted rbac_policy: 314004d0-2261-4d5e-bda7-0181fcf40709

14.4. 外部ネットワークの RBAC

--action access_as_external パラメーターを使用して、外部ネットワーク (ゲートウェイインターフェースがアタッチされているネットワーク) への RBAC アクセスを許可することができます。

たとえば、以下の手順では web-servers ネットワークの RBAC を作成して、engineering テナント (c717f263785d4679b16a122516247deb) へのアクセスを許可します。

1. --action access_as_external を使用して新しい RBAC ポリシーを作成します。

# neutron rbac-create 6e437ff0-d20f-4483-b627-c3749399bdca --type network --target-tenant c717f263785d4679b16a122516247deb --action access_as_external
 Created a new rbac_policy:
+---------------+--------------------------------------+
| Field         | Value                                |
+---------------+--------------------------------------+
| action        | access_as_external                   |
| id            | ddef112a-c092-4ac1-8914-c714a3d3ba08 |
| object_id     | 6e437ff0-d20f-4483-b627-c3749399bdca |
| object_type   | network                              |
| target_tenant | c717f263785d4679b16a122516247deb     |
| tenant_id     | c717f263785d4679b16a122516247deb     |
+---------------+--------------------------------------+

2. 上記のコマンドを実行した結果、Engineering テナントのユーザーは、ネットワークの表示やそのネットワークへのインスタンスの接続が可能になります。

$ neutron net-list
+--------------------------------------+-------------+------------------------------------------------------+
| id                                   | name        | subnets                                              |
+--------------------------------------+-------------+------------------------------------------------------+
| 6e437ff0-d20f-4483-b627-c3749399bdca | web-servers | fa273245-1eff-4830-b40c-57eaeac9b904 192.168.10.0/24 |
+--------------------------------------+-------------+------------------------------------------------------+

第15章 分散仮想ルーター (DVR) の設定

Red Hat OpenStack Platform 10 をデプロイする場合には、そのデプロイメントに対して集中ルーティングモデルまたは DVR いずれかのオプションを選択することができます。DVR は完全にサポートされており、設定オプションとして利用できますが、Red Hat OpenStack Platform 10 director のデフォルトの設定は、集中ルーティングのままとなっています。

集中ルーティングも、DVR も有効なルーティングモデルで、それぞれに短所、長所がある点に留意することが重要です。本書を使用して、集中ルーティングと DVR のどちらがニーズにより適しているかを慎重に計画することを推奨します。

15.1. レイヤー 3 ルーティングの概要

OpenStack Networking (neutron) は、プロジェクトネットワークにルーティングサービスを提供します。ルーターがない場合には、プロジェクトネットワーク内のインスタンスは、共有 L2 ブロードキャストドメインでのみ相互通信が可能となります。ルーターを作成して、テナントネットワークに割り当てると、そのネットワークのインスタンスが他のプロジェクトネットワークやアップストリームと通信することができます (外部ゲートウェイがルーターに定義されている場合)。

15.1.1. ルーティングのフロー

OpenStack のルーティングサービスは主に、3 つのフローに分類できます。

  • East-West ルーティング: 同じテナント内の異なるネットワーク間のトラフィックのルーティング。このトラフィックは OpenStack デプロイメント外には出ません。この定義は、IPv4 と IPv6 のサブネット両方に提供されます。
  • Floating IP を使用した North-South ルーティング: Floating IP のアドレス指定とはインスタンス間をフロートする変更可能な 1 対 1 の NAT であるという説明が最も適しています。Floating IP は、Floating IP と neutron ポートの間での 1 対 1 の関連付けとしてモデル化されていますが、Floating IP は NAT の変換を実行する neutron ルーターとの関連付けで実装されています。Floating IP 自体は、外部と接続可能なルーターを提供するアップリンクネットワークから取得されます。したがって、インスタンスと (インターネットのエンドポイントなど) 外部のリソースとの間の通信が可能です。Floating IP は IPv4 の概念で、IPv6 には適用されません。プロジェクトが使用する IPv6 のアドレス指定は、プロジェクト全体で重複のないグローバルユニキャストアドレス (GUA) を使用することが前提であるため、NAT なしにルーティングが可能です。
  • Floating IP なしの North-South ルーティング (別名: SNAT): Neutron は、Floating IP が割り当てられていないインスタンスに、デフォルトのポートアドレス変換 (PAT) サービスを提供します。このサービスを使用すると、インスタンスはルーター経由で外部のエンドポイントと通信ができますが、外部のエンドポイントからはインスタンスへは通信ができません。たとえば、インターネット上の Web サイトをブラウズできますが、外部の Web ブラウザーはこのインスタンス内でホストされている Web サイトをブラウスすることはできません。SNAT は、IPv4 トラフィックのみに適用されます。さらに、GUA プレフィックスが割り当てられた neutron プロジェクトネットワークでは、外部にアクセスするために neutron ルーターの外部ゲートウェイポート上に NAT は必要ありません。

15.1.2. 集中ルーティング

neutron は当初、集中ルーティングモデルで設計されました。このモデルでは、neutron L3 エージェントで管理されるプロジェクトの仮想ルーターはすべて専用のノードまたはデプロイ、導入ノードのクラスター (ネットワークノードまたはコントローラーノード) にデプロイされます。したがって、ルーティングの機能が必要となる度に (East/West、Floating IP または SNAT)、トラフィックはトポロジー内の専用のノードを経由します。そのため、複数の課題が発生し、トラフィックフローは最適な状態ではありませんでした。以下に例を示します。

  • コントローラーノード経由で伝送されるインスタンス間のトラフィック: L3 を使用して 2 つのインスタンス間で通信する必要がある場合に、トラフィックはコントローラーノードを経由する必要があります。同じコンピュートノードでインスタンスがそれぞれスケジューリングされている場合でも、トラフィックはコンピュートノードを離れてからコントローラーを通過して、コンピュートノードに戻ってくる必要があります。このことが、パフォーマンスに悪影響を与えます。
  • コントローラーノード経由でパケットを送受信するインスタンス (Floating IP を使用): 外部ネットワークのゲートウェイインターフェースはコントローラーノードでのみ利用できるので、トラフィックはインスタンスから開始される場合でも、外部ネットワークにあるインスタンスを宛先とする場合でも、トラフィックはコントローラーノードを経由する必要があります。その結果、大規模な環境では、コントローラーノードにかかるトラフィックの負荷が高くなります。そのため、パフォーマンスやスケーラビリティーに影響を及ぼします。また、外部ネットワークのゲートウェイインターフェースで十分な帯域幅を確保できるように慎重に計画する必要があります。SNAT トラフィックにも同じ要件が適用されます。

L3 エージェントのスケーリングを改善するには、neutron で複数のノードに仮想ルーターを分散する L3 HA の機能を使用することができます。コントローラーノードが失われた場合には、HA ルーターは別のノードのスタンバイにフェイルオーバーして、HA ルーターのフェイルオーバーが完了するまではパケットが失われます。この機能は、Red Hat Enterprise Linux OpenStack Platform 6 から導入されており、デフォルトで有効になっています。

15.2. DVR の概要

分散仮想ルーティング (DVR) では、別のルーティング設計も提供されており、Red Hat OpenStack Platform 10 で完全にサポートされるようになりました。これは、コントローラーノードの障害のあるドメインを分離して、L3 エージェントをデプロイしてネットワークトラフィックを最適化し、全コンピュートノードにルーターをスケジューリングすることが目的です。DVR の使用時には以下が可能です。

  • East-West トラフィックは分散されて、コンピュートノード上で直接ルーティングされます。
  • Floating IP を持つインスタンスの North-South トラフィックは、分散されて、コンピュートノードにルーティングされます。これには、外部ネットワークを全コンピュートノードに接続する必要があります。
  • Floating IP を持たないインスタンスの North-South トラフィックは分散されず、依然として専用のコントローラーノードが必要です。

    • ノードコントローラーノード上の L3 エージェントを新しい dvr_snat モードで設定して、ノードが SNAT トラフィックのみにサービスを提供するようにします。
  • neutron のメタデータエージェントは分散され、全コンピュートノード上にデプロイされます。このメタデータのプロキシーサービスは分散された全ルーター上でホストされます。

15.3. 既知の問題および警告

注記

Red Hat OpenStack Platform 10 では、カーネルバージョンが kernel-3.10.0-514.1.1.el7 以降でない場合には、DVR は使用しないでください。

  • DVR のサポートは、ML2 のコアプラグインおよび Open vSwitch (OVS) のメカニズムドライバーに制限されます。他のバックエンドはサポートされません。
  • DVR が有効化されている場合でも、SNAT トラフィックは分散されません。SNAT は機能しますが、送信/受信トラフィックは中央のコントローラーノードを経由する必要があります。
  • DVR が有効化されている場合でも、IPv6 トラフィックは分散されません。IPv6 ルーティングは機能しますが、送信/受信トラフィックはすべて中央のコントローラーノードを経由する必要があります。IPv6 ルーティングを広範囲にわたって使用している場合には、今回は DVR を使用しないことを推奨します。
  • DVR は、L3 HA を使用する場合にはサポートされません。Red Hat OpenStack Platform 10 director では、DVR を使用する場合は、L3 HA はオフになります。つまり、ルーターはこれまでどおりネットワークノードでスケジューリングされ (また L3 エージェントの間で負荷が共有され) ますが、エージェントが機能しなくなると、このエージェントがホストするすべてのルーターも機能しなくなります。この影響を受けるのは、SNAT トラフィックのみです。このような場合には、1 つのネットワークノードに障害が発生してもルーターが別のノードに再スケジュールされるように、allow_automatic_l3agent_failover 機能を使用することが推奨されます。
  • neutron DHCP エージェントが管理する DHCP サーバーは分散されず、コントローラーノードにデプロイされます。Red Hat OpenStack Platform では、ルーティング設計 (集中型または DVR) にかかわらず、DHCP エージェントは高可用性構成でコントローラーノードにデプロイされます。
  • Floating IP の場合は、各コンピュートノードに 外部 ネットワーク上のインターフェースが 1 つ必要です。また、各コンピュートノードに追加の IP アドレスを 1 つ設定しなければならなくなりました。これは、外部ゲートウェイポートの実装と Floating IP ネットワークの名前空間が原因です。
  • プロジェクトデータの分離において、VLAN、GRE、VXLAN のすべてがサポートされます。GRE または VXLAN を使用する場合は、L2 Population 機能はオンにする必要があります。Red Hat OpenStack Platform 10 director では、インストール時にこれは強制的に有効になります。

15.4. サポートされているルーティングアーキテクチャー

  • 集中 HA ルーティング: Red Hat Enterprise Linux OpenStack Platform 5 から Red Hat OpenStack Platform 10
  • 分散ルーティング: Red Hat OpenStack Platform 10
  • 集中 HA ルーティングを実行する Red Hat OpenStack Platform 9 のデプロイメントから分散ルーティングのみを使用する Red Hat OpenStack Platform 10 のデプロイメントへのアップグレード

15.5. DVR のデプロイ

neutron-ovs-dvr.yaml の環境ファイルは、必須の DVR 固有のパラメーターを設定します。任意のデプロイメント構成の DVR を設定するには、他にも考慮する事項があります。要件は以下のとおりです。

(a) 外部ネットワークトラフィック用の物理ネットワークに接続されたインターフェースは、コンピュートノードとコントローラーノードの両方で設定すること。

(b) コンピュートノードおよびコントローラーノードでブリッジを作成して、外部ネットワークトラフィック用のインターフェースを設定すること。

(c) Neutron がこのブリッジを使用できるように設定すること。

ホストのネットワーク設定 (a および b) は Heat テンプレートが制御しており、これらのテンプレートにより、os-net-config プロセスで使用できるように、Heat が管理するノードに設定が渡されます。これは基本的には、ホストのネットワークのプロビジョニングを自動化しています。プロビジョニングしたネットワーク環境と一致するように、Neutron も設定する必要があります (c)。デフォルトの設定は、実稼動環境で機能するように想定されていません。たとえば、通常のデフォルト設定を使用する概念実証用の環境は、以下のようになります。

1. environments/neutron-ovs-dvr.yamlOS::TripleO::Compute::Net::SoftwareConfig の値が使用中の OS::TripleO::Controller::Net::SoftwareConfig の値と同じであることを確認します。これは通常、environments/net-multiple-nics.yaml など、オーバークラウドのデプロイ時に使用するネットワーク環境ファイルに含まれます。これにより、コンピュートノードの L3 エージェントに適した外部のネットワークブリッジが作成されます。

注記

コンピュートノードのネットワーク設定をカスタマイズした場合には、これらのファイルに適切な設定を追加する必要がある場合があります。

2. OS::TripleO::Compute::Ports::ExternalPort: ../network/ports/external.yaml など、OS::TripleO::Compute::Ports::ExternalPort を適切な値に変更して、外部ネットワークにあるコンピュートノードの neutron ポートを設定します。

3. オーバークラウドのデプロイ時に環境ファイルとして environments/neutron-ovs-dvr.yaml を追加します。以下に例を示します。

$ openstack overcloud deploy --templates -e /usr/share/openstack-tripleo-heat-templates/environments/neutron-ovs-dvr.yaml

4. L3 HA が無効になっていることを確認します。

実稼動環境 (または、ネットワークの分離、専用の NIC など、特別にカスタマイズする必要があるテスト環境) の場合には、環境の例は指針として利用してください。L2 エージェント (例: OVS) が使用するブリッジマッピングタイプのパラメーターや、他のエージェント (例: L3 エージェント) の外部向けのブリッジへの参照には、細心の注意を払う必要があります。

注記

L3 エージェントの外部ブリッジの設定は現在も提供されていますが非推奨となっており、今後廃止される予定です。

15.6. 集中ルーティングから分散ルーティングへの移行

本項では、L3 HA 集中ルーティングを使用する Red Hat OpenStack Platform 9 デプロイメントの分散ルーティングへのアップグレードパスについて説明します。

1. デプロイメントを Red Hat OpenStack Platform 9 から 10 にアップグレードし、正常に機能していることを確認します。

2. 「DVR のデプロイ」に記載の手順に従って、director のスタック更新を実行して DVR を設定します。

3. 既存のルーターでルーティングがまだ機能していることを確認します。

4. L3 HA ルーターを直接 分散型 に移行することはできません。代わりに、各ルーターで L3 HA オプションを無効にしてから分散型のオプションを有効にします。

4a. ルーターの admin 状態を無効にします。

$ neutron router-update --admin-state-up=False

4b. ルーターを レガシー タイプに変換します。

$ neutron router-update --ha=False

4c. ルーターが DVR を使用するように設定します。

$ neutron router-update --distributed=True

4d. ルーターを admin 状態に切り替えます。

$ neutron router-update --admin-state-up=True

4e. ルーティングがまだ機能していて、分散型になったことを確認します。

第16章 Load Balancing-as-a-Service (LBaaS) の設定

Load Balancing-as-a-Service (LBaaS) は、受け取った要求を OpenStack Networking が指定のインスタンス間で均等に分散できるようにします。このガイドでは、Open vSwitch (OVS) プラグインで LBaas を使用するように OpenStack Networking を設定する方法を、ステップごとに説明します。

Red Hat OpenStack Platform 5 で導入された Load Balancing-as-a-Service (LBaaS) は、受け取った要求を OpenStack Networking が指定のインスタンス間で均等に分散できるようにします。これにより、インスタンス間でのワークロードが予測可能な方法で共有されるようになり、システムリソースのより効率的な使用が可能となります。受け取った要求は、以下の負荷分散メソッドの 1 つを使用して分散されます。

  • ラウンドロビン: 複数のインスタンス間で要求を均等にローテーションします。
  • 送信元 IP アドレス: 同じ送信元 IP アドレスからの要求は常に一定のインスタンスへ送信されます。
  • 最小コネクション: アクティブな接続が最も少ないインスタンスに要求が割り当てられます。

表 1: LBaaS の機能

表16.1 LBaaS の機能

機能説明

監視

LBaaS は、ping、TCP、HTTP、HTTPS GET メソッドを使用した可用性モニタリング機能を提供します。監視機能は、要求の処理にプールメンバーが利用可能かどうかを判断するために実装されます。

管理

LBaaS は、さまざまなツールセットを使用して管理されます。REST API は、プログラムベースの管理およびスクリプト作成に使用できます。ユーザーは、CLI (neutron) または OpenStack Dashboard のいずれかを使用して、ロードバランサーの管理タスクを行います。

接続制限

接続制限を使用して、受信トラフィックのシェーピングを行うことができます。この機能は、ワークロードを制御することも可能で、DoS (Denial of Service) 攻撃の緩和にも有効です。

セッションの永続性

LBaaS は、受け取った要求が複数のインスタンスで構成されるプール内の同じインスタンスにルーティングされるようにすることで、セッションの継続性をサポートします。LBaaS は、クッキーや送信元 IP アドレスに基づいたルーティングの決定をサポートします。

注記

LBaaS は現在 IPv4 アドレス設定でのみサポートされます。

注記

LBaaSv1 は Red Hat OpenStack Platform 10 (Newton) で削除され、LBaaSv2 に置き換えられました。

16.1. OpenStack Networking および LBaaS トポロジー

OpenStack Networking (neutron) サービスは、大きく 2 つのカテゴリーに分類することができます。

1. Neutron API サーバー: このサービスは、エンドユーザーとサービスが OpenStack Networking と対話できるように、主に API を提供する OpenStack Networking API サーバーを実行します。このサービスは、基盤のデータベースと対話して、テナントネットワーク、ルーター、ロードバランサーの詳細などを保存する役割も果たします。

2. Neutron エージェント: OpenStack Networking のさまざまな機能を提供するサービスです。

  • neutron-dhcp-agent: テナントプライベートネットワークの DHCP IP アドレスを管理します。
  • neutron-l3-agent: テナントプライベートネットワーク、外部ネットワークなどの間のレイヤー 3 ルーティングを容易化します。
  • neutron-lbaasv2-agent: テナントにより作成された LBaaS ルーターをプロビジョニングします。

以下の図には、HTTPS トラフィックからプールメンバーへのフローを示しています。

lbaas

16.1.1. LBaaS のサポートステータス

  • LBaaS v1 API は Red Hat OpenStack Platform 9 で非推奨となり、バージョン 10 で削除されました。
  • LBaaS v2 API は Red Hat OpenStack Platform 7 で導入されました。これがバージョン 10 で提供されている唯一の LBaaS API です。
  • LBaaS デプロイメントは現在 Red Hat OpenStack Platform director ではサポートされていません。

16.1.2. サービスの配置

OpenStack Networking Service は、同じ物理サーバーまたは別の専用サーバーで実行することができます。

注記

Red Hat OpenStack Platform 10 では、コンポーザブルロールのサポートが追加され、ネットワークサービスをカスタムロール別に分類することができます。ただし、本ガイドでは、内容をわかりやすくするために、デプロイメントにはデフォルトの Controller ロールを使用することを前提とします。

API サーバーを実行するサーバーは通常、コントローラーノード と呼ばれ、OpenStack Networking エージェントを実行するサーバーは ネットワークノード と呼ばれます。理想的な実稼動環境では、パフォーマンスやスケーラビリティーの理由により、コンポーネントを専用のノードに分類しますが、テストまたは PoC デプロイメントではすべてのコンポーネントを 1 つの同じノードで実行します。本章では、どちらのシナリオにも対応しますが、コントローラーノードの設定のセクションは API サーバーで、ネットワークノードのセクションは LBaaS エージェントを実行するサーバーで行う必要があります。

注記

コントローラーおよびネットワークロールの両方が同じ物理ノードに存在する場合には、この物理ノード (サーバー) で手順を実行する必要があります。

16.2. LBaaS の設定

本手順では、OpenStack Networking (neutron) が Open vSwitch (OVS) プラグインで LBaas を使用するように設定します。

注記

neutron-server サービスを実行しているノードで、以下の手順を実施します。

コントローラーノード (API サーバー) で、以下の操作を行います。

  1. LBaaS を有効にします。

    # yum install openstack-neutron-lbaas -y
  2. neutron データベースに LBaaS テーブルを追加します。

    $ neutron-db-manage --subproject neutron-lbaas --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head
  3. /etc/neutron/neutron_lbaas.conf でサービスプロバイダーを変更します。[service providers] セクションで、以下のエントリーを除くすべてのエントリーをコメントアウト (#) します。

    service_provider=LOADBALANCERV2:Haproxy:neutron_lbaas.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default
  4. /etc/neutron/neutron.conf で、LBaaS v2 プラグインが service_plugins に設定されていることを確認します。

    service_plugins=neutron_lbaas.services.loadbalancer.plugin.LoadBalancerPluginv2

    以前に追加した他のプラグインも表示されます。

    注記

    lbaasv1 を設定している場合は、lbaasv2 の上記設定に置き換えます。

  5. /etc/neutron/lbaas_agent.ini で、[DEFAULT] セクションに以下の設定を追加します。

    ovs_use_veth = False
    interface_driver =neutron.agent.linux.interface.OVSInterfaceDriver
  6. /etc/neutron/services_lbaas.conf で、[haproxy] セクションに以下の設定を追加します。

    user_group = haproxy
    1. 他の デバイスドライバー のエントリーをすべてコメントアウトします。

      注記

      l3-agent が failed モードにある場合は、l3_agent のログファイルを確認してください。ログファイルで説明されているように、/etc/neutron/neutron.conf を編集し、[DEFAULT] の特定の値をコメントアウトし、oslo_messaging_rabbit で対応する値をコメント解除しなければならない場合があります。

  7. LBaaS サービスを設定し、それらのステータスを確認します。

    1. lbaasv1 サービスを停止し、lbaasv2 を起動します。

      # systemctl disable neutron-lbaas-agent.service
      # systemctl stop neutron-lbaas-agent.service
      # systemctl mask neutron-lbaas-agent.service
      # systemctl enable neutron-lbaasv2-agent.service
      # systemctl start neutron-lbaasv2-agent.service
    2. lbaasv2 のステータスを確認します。

      # systemctl status neutron-lbaasv2-agent.service
    3. neutron-server を再起動し、ステータスを確認します。

      # systemctl restart neutron-server.service
      # systemctl status neutron-server.service
    4. Loadbalancerv2 エージェントを確認します。

      $ neutron agent-list

第17章 IPv6 を使用したテナントネットワーク

本章では、テナントネットワークに IPv6 サブネットを実装する方法について説明します。director 7.3 では、テナントネットワークに加えて、IPv6 ネイティブのデプロイメントをオーバークラウドノード用に設定することが可能です。

Red Hat OpenStack Platform 6 から、テナントネットワークに IPv6 のサポートが追加されました。IPv6 サブネットは、既存のテナントネットワーク内で作成され、Stateless Address Autoconfiguration (SLAAC)、Stateful DHCPv6Stateless DHCPv6 の複数のアドレス割り当てモードをサポートします。本章では、IPv6 サブネット作成のオプションについて説明し、それらのステップを実行する手順の例を記載します。

17.1. IPv6 サブネットのオプション

IPv6 サブネットは、neutron subnet-create コマンドを使用して作成します。また、オプションとして、アドレスモードとルーター広告モードを指定することができます。これらのオプションの設定可能な組み合わせは以下のとおりです。

RA モードアドレスモード結果

ipv6_ra_mode=not set

ipv6-address-mode=slaac

インスタンスは、SLAAC を使用して外部ルーター (OpenStack Networking で管理されていないルーター) から IPv6 アドレスを受信します。

ipv6_ra_mode=not set

ipv6-address-mode=dhcpv6-stateful

インスタンスは、DHCPv6 stateful を使用して、OpenStack Networking (dnsmasq) から IPv6 アドレスとオプションの情報を受信します。

ipv6_ra_mode=not set

ipv6-address-mode=dhcpv6-stateless

インスタンスは、SLAAC を使用して外部ルーターから IPv6 アドレスを受信し、DHCPv6 stateless を使用して OpenStack Networking (dnsmasq) からオプションの情報を受信します。

ipv6_ra_mode=slaac

ipv6-address-mode=not-set

インスタンスは、SLAAC を使用して OpenStack Networking (radvd) から IPv6 アドレスを受信します。

ipv6_ra_mode=dhcpv6-stateful

ipv6-address-mode=not-set

インスタンスは、DHCPv6 stateful を使用して、外部の DHCPv6 サーバーから IPv6 アドレスとオプションの情報を受信します。

ipv6_ra_mode=dhcpv6-stateless

ipv6-address-mode=not-set

インスタンスは、SLAAC を使用して OpenStack Networking (radvd) から IPv6 アドレスを受信し、DHCPv6 stateless を使用して外部 DHCPv6 サーバーからオプションの情報を受信します。

ipv6_ra_mode=slaac

ipv6-address-mode=slaac

インスタンスは、SLAAC を使用して OpenStack Networking (radvd) から IPv6 アドレスを受信します。

ipv6_ra_mode=dhcpv6-stateful

ipv6-address-mode=dhcpv6-stateful

インスタンスは、DHCPv6 stateful を使用して OpenStack Networking (dnsmasq) から IPv6 アドレスを受信し、DHCPv6 stateful を使用して OpenStack Networking (dnsmasq) からオプションの情報を受信します。

ipv6_ra_mode=dhcpv6-stateless

ipv6-address-mode=dhcpv6-stateless

インスタンスは、SLAAC を使用して OpenStack Networking (radvd) から IPv6 アドレスを受信し、DHCPv6 stateless を使用して OpenStack Networking (dnsmasq) からオプションの情報を受信します。

17.1.1. Stateful DHCPv6 を使用した IPv6 サブネットの作成

以下の手順では、上記で説明した設定を使用してテナントネットワークに IPv6 サブネットを作成します。最初のステップでは、テナントとネットワークに関する必要な情報を収集し、次にその情報を使用してサブネットを作成するコマンドを構築します。

注記

OpenStack Networking は、SLAAC には EUI-64 IPv6 アドレスの割り当てのみをサポートします。これにより、ホストは Base 64 ビットと MAC アドレスに基づいて自らアドレスを割り当てるため、IPv6 ネットワークが簡素化されます。SLAAC の異なるネットマスクと address_assign_type を使用してサブネットの作成を試みると失敗します。

1. IPv6 サブネットを作成するプロジェクトのテナント ID を取得します。これらの値は、OpenStack デプロイメント固有なので、実際に使用する値は異なります。以下の例では、QA テナントが IPv6 サブネットを受信します。

# openstack project list
+----------------------------------+----------+
| ID                               | Name     |
+----------------------------------+----------+
| 25837c567ed5458fbb441d39862e1399 |    QA    |
| f59f631a77264a8eb0defc898cb836af |  admin   |
| 4e2e1951e70643b5af7ed52f3ff36539 |   demo   |
| 8561dff8310e4cd8be4b6fd03dc8acf5 | services |
+----------------------------------+----------+

2. OpenStack Networking (neutron) 内の全ネットワークの一覧を取得し、IPv6 サブネットをホストするネットワークの名前を書き留めておきます。以下の例では、database-servers を使用します。

# neutron net-list
+--------------------------------------+------------------+-------------------------------------------------------------+
| id                                   | name             | subnets                                                     |
+--------------------------------------+------------------+-------------------------------------------------------------+
| 8357062a-0dc2-4146-8a7f-d2575165e363 | private          | c17f74c4-db41-4538-af40-48670069af70 10.0.0.0/24            |
| 31d61f7d-287e-4ada-ac29-ed7017a54542 | public           | 303ced03-6019-4e79-a21c-1942a460b920 172.24.4.224/28        |
| 6aff6826-4278-4a35-b74d-b0ca0cbba340 | database-servers |                                                             |
+--------------------------------------+------------------+-------------------------------------------------------------+

3. 上記のステップで取得した QAtenant-id (25837c567ed5458fbb441d39862e1399) を使用してネットワークを作成するコマンドを構築します。もう 1 つの要件は、IPv6 サブネットをホストする宛先ネットワークの名前です。以下の例では、database-servers ネットワークを使用しています。

# neutron subnet-create --ip-version 6 --ipv6_address_mode=dhcpv6-stateful --tenant-id 25837c567ed5458fbb441d39862e1399 database-servers fdf8:f53b:82e4::53/125

Created a new subnet:
+-------------------+--------------------------------------------------------------+
| Field             | Value                                                        |
+-------------------+--------------------------------------------------------------+
| allocation_pools  | {"start": "fdf8:f53b:82e4::52", "end": "fdf8:f53b:82e4::56"} |
| cidr              | fdf8:f53b:82e4::53/125                                       |
| dns_nameservers   |                                                              |
| enable_dhcp       | True                                                         |
| gateway_ip        | fdf8:f53b:82e4::51                                           |
| host_routes       |                                                              |
| id                | cdfc3398-997b-46eb-9db1-ebbd88f7de05                         |
| ip_version        | 6                                                            |
| ipv6_address_mode | dhcpv6-stateful                                              |
| ipv6_ra_mode      |                                                              |
| name              |                                                              |
| network_id        | 6aff6826-4278-4a35-b74d-b0ca0cbba340                         |
| tenant_id         | 25837c567ed5458fbb441d39862e1399                             |
+-------------------+--------------------------------------------------------------+

4. ネットワークの一覧をチェックして、設定を確認します。database-servers のエントリーには新規作成された IPv6 サブネットが反映されている点に注意してください。

# neutron net-list
+--------------------------------------+------------------+-------------------------------------------------------------+
| id                                   | name             | subnets                                                     |
+--------------------------------------+------------------+-------------------------------------------------------------+
| 6aff6826-4278-4a35-b74d-b0ca0cbba340 | database-servers | cdfc3398-997b-46eb-9db1-ebbd88f7de05 fdf8:f53b:82e4::50/125 |
| 8357062a-0dc2-4146-8a7f-d2575165e363 | private          | c17f74c4-db41-4538-af40-48670069af70 10.0.0.0/24            |
| 31d61f7d-287e-4ada-ac29-ed7017a54542 | public           | 303ced03-6019-4e79-a21c-1942a460b920 172.24.4.224/28        |
+--------------------------------------+------------------+-------------------------------------------------------------+

この設定により、QA テナントで作成されたインスタンスが database-servers サブネットに追加されると、DHCP IPv6 アドレスを受信できるようになります。

# nova list
+--------------------------------------+------------+--------+------------+-------------+-------------------------------------+
| ID                                   | Name       | Status | Task State | Power State | Networks                            |
+--------------------------------------+------------+--------+------------+-------------+-------------------------------------+
| fad04b7a-75b5-4f96-aed9-b40654b56e03 | corp-vm-01 | ACTIVE | -          | Running     | database-servers=fdf8:f53b:82e4::52 |
+--------------------------------------+------------+--------+------------+-------------+-------------------------------------+

第18章 テナントクォータの管理

本章では、OpenStack Networking コンポーネントのテナント/プロジェクトクォータ管理について説明します。

OpenStack Networking (neutron) は、テナント/プロジェクトが作成するリソースの数を制限するクォータの使用をサポートします。たとえば、以下のように、neutron.conf ファイルの quota_router の値を変更することで、テナントが作成可能なルーター数を制限することができます。

quota_router = 10

この設定では、テナントごとにルーターを 10 個まで設定できるように制限します。

さまざまなネットワークコンポーネントに、さらなるクォータ設定が提供されています。

18.1. L3 のクォータオプション

L3 ネットワークで利用可能なクォータオプション: quota_floatingip (テナント 1 つにつき許容される Floating IP の数)、quota_network (テナント 1 つにつき許容されるネットワークの数)、quota_port (テナント 1 つにつき許容されるポートの数)、quota_router (テナント 1 つにつき許容されるルーターの数)、quota_subnet (テナント 1 つにつき許容されるサブネットの数)、quota_vip (テナント 1 つにつき許容される仮想 IP の数)

18.2. ファイアウォールのクォータオプション

ファイアウォール管理を統括するクォータオプション: quota_firewall (テナント 1 つにつき許容されるファイアウォールの数)、quota_firewall_policy (テナント 1 つにつき許容されるファイアウォールのポリシーの数)、quota_firewall_rule (テナント 1 つにつき許容されるファイアウォールルールの数)

18.3. セキュリティーグループのクォータオプション

セキュリティーグループの許容数を管理するクォータオプション: quota_security_group (テナント 1 つにつき許容されるセキュリティーグループの数)、quota_security_group_rule (テナント 1 つにつき許容されるセキュリティーグループルールの数)

18.4. 管理用のクォータオプション

管理者が検討するクォータオプション: default_quota (テナント 1 つにつき許容されるデフォルトリソースの数)、quota_health_monitor (テナント 1 つにつき許容されるヘルスモニターの数。ヘルスモニターはリソースを消費しませんが、OpenStack Networking のバックエンドではメンバーをリソースのコンシューマーとして処理するため、クォータオプションの利用が可能)、quota_member (テナント 1 つにつき許容されるプールメンバーの数。メンバーはリソースを消費しませんが、OpenStack Networking のバックエンドがメンバーをリソースのコンシューマーとして処理するため、クォータオプションの利用が可能)、quota_pool (テナント 1 つにつき許容されるプールの数)

第19章 Firewall-as-a-Service (FWaaS) の設定

Firewall-as-a-Service (FWaaS) プラグインは、OpenStack Networking (neutron) に境界ファイアウォール管理を追加します。FWaaS は iptables を使用して、プロジェクト内の全 Networking ルーターにファイアウォールポリシーを適用し、プロジェクトごとにファイアウォールポリシーと論理ファイアウォールインスタンス 1 つをサポートします。

FWaaS は、OpenStack Networking (neutron) ルーターでトラフィックをフィルタリングすることによって境界で稼働します。インスタンスレベルで稼働するセキュリティーグループとは、この点が異なります。

注記

FWaaS は現在テクノロジープレビューとなっており、テストされていない操作は推奨されません。

以下のサンプル図では、VM2 インスタンスの送信/受信トラフィックのフローを示しています。

fwaas

図 1 FWaaS のアーキテクチャー

19.1. FWaaS の有効化

1. FWaaS パッケージをインストールします。

# yum install openstack-neutron-fwaas python-neutron-fwaas

2. neutron.conf ファイルで FWaaS プラグインを有効にします。

service_plugins = neutron.services.firewall.fwaas_plugin.FirewallPlugin

3. fwaas_driver.ini ファイルで FWaaS を設定します。

[fwaas]
driver = neutron.services.firewall.drivers.linux.iptables_fwaas.IptablesFwaasDriver
enabled = True

[service_providers]
service_provider = LOADBALANCER:Haproxy:neutron_lbaas.services.loadbalancer.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default

4. FWaaS 管理オプションは、OpenStack Dashboard で利用できます。通常コントローラーノードに設置されている local_settings.py ファイルで、このオプションを有効にします。

/usr/share/openstack-dashboard/openstack_dashboard/local/local_settings.py
'enable_firewall' = True

5. neutron-server を再起動して変更を適用します。

# systemctl restart neutron-server

19.2. FWaaS の設定

まず、ファイアウォールルールを作成して、これらのルールを含めるポリシーを作成します。次に、ファイアウォールを作成して、ポリシーを適用します。

1. ファイアウォールルールを作成します。

$ neutron firewall-rule-create --protocol <tcp|udp|icmp|any> --destination-port <port-range> --action <allow|deny>

CLI では、プロトコルの値が必要です。ルールがプロトコルに依存しない場合は、any の値を使用することができます。

2. ファイアウォールポリシーを作成します。

$ neutron firewall-policy-create --firewall-rules "<firewall-rule IDs or names separated by space>" myfirewallpolicy

上記で指定したルールの順番は重要です。ルールなしでファイアウォールポリシーを作成し、update 操作 (複数のルールを追加する場合) または insert-rule 操作 (1 つのルールを追加する場合) のいずれかを使用して、後でルールを追加することができます。

注記: FWaaS は常に、各ポリシーの最も低い優先順位で、「default deny all」ルールを追加します。そのため、デフォルトでは、ルールを持たないファイアウォールポリシーは全トラフィックをブロックします。

19.3. ファイアウォールの作成

$ neutron firewall-create <firewall-policy-uuid>

ファイアウォールは、OpenStack Networking のルーターが作成され、インターフェースが接続されるまで、PENDING_CREATE の状態に留まります。

第20章 allowed-address-pairs の設定

Allowed-address-pairs では、サブネットに関わらず、ポートを通過する mac_address/ip_address (CIDR) ペアを指定することができます。これにより、2 つのインスタンス間をフロートして、データプレーンによるフェイルオーバーを加速化することが可能な、VRRP などのプロトコルを使用することができます。

注記

allowed-address-pairs 拡張は、現在 ML2 および Open vSwitch のプラグインでのみサポートされています。

20.1. allowed-address-pairs の基本操作

ポートを作成して、1 つのアドレスペアを許可します。

# neutron port-create net1 --allowed-address-pairs type=dict list=true mac_address=<mac_address>,ip_address=<ip_cidr>

20.2. allowed-address-pairs の追加

# neutron port-update <port-uuid> --allowed-address-pairs type=dict list=true mac_address=<mac_address>,ip_address=<ip_cidr>
注記

OpenStack Networking では、ポートの mac_addressip_address が一致する allowed-address-pair の設定ができません。その理由は、mac_addressip_address が一致するトラフィックはすでにポートを通過できるので、このような設定をしても効果がないためです。

第21章 レイヤー 3 高可用性の設定

本章では、OpenStack Networking のデプロイメントにおけるレイヤー 3 高可用性 (L3 HA) の役割について説明し、ネットワークの仮想ルーターを保護する実装手順を記載します。

21.1. 高可用性なしの OpenStack Networking

高可用性機能が有効化されていない OpenStack Networking デプロイメントは、物理ノードの障害からの影響を受けやすくなります。

一般的なデプロイメントでは、テナントが仮想ルーターを作成します。この仮想ルーターは、物理 L3 エージェントノードで実行されるようにスケジューリングされます。L3 エージェントノードがなくなると、そのノードに依存していた仮想マシンは外部ネットワークと接続できなくなります。したがって、Floating IP アドレスも利用できなくなります。また、そのルーターがホストするネットワーク間の接続も失われます。

21.2. レイヤー 3 高可用性の概要

この active/passive の高可用性設定は、業界標準の VRRP (RFC 3768 で定義) を使用してテナントルーターと Floating IP アドレスを保護します。ノードの 1 つを active、残りを standby ロールとして機能するように指定することで、仮想ルーターは複数の OpenStack Networking ノードの間で無作為にスケジュールされます。

注記

レイヤー 3 高可用性を正常にデプロイメントするには、冗長化された OpenStack Networking ノードにおいて、Floating IP 範囲や外部ネットワークへのアクセスなど、同様の設定を維持する必要があります。

以下の図では、アクティブなルーター 1 とルーター 2 が別個の物理 L3 エージェントノード上で稼働しています。レイヤー 3 高可用性には、対応するノードの仮想ルーターのバックアップがスケジュールされており、物理ノードに障害が発生した場合にサービスを再開する準備が整っています。L3 エージェントノードに障害が発生すると、レイヤー 3 高可用性は影響を受けた仮想ルーターと Floating IP アドレスを稼働中のノードに再スケジュールします。

vrrp scheduling

フェイルオーバーのイベント時には、Floating IP 経由のインスタンスの TCP セッションは影響を受けず、中断なしで新しい L3 ノードに移行されます。SNAT トラフィックのみがフェイルオーバーイベントからの影響を受けます。

active/active HA モードの場合には、L3 エージェント自体はさらに保護されます。

21.2.1. フェイルオーバーの状況

レイヤー 3 高可用性は、以下のイベントにおいて保護リソースのリスケジュールを自動的に行います。

  • ハードウェアの障害が原因で L3 エージェントノードがシャットダウンするか、停電した場合
  • L3 エージェントノードは、物理ネットワークから分離され、接続が切断された場合
注記

L3 エージェントサービスを手動で停止しても、フェイルオーバーのイベントが開始される訳ではありません。

21.3. テナントに関する留意事項

レイヤー 3 高可用性設定はバックエンドで行われており、テナントには表示されません。通常通り、仮想ルーターを継続して作成/管理することができますが、レイヤー 3 の高可用性の実装を設計する場合に認識しておく必要のある制限事項があります。

  • レイヤー 3 高可用性は、テナントごとに仮想ルーター 255 個までサポートします。
  • 内部の VRRP メッセージは、個別の内部ネットワーク内でトランスポートされ、プロジェクトごとに自動的にこれらのメッセージが作成されます。このプロセスは、ユーザーに透過的に行われます。

21.4. バックグラウンドの変更

ルーターの作成時に、管理者が --ha=True/False を設定できるように、Neutron API が更新されました。これは、neutron.conf の l3_ha の設定 (デフォルト) を上書きします。必要な設定手順については、次の項を参照してください。

21.4.1. neutron-server への変更

  • レイヤー 3 高可用性は、OpenStack Networking で使用されるスケジューラー (無作為または leastrouter のスケジューラー) に関わらず、無作為にアクティブなロールを割り当てます。
  • 仮想ルーターへの仮想 IP の確保を処理するために、データベーススキーマが変更されます。
  • 上記のようにレイヤー 3 高可用性トラフィックを転送するために、トラフィックネットワークが作成されます。

21.4.2. L3 エージェントへの変更

  • 新しい keepalived のマネージャーが追加され、負荷分散と HA 機能が提供されるようになりました。
  • IP アドレスが仮想 IP に変換されます。

21.5. 設定手順

以下の手順では、OpenStack Networking と L3 エージェントノード上でレイヤー 3 高可用性を有効化します。

21.5.1. OpenStack Networking ノードの設定

1. neutron.conf ファイルで L3 HA を有効化し、各仮想ルーターを保護する L3 エージェントノード数を定義して、レイヤー 3 高可用性を設定します。

l3_ha = True
max_l3_agents_per_router = 2
min_l3_agents_per_router = 2

これらの設定については、以下で説明します。

  • l3_ha: True に設定されると、これ以降に作成された仮想ルーターはすべて、(レガシーではなく) HA にデフォルト設定されます。管理者は、以下を使用して各ルーターの値を上書きすることができます。
# neutron router-create --ha=<True | False> routerName
  • max_l3_agents_per_router: このオプションは、デプロイメント内にあるネットワークノードの合計数と最小数の間の値に設定します。たとえば、OpenStack Networking ノードを 4 つデプロイして、最大値を 2 に設定した場合には、L3 エージェント 2 つのみが各 HA 仮想ルーター (1 つは active、もう 1 つは standby) を保護することになります。さらに、新規の L3 エージェントノードがデプロイされるたびに、max_l3_agents_per_router の上限に達するまで、standby バージョンの仮想ルーターが追加でスケジュールされます。これにより、新規 L3 エージェントを追加することで、standby ルーターの数をスケールアウトすることができます。
  • min_l3_agents_per_router: 最小値を設定することで、HA ルールが強制された状態に保つことができます。この設定は仮想ルーターの作成時に検証され、HA を提供するのに十分な数の L3 エージェントノードが利用できるようにします。HA ルーターの作成時には少なくともこの最小値で指定した数のアクティブな L3 エージェントが必要であるため、たとえば、ネットワークノードが 2 つあり、1 つが利用できなくなった場合、その間は新しいルーターを作成できません。

2. neutron-server サービスを再起動して変更を適用します。

# systemctl restart neutron-server.service

21.5.2. 設定の確認

仮想ルーターの名前空間内で ip address のコマンドを実行すると、プレフィックスとして ha- が指定された HA デバイスが結果内に返されます。

# ip netns exec qrouter-b30064f9-414e-4c98-ab42-646197c74020 ip address
<snip>
2794: ha-45249562-ec: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 12:34:56:78:2b:5d brd ff:ff:ff:ff:ff:ff
inet 169.254.0.2/24 brd 169.254.0.255 scope global ha-54b92d86-4f

レイヤー 3 高可用性が有効化され、個別のノードで障害が発生した場合に、仮想ルーターと Floating IP アドレスが保護されます。

第22章 仮想デバイスを識別するためのタグの使用

注記

仮想デバイスのタグ付けは、ブロックデバイスとネットワークポートの両方を対象に、nova API のバージョン 2.32 で追加されました。ただし、以下の点に注意してください。

  • ブロックデバイスの場合: この機能は 2.32 でのみ機能します。
  • ネットワークインターフェースのタグ付けの場合: この機能はバージョン 2.32 から 2.36 でのみ機能します。ネットワークインターフェースのタグ付けは、2.37 では機能しません。

この問題に対処するため更新が、(openstackclient ではなく) python-novaclient で利用可能です。この更新により、novaclient の使用時に問題は発生しません。ただし、ブロックデバイスのタグ付けと 2.37 で導入された自動ネットワークの機能を両方使用する場合を除きます。これらの機能の両方を同時に使用しようとするとエラーが発生します。これらの機能は Red Hat OpenStack Platform 10 では相互に排他的なままです。

  • Red Hat OpenStack Platform 11 はバージョン 2.42 を使用しており、ブロックデバイスのタグ付けとネットワークインターフェースのタグ付けを並行して使用することができるので、これらの問題は、Red Hat OpenStack Platform 11 には影響を及ぼしません。
  • この更新を適用するには、RHSA-2017:1595: セキュリティーアドバイザリー を参照してください。

複数のネットワークインターフェースまたはブロックデバイスを使用してインスタンスを起動している場合には、デバイスのタグ付け機能を使用して各デバイスの目的のロールとインスタンスのオペレーティングシステムを通信させることができます。インスタンスの起動時に、デバイスにタグが割り当てられ、メタデータ API とコンフィグドライブ (有効な場合) を使用してインスタンスのオペレーティングシステムに公開されます。

タグは、以下のパラメーターを使用して設定されます。

  • --block-device tag=device metadata
  • --nic tag=device metadata

たとえば、以下のコマンドは、--block-device および --nic のタグパラメーターを使用してインスタンスを作成します。

$ nova boot test-vm --flavor m1.tiny --image cirros \
--nic net-id=55411ca3-83dd-4036-9158-bf4a6b8fb5ce,tag=nfv1 \
--block-device id=b8c9bef7-aa1d-4bf4-a14d-17674b370e13,bus=virtio,tag=database-server NFVappServer

割り当てらるタグが既存のインスタンスのメタデータに追加され、メタデータ API とコンフィグドライブ上の両方に公開されます。上記の例では、以下の devices セクションがメタデータに表示されます。

  • meta_data.json の例:
    {
  "devices": [
    {
        "type": "nic",
        "bus": "pci",
        "address": "0030:00:02.0",
        "mac": "aa:00:00:00:01",
        "tags": ["nfv1"]
    },
    {
        "type": "disk",
        "bus": "pci",
        "address": "0030:00:07.0",
        "serial": "disk-vol-227",
        "tags": ["database-server"]
    }
  ]
}

デバイスタグのメタデータは、メタデータ API から GET /openstack/latest/meta_data.json として確認することができます。コンフィグドライブが有効で、インスタンスのオペレーティングシステムの /configdrive にマウントされている場合には、このメタデータは /configdrive/openstack/latest/meta_data.json にも保管されます。

第23章 仮想ネットワークの SR-IOV サポート

RHEL OpenStack Platform 6 で初めて導入された Single Root I/O Virtualization (SR-IOV) のサポートが、仮想マシンネットワークに拡張されました。SR-IOV により、OpenStack は従来の仮想ブリッジの要件に縛られること無く、代わりに物理 NIC の機能を直接インスタンスに拡張することができます。さらに IEEE 802.1br のサポートにより、仮想 NIC と物理スイッチを統合し、物理スイッチで仮想 NIC を管理することができます。

注記

ネットワーク機能仮想化 (NFV) の詳細は、『ネットワーク機能仮想化 (NFV) の設定ガイド』を参照してください。

23.1. Red Hat OpenStack Platform デプロイメントでの SR-IOV の設定

SR-IOV により、Virtual Function の概念がサポートされるようになりました。これは、ハードウェア上の PCI デバイスとして提供されるものの、Physical Function が提供する 仮想インターフェース です。

本章では、SR-IOV を設定して 物理 NIC を仮想インスタンスに渡す手順について説明します。以下の手順では、コントローラーノード、OpenStack Networking (neutron) ノード、および複数の Compute (nova) ノードを使用するデプロイメントを前提としています。

注記

仮想マシンインスタンスは、SR-IOV ポートまたは通常の vSwitch ポートを使用することができます。フラットまたは VLAN L2 設定が使用される場合は、SR-IOV ポートと通常の vSwitch ポートは、ネットワークを通じて、または同じコンピュートノード上の異なる Physical Function から相互に通信することができます。両方のインスタンスが同じコンピュートノードにあり、ネットワークアダプター上の Physical Function を共有する場合、両方のインスタンスが同じ種別のポートを使用する場合に限り (共に SR-IOV を使用する、または共に通常の vSwitch を使用する)、通信することができます。

23.2. コンピュートノードでの Virtual Function の作成

サポート対象のハードウェアを持つすべてのコンピュートノードで、以下の手順を実施します。

注記: サポートされるドライバーの詳細は、この アーティクル を参照してください。

以下の手順では、Intel 82576 ネットワークデバイスをパススルーするようにシステムを設定します。また、Virtual Function も作成され、インスタンスがデバイスへの SR-IOV アクセス用に使用することができます。

1. システムの BIOS で Intel VT-d または AMD IOMMU が有効になるようにします。マシンの BIOS 設定メニュー、またはメーカーから提供されているその他のリソースを参照してください。

2. オペレーティングシステムで Intel VT-d または AMD IOMMU が有効になるようにします。

  • Intel VT-d システムの場合は、ここから 手順を参照してください。
  • AMD IOMMU システムの場合は、ここから 手順を参照してください。

3. lspci コマンドを実行して、ネットワークデバイスがシステムによって認識されることを確認します。

[root@compute ~]# lspci | grep 82576

ネットワークデバイスが結果に含まれます。

03:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
03:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)

4. 以降のステップを実施して、コンピュートノード上で Virtual Function をアクティブ化します。

4a. カーネルモジュールを削除します。これにより、カーネルモジュールを次のステップで設定できるようになります。

[root@compute ~]# modprobe -r igb

注記: ステップ 4 では、他の NIC 用の igb ではなく、SRIOV 対応の NIC が使用するモジュール (例: ixgbe または mlx4_core) を使用する必要があります。ethtool コマンドを実行してドライバーを確認します。この例では、em1 が使用する PF です。

[root@compute ~]# ethtool -i em1 | grep ^driver

4b. max_vfs を 7 に設定して (またはサポートされる最大値まで) モジュールを起動します。

[root@compute ~]# modprobe igb max_vfs=7

4c. Virtual Function を永続化します。

[root@compute ~]# echo "options igb max_vfs=7" >>/etc/modprobe.d/igb.conf

注記: Red Hat Enterprise Linux 7 では、上記の変更を永続化するには、ステップ 4 の完了後に 初期 ramdisk イメージを再ビルドします

注記: ステップ 4c および 4d の設定の永続化について: modprobe コマンドにより同じカーネルモジュールを使用するすべての NIC で Virtual Function が有効になり、システムをリブートしても変更が維持されます。特定の NIC に対してのみ VF を有効にすることができますが、問題が発生する場合があります。たとえば、以下のコマンドは enp4s0f1 インターフェースの VF を有効にします。

# echo 7 > /sys/class/net/enp4s0f1/device/sriov_numvfs

ただし、この設定はリブート後に維持されません。回避策としては、以下の設定を rc.local に追加する方法が挙げられますが、以下の注記に示すように、これには制限があります。

# chmod +x /etc/rc.d/rc.local
# echo "echo 7 > /sys/class/net/enp4s0f1/device/sriov_numvfs" >> /etc/rc.local

注記: systemd の追加以降、Red Hat Enterprise Linux は順番にではなく並行してサービスを起動します。つまり、ブートプロセス中に rc.local が実行される時期を予測できなくなりました。その結果、予期しない動作が発生する可能性があるので、この設定は推奨されません。

4d. カーネルコマンドラインに intel_iommu=pt および igb.max_vfs=7 パラメーターを追加して、カーネルの Intel VT-d をアクティブ化します。常にカーネルをこのようにブートする場合は、現在の設定を変更することができます。あるいは、これらのパラメーターでカスタムメニューエントリーを作成することができます。この場合、システムはデフォルトではこれらのパラメーターを使用してブートしますが、必要に応じて、これらのパラメーターを使用せずにカーネルをブートすることもできます。

現在のカーネルコマンドラインパラメーターを変更するには、以下のコマンドを実行します。

[root@compute ~]# grubby --update-kernel=ALL --args="intel_iommu=pt igb.max_vfs=7"

grubby 使用の詳細については、『システム管理者のガイド』の「grubby ツールを使用した GRUB 2 メニューの永続的な変更」を参照してください。

注記: Dell Power Edge R630 ノードを使用する場合は、intel_iommu=pt ではなく intel_iommu=on を使用する必要があります。grubby を使用してこれを有効にすることができます。

# grubby --update-kernel=ALL --args="intel_iommu=on"

カスタムメニューエントリーを作成するには、以下の手順を実施します。

i. grub でデフォルトのエントリーを探します。

[root@compute ~]# grub2-editenv list
saved_entry=Red Hat Enterprise Linux Server (3.10.0-123.9.2.el7.x86_64) 7.0 (Maipo)

ii. a. saved_entry の値で始まる必要な menuentry/boot/grub2/grub.cfg から /etc/grub.d/40_custom にコピーします。エントリーは「menuentry」で始まる行で始まり、「}」が含まれる行で終わります。b. menuentry の後のタイトルを変更します。c. linux16 で始まる行の最後に intel_iommu=pt igb.max_vfs=7 を追加します。

以下に例を示します。

menuentry 'Red Hat Enterprise Linux Server, with Linux 3.10.0-123.el7.x86_64 - SRIOV' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-123.el7.x86_64-advanced-4718717c-73ad-4f5f-800f-f415adfccd01' {
    load_video
    set gfxpayload=keep
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos2'
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos2 --hint-efi=hd0,msdos2 --hint-baremetal=ahci0,msdos2 --hint='hd0,msdos2'  5edd1db4-1ebc-465c-8212-552a9c97456e
    else
      search --no-floppy --fs-uuid --set=root 5edd1db4-1ebc-465c-8212-552a9c97456e
    fi
    linux16 /vmlinuz-3.10.0-123.el7.x86_64 root=UUID=4718717c-73ad-4f5f-800f-f415adfccd01 ro vconsole.font=latarcyrheb-sun16 biosdevname=0 crashkernel=auto  vconsole.keymap=us nofb console=ttyS0,115200 LANG=en_US.UTF-8 intel_iommu=pt igb.max_vfs=7
    initrd16 /initramfs-3.10.0-123.el7.x86_64.img
}

iii. grub.cfg を更新して、変更を設定ファイルを適用します。

[root@compute ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

iv. デフォルトのエントリーを変更します。

[root@compute ~]# grub2-set-default 'Red Hat Enterprise Linux Server, with Linux 3.10.0-123.el7.x86_64 - SRIOV'

v. dist.conf 設定ファイルを作成します。

注記: このステップを実施する前に、allow_unsafe_interrupts の影響を説明するセクション (「allow_unsafe_interrupts 設定の確認」) を確認してください。

[root@compute ~]# echo "options vfio_iommu_type1 allow_unsafe_interrupts=1" > /etc/modprobe.d/dist.conf

5. サーバーをリブートして、新しいカーネルパラメーターを適用します。

[root@compute ~]# systemctl reboot

6. コンピュートノードで SR-IOV カーネルモジュールを確認します。lsmod を実行して、モジュールが読み込まれていることを確認します。

[root@compute ~]#  lsmod |grep igb

絞り込んだ結果に、必要なモジュールが含まれているはずです。

igb    87592  0
dca    6708    1 igb

7. PCI ベンダー ID を確認し、ネットワークアダプターの PCI ベンダー ID (vendor_id:product_id の形式) を書き留めておきます。-nn フラグを指定した lspci コマンドの出力から、この情報を抽出します。以下に例を示します。

[root@compute ~]# lspci  -nn | grep -i 82576
05:00.0 Ethernet controller [0200]: Intel Corporation 82576 Gigabit Network Connection [8086:10c9] (rev 01)
05:00.1 Ethernet controller [0200]: Intel Corporation 82576 Gigabit Network Connection [8086:10c9] (rev 01)
05:10.0 Ethernet controller [0200]: Intel Corporation 82576 Virtual Function [8086:10ca] (rev 01)

注記: このパラメーターは、ネットワークアダプターのハードウェアによって異なる可能性があります。

8. 新しい Virtual Function を確認します。lspci を使用して、新たに作成された VF を一覧表示します。

[root@compute ~]# lspci | grep 82576

結果に、デバイスおよび Virtual Function が含まれるようになりました。

0b:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
0b:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection(rev 01)
0b:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:10.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:10.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:10.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:10.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:10.6 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:10.7 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:11.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:11.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:11.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:11.3 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:11.4 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
0b:11.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)

23.3. ネットワークノードでの SR-IOV の設定

OpenStack Networking (neutron) は、ML2 メカニズムドライバーを使用して SR-IOV をサポートします。SR-IOV ドライバーを設定するには、ネットワークノードで以下の手順を実施します。以下の手順では、メカニズムドライバーを追加し、vlan が有効にしたドライバーに含まれる状態にし、続いて VLAN 範囲を定義します。

1. /etc/neutron/plugins/ml2/ml2_conf.ini ファイルで sriovnicswitch を有効にします。たとえば、この設定により、Open vSwitch と共に SR-IOV メカニズムドライバーが有効になります。

注記

sriovnicswitch は、現在の DHCP エージェント 用インターフェースドライバーをサポートしません。SR-IOV で DHCP によって割り当てられたアドレスを使用するには、ネットワークノードが openvswitch インターフェース (または VLAN をサポートするその他のメカニズムドライバー) を使用するように、ノードの neutron-dhcp-agent を設定します。

[ml2]
tenant_network_types = vlan
type_drivers = vlan
mechanism_drivers = openvswitch, sriovnicswitch
[ml2_type_vlan]
network_vlan_ranges = physnet1:15:20
  • network_vlan_ranges: この例では、ネットワークラベルに physnet1 を使用し、続いて VLAN 範囲として 15-20 を指定しています。

注記: メカニズムドライバー sriovnicswitch は、現在 flat ドライバーおよび vlan ドライバーのみをサポートしています。ただし、sriovnicswitch を有効しても、テナントネットワークが flat および vlan だけに制限される訳ではありません。VXLAN および GRE などは、引き続き SR-IOV ポートを使用しないインスタンスに使用することができます。

2. (オプション) サポートされる vendor_id/product_id の組み合わせは 15b3:1004, 8086:10ca です。実際の NIC ベンダーの製品 ID がこれとは異なる場合、その ID を指定します。さらに、PF パススルーを使用している場合は、この一覧を変更しなければならない場合があります。以下に例を示します。

[ml2_sriov]
supported_pci_vendor_devs = 15b3:1004,8086:10ca

3. neutron-server サービスを再起動して設定を適用します。

[root@network ~]# systemctl restart neutron-server.service

23.4. コントローラーノードでの SR-IOV の設定

1. SR-IOV デバイスを適切にスケジューリングするには、Compute のスケジューラーは PciPassthroughFilter フィルターの設定で FilterScheduler を使用する必要があります。この設定をコントローラーノードの nova.conf ファイルに適用します。以下に例を示します。

scheduler_available_filters=nova.scheduler.filters.all_filters
scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,CoreFilter, PciPassthroughFilter

2. Compute のスケジューラーを再起動して変更を適用します。

[root@compute ~]# systemctl restart openstack-nova-scheduler.service

23.5. コンピュートでの SR-IOV の設定

すべてのコンピュートノードで、利用可能な VF を各物理ネットワークに関連付けます。

1. nova.conf ファイルでエントリーを定義します。以下の例では、enp5s0f1 と一致する VF ネットワークを追加して、physical_networkphysnet1 (前の手順で network_vlan_ranges に設定されたネットワークラベル) としてタグ付けしています。

pci_passthrough_whitelist={"devname": "enp5s0f1", "physical_network":"physnet1"}

以下の例では、ベンダー ID 8086 と一致する PF ネットワークを追加して、physical_networkphysnet1 としてタグを付けしています。~ pci_passthrough_whitelist = \{"vendor_id": "8086","product_id": "10ac", "physical_network":"physnet1"} ~

PCI パススルーのホワイトリストエントリーは、以下の構文を使用します。

["device_id": "<id>",] ["product_id": "<id>",]
["address": "[[[[<domain>]:]<bus>]:][<slot>][.[<function>]]" |
"devname": "Ethernet Interface Name",]
"physical_network":"Network label string"
  • id: id の設定には、* ワイルドカードの値または有効なデバイス/製品 ID を使用することができます。lspci を使用して、有効なデバイス名を一覧表示することができます。
  • address: address の値には、-s スイッチを使用して lspci で表示されるものと同じ構文を使用します。
  • devname: devname は、有効な PCI デバイス名です。ifconfig -a を使用して、利用可能な名前を一覧表示することができます。このエントリーは、仮想 NIC に関連付けられる PF または VF いずれかの値に対応している必要があります。address または devname で定義するデバイスが SR-IOV PF に対応している場合、PF の配下にあるすべての VF はエントリーと一致します。エントリーにタグを関連付けないことも、1 つまたは複数のタグを関連付けることもできます。
  • physical_network: SR-IOV ネットワークを使用する場合には、「physical_network」を使用して、デバイスの接続先となる物理ネットワークを定義します。

ホストごとに、複数のホワイトリストエントリーを設定することができます。フィールド device_idproduct_id、および address または devname は、libvirt のクエリー結果として返される PCI デバイスに対して照合されます。

2. nova-compute サービスを再起動して変更を適用します。

[root@compute ~]# systemctl restart openstack-nova-compute

23.6. OpenStack Networking の SR-IOV エージェントの有効化

1. 以下の手順を実行するために、sriov-nic-agent パッケージをインストールします。

[root@compute ~]# yum install openstack-neutron-sriov-nic-agent

2. /etc/neutron/plugins/ml2/openvswitch_agent.ini ファイルで NoopFirewallDriver を有効にします。

[root@compute ~]# openstack-config --set /etc/neutron/plugins/ml2/openvswitch_agent.ini securitygroup firewall_driver neutron.agent.firewall.NoopFirewallDriver

3. /etc/neutron/plugins/ml2/sriov_agent.ini ファイルにマッピングを追加します。以下の例では、physnet1 が物理ネットワークで、enp4s0f1 が Physical Function になります。exclude_devices を空白のままにして、エージェントが関連付けられたすべての VF を管理できるようにします。

[sriov_nic]
physical_device_mappings = physnet1:enp4s0f1
exclude_devices =

4. (オプション) VF を除外します。エージェントの設定から特定の VF を除外するには、その VF を sriov_nic セクションの一覧に追加します。以下に例を示します。

exclude_devices = eth1:0000:07:00.2; 0000:07:00.3, eth2:0000:05:00.1; 0000:05:00.2

5. OpenStack Networking の SR-IOV エージェントを起動します。

[root@compute ~]# systemctl enable neutron-sriov-nic-agent.service
[root@compute ~]# systemctl start neutron-sriov-nic-agent.service

23.7. SR-IOV ポートを使用するためのインスタンスの設定

SR-IOV 機能の概要

SR-IOV により、Physical Function (PF) および Virtual Function (VF) を使用して、インスタンスが直接 NIC にアクセスすることができます。PF は VF を使用して、複数のインスタンスが同じ PCI カードに直接アクセスできるようにします。その結果、PCI カードは、複数のインスタンスが使用できるように論理的に VF に分割されていると考えることができます。このことから、SR-IOV は、PCI デバイスへの独占的アクセスを 1 つのインスタンスだけに付与する PCI パススルーとは異なります。

注記

PF と VF の両方を使用する場合、SR-IOV の NIC は複数のインスタンスに同時にバインドすることはできません。メモリーアドレスの保護により、他のインスタンスが VF を使用している場合、インスタンスは PF を制御することができません。つまり、1 つのインスタンスが PF に直接バインドしてカードを使用している (PCI パススルーとほぼ同等) 場合を除き、多くの場合 neutron はインスタンスに VF を渡してホストに PF を制御させます。

Virtual Functions の制限次項

  • 特定のユースケースでは、Physical Function のパススルーがより適している場合があります。以下に例を示します。

    • Residential vCPE
    • BNG/BRAS (IPoE または PPPoE)
    • VPLS または VLL 向けの PE
    • VPN L3 (ポートにより複数の VLAN を使用する場合)
    • レベル 2 のカプセル化により、特定のトラフィック処理が必要なその他のユースケース (例: MAN ネットワークの QinQ カプセル化)
  • VF を使用する場合、サーバーの NIC ポートがトラフィックをブロックしてしまう可能性があります。これは想定された動作で、同じ NIC からの VF を共有するインスタンスからのスプーフィング攻撃を軽減するのに役立ちます。したがって、NIC ベンダーは、プロミスキャスモードのユニキャストを許可し、アンチスプーフィングおよび受信 VLAN フィルタリングを無効にすることを推奨する場合があります。
  • NIC は、Physical Function または Virtual Function のいずれかを使用するように設定する必要があり、両方を同時に使用するように設定することはできません。

設定例

以下の例では、SR-IOV ポートが web ネットワークに追加されます。

1. 利用可能なネットワークの一覧を取得します。

[root@network ~]# neutron net-list
+--------------------------------------+---------+------------------------------------------------------+
| id                                   | name    | subnets                                              |
+--------------------------------------+---------+------------------------------------------------------+
| 3c97eb09-957d-4ed7-b80e-6f052082b0f9 | corp    | 78328449-796b-49cc-96a8-1daba7a910be 172.24.4.224/28 |
| 721d555e-c2e8-4988-a66f-f7cbe493afdb | web     | 140e936e-0081-4412-a5ef-d05bacf3d1d7 10.0.0.0/24     |
+--------------------------------------+---------+------------------------------------------------------+

この出力結果には、OpenStack Networking で作成したネットワークの一覧が表示され、サブネットの詳細が含まれます。

2. web ネットワーク内にポートを作成します。

[root@network ~]# neutron port-create web --name sr-iov --binding:vnic-type direct
Created a new port:
+-----------------------+---------------------------------------------------------------------------------+
| Field                 | Value                                                                           |
+-----------------------+---------------------------------------------------------------------------------+
| admin_state_up        | True                                                                            |
| allowed_address_pairs |                                                                                 |
| binding:host_id       |                                                                                 |
| binding:profile       | {}                                                                              |
| binding:vif_details   | {}                                                                              |
| binding:vif_type      | unbound                                                                         |
| binding:vnic_type     | normal                                                                          |
| device_id             |                                                                                 |
| device_owner          |                                                                                 |
| fixed_ips             | {"subnet_id": "140e936e-0081-4412-a5ef-d05bacf3d1d7", "ip_address": "10.0.0.2"} |
| id                    | a2122b4d-c9a9-4a40-9b67-ca514ea10a1b                                            |
| mac_address           | fa:16:3e:b1:53:b3                                                               |
| name                  | sr-iov                                                                          |
| network_id            | 721d555e-c2e8-4988-a66f-f7cbe493afdb                                            |
| security_groups       | 3f06b19d-ec28-427b-8ec7-db2699c63e3d                                            |
| status                | DOWN                                                                            |
| tenant_id             | 7981849293f24ed48ed19f3f30e69690                                                |
+-----------------------+---------------------------------------------------------------------------------+

3. 新しいポートを使用するインスタンスを作成します。

webserver01 という名前の新規インスタンスを作成し、前のステップの出力の id フィールドに書かれたポート ID を使用して、新しいポートを使用するように設定します。

注記: glance image-list コマンドを使用して、利用可能なイメージとその UUID の一覧を取得することができます。

[root@compute ~]# nova boot --flavor m1.tiny --image 59a66200-45d2-4b21-982b-d06bc26ff2d0  --nic port-id=a2122b4d-c9a9-4a40-9b67-ca514ea10a1b  webserver01

新規インスタンス webserver01 が作成され、SR-IOV ポートを使用するように設定されました。

23.8. allow_unsafe_interrupts 設定の確認

デバイスが割り当てられたゲストをホストから完全に分離するには、プラットフォームが割り込みの再マッピングをサポートしている必要があります。このようなサポートがないと、ホストは悪意のあるゲストからの割り込み注入攻撃に対して脆弱となる可能性があります。ゲストが信頼できる環境では、管理者は allow_unsafe_interrupts オプションを使用して引き続き PCI デバイスの割り当てを許可することを選択できます。ホストで allow_unsafe_interrupts を有効にする必要があるかどうかを確認します。ホストの IOMMU が割り込みの再マッピングをサポートする場合、この機能を有効にする必要はありません。

1. dmesg を使用して、ホストの IOMMU が割り込みの再マッピングをサポートしているかどうかを確認します。

[root@compute ~]# dmesg |grep ecap

ecap (0xf020ff → …​1111) のビット 3 が 1 の場合、IOMMU が割り込みの再マッピングをサポートすることを意味します。

2. IRQ 再マッピングが有効かどうかを確認します。

[root@compute ~]# dmesg |grep "Enabled IRQ"
[    0.033413] Enabled IRQ remapping in x2apic mode

注記: grub.confintremap=off を追加することで、「IRQ 再マッピング」を手動で無効にすることができます。

3. ホストの IOMMU が割り込みの再マッピングをサポートしていない場合は、kvm モジュールで allow_unsafe_assigned_interrupts=1 を有効にする必要があります。

23.9. インスタンスへの Physical Function の追加

Physical Functions (PF) をインスタンスに公開するように Compute を設定することができます。インスタンスに物理ポートに対する完全な制御を付与することで、このユースケースは NFV アプリケーションに役立ちます。これにより、インスタンスは Virtual Functions (VF) では利用できない一部機能を使用することができます。これらのインスタンスは、特定のカードが VF に適用する制限の一部を回避することや、ポートの全帯域幅を独占して使用することができます。

インスタンスに割り当てられている子 VF がない場合に、Compute では未使用の PF をインスタンスに割り当てることができます。PF が割り当てられると、その VF はいずれも使用できなくなります。インスタンスがシャットダウンされ、PF が未使用の状態になると、VF は再び使用できるようになります。逆に、子 VF のいずれかがすでに割り当てられている場合、Compute は PF が割り当てられないようにします。

23.9.1. Physical Function 向けの Compute 設定

nova.conf ホワイトリストに device_type:type-PF を追加して、Physical Function を公開します。以下に例を示します。

pci_passthrough_whitelist={"product_id":"10ed", "vendor_id":"8086", "physical_network":"physnet1",'device_type': 'type-PF}

23.9.2. Physical Function の設定

SR-IOV PF は neutron ポートであるかのように管理することができます。Neutron は 新たな vnic_typedirect-physical をサポートしています。nova はこれによって作成される仮想 NIC を使用して、新しい VIF の種別でホスト上の PF を選択し、さらにゲストへのパススルーを実施します。その結果、nova は選択したホスト上の PF の MAC アドレスで neutron ポートを更新します。

たとえば、Network1 というネットワーク上に PF を作成するには、以下のコマンドを実行します。

$ neutron port-create Network1 --name pf-port --binding:vnic_type direct-physical

続いて、PF にアクセスできるように作成されたポートをインスタンスにアタッチすることができます。

23.10. その他の考慮事項

  • 仮想 NIC の種別を選択する際には、現在 vnic_type=macvtap がサポートされていないことに注意してください。
  • SR-IOV がアタッチされたインスタンスの仮想マシン移行はサポートされていません。
  • 現在、SR-IOV が有効なポートでは、セキュリティーグループを使用することはできません。

法律上の通知

Copyright © 2020 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.