第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. フラットプロバイダーネットワークの使用
以下の手順では、外部ネットワークの直接インスタンスを接続可能なフラットプロバイダーネットワークを作成します。複数の物理ネットワーク (physnet1
、physnet2
) およびそれぞれ別の物理インターフェース (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.ini
で external_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
ファイアウォールドライバーを使用する場合)。
1. インスタンスの eth0
インターフェースからのパケットは最初に linux ブリッジ qbr-xx
に到達します。
2. ブリッジ qbr-xx
は、veth ペア qvb-xx <-> qvo-xxx
を使用して br-int
に接続されます。これは、セキュリティーグループによって定義されている受信/送信のファイアウォールルールの適用にブリッジが使用されるためです。
3. インターフェース qvbxx
は qbr-xx
linux ブリッジに、qvoxx
は br-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-ex
の phy-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. 受信トラフィックのフロー
以下の項では、外部ネットワークからインスタンスのインターフェースに到達するまでの受信トラフィックのフローを説明します。
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-int
と br-ex
が接続されていることを確認します。
この接続は、neutron-openvswitch-agent
サービスを再起動する際に作成されます。ただし、作成されるのは /etc/neutron/plugins/ml2/openvswitch_agent.ini
で bridge_mapping
が正しく設定されている場合に限ります。サービスを再起動してもこの接続が作成されない場合には bridge_mapping
の設定を再確認してください。
bridge_mappings
の設定に関する詳しい情報は、「13章ブリッジマッピングの設定」を参照してください。
4. ネットワークフローを確認します。
ovs-ofctl dump-flows br-ex
と ovs-ofctl dump-flows br-int
を実行して、フローにより送信パケットの内部 VLAN ID が削除されたかどうかを確認します。まず、このフローは、特定のコンピュートノード上のこのネットワークにインスタンスを作成すると追加されます。
-
インスタンスの起動後にこのフローが作成されなかった場合には、ネットワークが
flat
として作成されていて、external
であることと、physical_network
の名前が正しいことを確認します。また、bridge_mapping
の設定を確認してください。 -
最後に
ifcfg-br-ex
とifcfg-ethx
の設定を確認します。ethX
がbr-ex
内のポートとして追加されており、ip a
の出力でどちらのインターフェースにもUP
フラグが表示されることを確認します。
たとえば、以下の出力では eth1
は br-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-172
の physnet1
と呼ばれる物理ネットワークを使用します。ネットワークノードとコンピュートノードは、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) をそのブリッジに関連付けます。
- 以下の例では、eth1 が br-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.ini
で external_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 を設定して物理インターフェースを追加し、コンピュートノードにインスタンスを作成すると、作成されたインターフェースとブリッジは以下の図のようになります。
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.ini
で bridge_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-ex と ifcfg-ethx の設定を再確認します。ethX が br-ex の中にポートとして追加されており、いずれも ip a
コマンドの出力において UP
フラグが表示されることを確認します。
たとえば、以下の出力例では、eth1 は br-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 アドレスはインスタンス内に直接バインドされ、インスタンスが外部ネットワークと直接通信できるようになります。