OpenStack (Grizzly, Folsom) に仮想マシンにて特定の通信が出来ない不具合がある。理由は GRE トンネル時に Ethernet の最大フレーム長を超えてしまうため。(@ishikawa84g さんに教えて頂きました。)
解決策として
- VM の MTU を小さくする
- トンネルポート, 物理ポート, 物理スイッチの MTU を小さくする
- フラグメントを許容する
があるが(これも @ishikawa84g さんに教えて頂きました。)、1項目は仮想ネットワークの複雑化と共に更に MTU 調整が必要になる恐れがあるため NG。2項目は Switch によっては難しくなるかも。3項目は OVS の下記の操作にて対処可能。
% sudo ovs-vsctl set interface gre-2 type=gre options:remote_ip=10.200.10.59 options:pmtud=false
この操作は全てのネットワークノード、コンピュートノードにて実施する必要あり。
が、quantum-plugin-openvswitch-agent プロセスの再起動と共に上記の pmtud=false オプションがかき消されてしまうため、Quantum の下記の 'ソースコードの diff' を反映させるとオプションを付加出来る。これによりフラグメントが発生し、本問題を解決出来る。
根本的な解決方法は OVS, Linux Kernel の対処を待つこととなりそう。ちなみに OpenStack に対するパッチコードのレビューも進んでいるが 適用される可能性が小さくなってきた。
https://review.openstack.org/#/c/27937/
下記が Quantum ソースコードの diff 結果
% diff -u /usr/lib/python2.7/dist-packages/quantum/agent/linux/ovs_lib.py.org /usr/lib/python2.7/dist-packages/quantum/agent/linux/ovs_lib.py --- /usr/lib/python2.7/dist-packages/quantum/agent/linux/ovs_lib.py.org 2013-05-27 12:11:28.503356553 +0900 +++ /usr/lib/python2.7/dist-packages/quantum/agent/linux/ovs_lib.py 2013-05-27 12:03:22.626967070 +0900 @@ -167,6 +167,7 @@ self.set_db_attribute("Interface", port_name, "options:in_key", "flow") self.set_db_attribute("Interface", port_name, "options:out_key", "flow") + self.set_db_attribute("Interface", port_name, "options:pmtud", "false") return self.get_port_ofport(port_name) def add_patch_port(self, local_name, remote_name):