それでは続いて、皆大好き・恐怖のOpen vSwitchの設定になります。
初見は、カザーブの東にお散歩に行ったら突然エンカウントしたグリズリー級のわけわかめなシステムですが、慣れたら大丈夫っていうか、自分にとっての正解を見つけてしまえばあとは元気にスルーするだけなので頑張りどころだったりします。
事故事例
Open vSwitchの設定は、NICの数やQuantumの設定(ブリッジマッピングなど)によって正解は変わってくるのですが、ミスった時はだいたいこのような現象になります。Quantumの設定ミスの場合もありますが、よくわかってないうちはたいていOVSが原因なので、キレずに落ち着いてやり直すのが吉かと思われます。
構成
最初は、この辺のドキュメント見て、構築してみて、また考えなおして、の繰り返しになると思います。NICの数や目的とする仮想ネットワーク構成によって正解は異なるので、色々見てやってみるしかありません。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作成
1 2 3 4 |
apt-get install linux-headers-amd64 openvswitch-datapath-source module-assistant auto-install openvswitch-datapath ls -l /lib/modules/3.2.0-4-amd64/kernel/*.ko |
openvswitch
LinuxBridgeを使うか、BRCOMPATを使うかという選択肢がありますが、今回はBRCOMPATにしています。(どっちでも動きますが、いじるカーネルパラメータが変わったりします。よくわかっていません・・・)
1 2 3 4 5 6 |
apt-get install openvswitch-switch openvswitch-brcompat sed -i -e 's/# BRCOMPAT=no/BRCOMPAT=yes/g' /etc/default/openvswitch-switch # BRCOMPATを反映 /etc/init.d/openvswitch-switch restart |
ネットワーク
NetoworkNode
eth0 をいったん落としておきます。
1 |
ifdown eth0 |
/etc/network/interfaces
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# Open vSwitch bridge for public and floating ip auto br-ex iface br-ex inet static address 10.1.26.11 netmask 255.255.255.0 network 10.1.26.0 broadcast 10.1.26.255 gateway 10.1.26.1 # The primary network interface for management and cloud public auto eth0 iface eth0 inet manual up ifconfig $IFACE 0.0.0.0 up up ip link set $IFACE promisc on down ip link set $IFACE promisc off down ifconfig $IFACE down # The secondary network interface for vm private auto eth1 iface eth1 inet manual up ifconfig $IFACE 0.0.0.0 up up ip link set $IFACE promisc on down ip link set $IFACE promisc off down ifconfig $IFACE down |
ComputeNode
/etc/network/interfaces
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# The primary network interface for management auto eth0 iface eth0 inet static address 10.1.26.12 netmask 255.255.255.0 network 10.1.26.0 broadcast 10.1.26.255 gateway 10.1.26.1 # The secondary network interface for vm private auto eth1 iface eth1 inet manual up ifconfig $IFACE 0.0.0.0 up up ip link set $IFACE promisc on down ip link set $IFACE promisc off down ifconfig $IFACE down |
ブリッジ
NetoworkNode
外部接続用です。
1 2 3 4 5 6 7 8 |
ovs-vsctl add-br br-ex ovs-vsctl add-port br-ex eth0 # 確認 ovs-vsctl show # ネットワークを再起動してブリッジのアドレスを有効にします。十数秒ほど時間がかかります /etc/init.d/networking restart |
NetworkNode / ComputeNode
全ノードで内部接続用を設定します。add-port しない場合は自動的に有効な eth0 を利用してくれます。
1 2 3 4 5 6 7 8 9 10 11 |
ifup eth1 # bridge for inside ovs-vsctl add-br br-int # bridge for vm network ovs-vsctl add-br br-vm ovs-vsctl add-port br-vm eth1 # 確認 ovs-vsctl show |
この時点で、プライベート接続やグローバルへの接続に支障がないか確認し、変だったら見直します。
OS起動時のネットワーク修復スクリプト
この構成だと、openvswitch や networking の起動順序的に、正常にネットワークが起動しません(Bridgeがないのにnetworkingが先に起動しようとするため)。いまさらですが、こういう面でも interfaces にブリッジ名を記述しない方法がよさそうです。起動スクリプトの優先順位やヘッダを書き換えるのは運用面であまりよい対策じゃなかった、というか上手く修正できそうになかったので、原始的に前記事の 外道式rc.local でネットワークを修復起動させています。
/etc/rc.local.d/00-network.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!/bin/bash # # Network # set +e ping -c 1 google.co.jp > /dev/null 2>&1 if [ $? -ne 0 ]; then /etc/init.d/networking restart for i in `seq 60` do ping -c 1 google.co.jp > /dev/null 2>&1 [ $? -eq 0 ] && echo " success!!" && break echo -n " ." sleep 1 done fi set -e |
/etc/rc.local.d/21-nscd.sh
1 2 3 4 5 6 7 8 |
#!/bin/bash # # discard nscd cache # nscd -i passwd nscd -i group |
1 2 |
chmod 744 /etc/rc.local.d/00-network.sh chmod 744 /etc/rc.local.d/21-nscd.sh |
スクリプトを起き終わったら、reboot してネットワークが無事に立ち上がることを確認しておきます。
頑張って書いてはいるものの、正直、上手く伝わるか自信はないです!
ここだけは、Don’t think, FEEL!! です。
次回はControllerNodeの作成に入っていきます。