Contrail: Linux as an MPLS router

Contrail (http://www.opencontrail.org/) の日本語情報が少ない気がするので、ブログにまとめておく。

Contrail を一言でいうと、
 LinuxをMPLSルーター化するもの(GRE経由フルメッシュ)
で、主な用途としては、
 IPファブリックの下の何か(現実的にはOpenstackかKubernetes)、にセグメントの概念を提供する
だと思っている。

もう少し詳しく言うと、
元々サーバー数が増えてきて、IPファブリック (例としてはこちらを参考: https://www.janog.gr.jp/meeting/janog38/program/clos.html) を導入した際、ラック間で同じセグメントを共有することが出来ない、という制限が発生するようになった。
これは、アプリケーションによっては問題にならないものの、現実的には、'セグメントごとのアクセスポリシーを定めたい'、などの理由から、やはり同じ種類のサーバーは同じセグメントにまとめたい、という際に問題になる。

対応としては、VLANのような、セグメントを限定する情報を、IP上でencapsulateする方法が必要となる。

一つの方法としては、VXLANを使う方法がある。(VTEPは、スイッチ/サーバー、どちらもあり得る。)
スイッチの場合:
http://www.networkers.fi/blog/juniper-qfx-ip-fabric-and-vxlan-part-2/
サーバーの場合:
http://docs.openvswitch.org/en/latest/faq/vxlan/

もうひとつの方法として、MPLSを使った方法がある。こちらは、元々MPLSが使われていることが多い、SPネットワークでよく使われる。
https://techblog.yahoo.co.jp/infrastructure/evpn/

Contrailは後者の方法を採用したもので、kernelモジュール 'vrouter' を使い、出ていくトラフィックにMPLS情報を付与して、行き先のハイパーバイザに送る、という仕組みである。(行き先のハイパーバイザの情報は、コントローラー経由で各ノードに共有しておく)
構成図はこちら。
http://www.opencontrail.org/wp-content/uploads/2014/10/Figure01.png
http://www.opencontrail.org/opencontrail-architecture-documentation/

メリットとしては、デフォルトのopenstack ml2プラグインや、kubernetes と比べた場合はかなり明確で、
 l3で行き先を決めるので、ネットワークノード(スケールアウト不可)を持つ必要がない(ml2プラグインと比べて)
 マルチテナントが使用可能(kubernetesデフォルトと比べて)
となる。

kubernetes integrationの例はこちら。
https://www.mirantis.com/blog/kubernetes-openstack-multi-cloud-networking/

vlan+vxlan の構成に比べたメリットは、、vlan数の限界(4096)の影響を受けない、等はあげてもよいだろうか(環境によっては、アクセスポリシーの一括管理、等も挙げられるかもしれないが、execjson+applconnでも何とか出来ないことはない)

とはいえ、総じて、大規模なIPファブリックを組む環境であれば、一度検討してみてもよいのではなかろうか。

更に詳しく知りたい場合は、こちら
https://learningportal.juniper.net/juniper/user_activity_info.aspx?id=9687
https://learningportal.juniper.net/juniper/user_activity_info.aspx?id=9897