OpenStack Folsom構築 on Wheezy (6) ネットワーク作成

準備運動が終わったので、より楽しく厳しいところ、ネットワークの作成へ参ります。

ここが最も個々で異なる部分だと思いますので、1例として眺める程度になるかもです。



テナントIDの設定

Keystoneで作成する tenant(=project) IDを変数に格納しておきます。
最初は自動作成済みの admin でいきますが、2つ目以降は keystone tenant-create してからになります。


ルータを作成

ルータを作成します。これがNetwork Namespaceの単位になります。
この時、ip netns を確認して qrouter-${id} のnamespaceが作られていなかったら、関連ネットワークを一度全部削除してから再作成する必要があります。が、原因はまだわかっていません。


内部ネットワークを作成

いわゆるVMのfixed ip用ネットワークを作成します。
テナント・OVSインターフェース・VLAN IDを関連付けます。

サブネットを作成します。

  • テスト環境のPrivateNetworkが 192.168.0.0/16 だったので 172.16.0.0/12 から拝借
  • –allocation-pool を指定しなければ、Network,G/W,Broadcastを除く全範囲になります
  • –dns_nameservers はなぜか cidr の後ろに書かないとダメとか意味不明な仕様もあり
  • G/Wは –gateway で指定しなければネットワークアドレスの次になります
  • ルータと内部ネットワークを紐付けます。
    これにより、Namespaceにrouteが追加されます。

    pingで疎通を、ip netnsを通して確認します。ここではGatewayとなる 172.31.0.1 と、ルータ割り当てとなる allocation_poolsの最初のアドレス 172.17.31.10 を確認します。疎通できない場合は、1つ1つ見なおしてやり直します。


    外部ネットワークを作成

    いわゆる floating ip 用ネットワークを作成します。

    注意点として、–router:external=True の宣言が必要ですが、1つのOVSインターフェース(ここではphysnet1)に対して、–router:external=True の net-create を2つ以上作成しようとすると、エラーが出ます(Exception: must configure ‘gateway_external_network_id’ if Quantum has more than one external network.)。

    これをメッセージ通り gateway_external_network_id を設定しても解決しなかったので、
    1ルーター1プロジェクトをやめて、1ルーター複数プロジェクトと変更して進めました。複数ルーターにしたい場合、gateway_external_network_id で解決するか、OVSのmappingで解決するか、他の方法を考えるのかはそれぞれだと思います。

    外部ネットワークのサブネットを作成します。DHCPは不要なのでFalseにしています。

    ゲートウェイを設定し、ルータと外部ネットワークの紐付けを行います。

  • 対象Namespaceのip addrにsubnet G/Wの次のアドレスが追加されます
  • また、Namespaceのrouteに、通常routeとDefaultG/Wが追加されます
  • router-list の external_gateway_info にnetwork_idが関連付けられます

  • ホストOSネットワークとVMネットワークを通す

    いちいち ip netns exec コマンドを使うのは面倒ですし、VMにfloating ipを割り当てないとControllerNode以外から繋げないというのも不便です。なので、ControllerNodeのIPアドレスとルーティングを工夫することで、ControllerNode上で普通にpingを打てたり、引いては外部サーバからVMのfixed ipに直接繋げるようにします。(不要なら飛ばしてください)

    対象NamespaceのrouteにDefaultG/Wが追加されているので、そのG/WアドレスをホストOSに割り当てることでVMネットワークから外への経路を作ります。

    この時、floating ip の subnet cidr内に通常ネットワークのG/Wがある場合は、–gatewayに指定して subnet-create することでもVMネットワークから出て行くことは可能です。が通常はcidr外に管理ネットワークG/Wがあるはずなので、メモ程度に。

    そして、外からVMネットワークへの経路を、router G/W(quantum port-list -c fixed_ips -c device_owner | grep network:router_gateway)のアドレスにすることで、往復の経路が出来上がります。通信が確認できたら、/etc/network/if-pre-up.d/openstack にでも書いておいて、起動時に反映されるようにします。

    これで、ControllerNode上で ip netns を使わずにpingが通るようになりました。
    通らない場合はやはり1つずつ丁寧にやり直してください。

    ContollerNode => VM が通るということは、外部サーバがVMネットワークへ接続する際に、ControllerNodeをG/WにすればFORWARDINGで通るということになります。なので、VMへ直接つないだり、途中のG/Wに転送してもらうために、外部サーバでrouteを設定します。


    接続経路メモ

    fixed ip

    HostOSをまたぐ場合も含む、FixedIP同士の通信は、最初の一回はL2確認のため ControllerNode に通信が飛びますが、その後は ControllerNode を通すことなく直接通信してくれます。

    floating ip

    それに対し floating ip はVMに割り当てているように見えて、実際はControllerNodeの各Namespace内に割り当てられているので、floating ipへの接続は必ずControllerNodeを介する接続となります。分散せずControllerNodeに集中するため、高トラフィックに対して不安が残ります。



    ネットワークの設定には色々あってまだ追いきれていませんが(vlanがー flatがー externalがー 色々複数がー とか)、これで基礎ネットワークはできたと思っています。が、他にも冗長性・分散性・セキュリティなど検証したいところが山ほどあり、当分退屈はしなさそうです。