OpenStack Grizzly構築 on Wheezy (2) Open vSwitch

それでは続いて、皆大好き・恐怖のOpen vSwitchの設定になります。

初見は、カザーブの東にお散歩に行ったら突然エンカウントしたグリズリー級のわけわかめなシステムですが、慣れたら大丈夫っていうか、自分にとっての正解を見つけてしまえばあとは元気にスルーするだけなので頑張りどころだったりします。



事故事例

Open vSwitchの設定は、NICの数やQuantumの設定(ブリッジマッピングなど)によって正解は変わってくるのですが、ミスった時はだいたいこのような現象になります。

  • ovs-vsctlコマンドで設定したらプライベートネットワークすら繋がらなくなった
  • VMに接続できない
  • ホスト間をまたいだVM同士の接続ができない
  • VMがDHCPアドレスを取得できない(参考:OpenStackのDHCP問題まとめ
  • GREパケットでフラッディングが起きる(参考:OpenStack Open vSwitch GREトンネルでDoS攻撃

  • Quantumの設定ミスの場合もありますが、よくわかってないうちはたいていOVSが原因なので、キレずに落ち着いてやり直すのが吉かと思われます。


    構成

    最初は、この辺のドキュメント見て、構築してみて、また考えなおして、の繰り返しになると思います。NICの数や目的とする仮想ネットワーク構成によって正解は異なるので、色々見てやってみるしかありません。
  • Network Connectivity for Physical Hosts – OpenStack Networking Administration Guide – master
  • OpenStack Networking Deployment Use Cases – OpenStack Networking Administration Guide – master

  • NIC(ネットワークインターフェース)

    ControllerNode / ComputeNode 共に、eth0, eth1 の2本で構成します。

    eth0 はいわゆる管理用ネットワークが基本の意味ですが、NetworkNode(※今回はControllerNodeと同居)においてのみ、VMの外部接続用ネットワークとしても利用されます。

    eth1 はVM専用ネットワークとして利用します。

    これは、全て1つのインターフェースでも実現できるし、管理/外部/内部の3つに分けることも可能です。

    ブリッジの意味

    br-ex
    br-ex は パブリックネットワーク接続用&FloatingIP用のブリッジで、NetworkNode のみに作成します。間違ってもComputeNodeに作ってはいけません。ブリッジ名は変更しない方が無難です。今回は eth0 が対象となります。

    br-int
    br-int は 全てのノードで必須の「Integration Bridge」です。その他のブリッジが全部ここに繋がります。ブリッジ名は固定です。今回はポートを明示的に指定していないので、自動的に eth0 が対象となります。

    br-vm
    br-vm は外道父独自の名前です。VMのプラベートネットワーク接続用のブリッジで、全ノードに必要です。br-int がこの役目を持っても問題ないですが、明確に役割を分けるために作っています。今回は eth1 が対象です。

    実際の割り当て

    NetworkNode
    eth0, eth1 両方とも空インターフェースで立ちあげ、br-ex と eth0 を紐付けた上で、br-ex に静的アドレスを持たせます。

    br-ex は静的アドレスを持つことは必須ではないので、NetworkNodeを分けて作る場合は /etc/network/interfaces には一切ブリッジ名を書かない方がおそらく綺麗で運用しやすいです

    ComputeNode
    eth0 に普通に静的アドレスを割り当て、eth1 を空インターフェースで立ちあげておきます。


    Open vSwitchの構築

    br-ex を作った時点でeth0のネットワークが切れるので最初はコンソールで作業します。br-ex に静的アドレスを割り当てない形だと、切れる状況にならないはずなので、そういう意味で運用しやすいはず。

    module作成

    openvswitch

    LinuxBridgeを使うか、BRCOMPATを使うかという選択肢がありますが、今回はBRCOMPATにしています。
    (どっちでも動きますが、いじるカーネルパラメータが変わったりします。よくわかっていません・・・)

    ネットワーク

    NetoworkNode
    eth0 をいったん落としておきます。

    /etc/network/interfaces

    ComputeNode
    /etc/network/interfaces

    ブリッジ

    NetoworkNode
    外部接続用です。

    NetworkNode / ComputeNode
    全ノードで内部接続用を設定します。
    add-port しない場合は自動的に有効な eth0 を利用してくれます。

    この時点で、プライベート接続やグローバルへの接続に支障がないか確認し、変だったら見直します。


    OS起動時のネットワーク修復スクリプト

    この構成だと、openvswitch や networking の起動順序的に、正常にネットワークが起動しません(Bridgeがないのにnetworkingが先に起動しようとするため)。いまさらですが、こういう面でも interfaces にブリッジ名を記述しない方法がよさそうです。

    起動スクリプトの優先順位やヘッダを書き換えるのは運用面であまりよい対策じゃなかった、というか上手く修正できそうになかったので、原始的に前記事の 外道式rc.local でネットワークを修復起動させています。

    /etc/rc.local.d/00-network.sh

    /etc/rc.local.d/21-nscd.sh

    スクリプトを起き終わったら、reboot してネットワークが無事に立ち上がることを確認しておきます。


    頑張って書いてはいるものの、正直、上手く伝わるか自信はないです!
    ここだけは、Don’t think, FEEL!! です。

    次回はControllerNodeの作成に入っていきます。