opencontrail内のネットワークに外から疎通するには

前回の続きとなる。
http://aaabbb-200904.hatenablog.jp/entry/2017/10/24/232741

前回作成したk8s+contrail の環境を使用して、contrail 内部のネットワークから外に出る方法をまとめておく。

contrail のネットワークでは、他のノードと、MPLS over GRE で疎通する関係上、そのままだとcontrail内のvmは、お互いの間でしか疎通できない。
外に出るためには、MPLS over GREの通信を、通常のIP通信に変換する仕組みが必要となる。

今回は、aws上のvMXを使用して、変換を行うようにした。
vMXの起動方法については以下を参照。
https://www.juniper.net/documentation/en_US/vmx15.1f6/topics/concept/vmx-aws-overview.html

この後、MPLS over GREの通信を、vMXで終端するための設定を行うのだが、こちらはおおまかに、以下の4ステップで実施できる。
- BGPの設定
- GREの設定
- VRFの設定
- firewall filter の設定

コンフィグそのものは、多くの部分を、contrail の device-manager という機能を使って、自動生成できる。
device-manager の設定方法は、以下を参照。
https://www.juniper.net/documentation/en_US/contrail4.0/topics/concept/using-device-manager-netconf-contrail.html

※ ただし、今回は、'router' に対してroute-target設定を行っている関係で、VRF/firewall filterの設定は自動生成できなかったため、この部分は手動で記述している。

また、実際に試してみたところ、docker hub に上がっている 4.0.1.0 のイメージでは、そのままだとvMXに対してコンフィグ投入を行うことが出来なかった。
事前に以下の変更を行っておくことで、コンフィグ投入を行えることが確認できた。

マスター上で実施:
# kubectl exec -it contrail-controller-xxxxx -n kube-system bash
(controller)# vi /usr/lib/python2.7/dist-packages/device_manager/mx_conf.py
17行目
 -    _products = ['mx']
 +    _products = ['mx', 'vmx']
(controller)# systemctl restart contrail-device-manager.service

最終的なvMXコンフィグは以下となる。
https://github.com/tnaganawa/contrail-k8s-tutorial/blob/master/vmx-config/vmx-config

※ コンフィグ内のIPは、それぞれ以下の意味となる。
マスターノードのIP: 172.31.3.97
スレーブノードのIP: 172.31.6.143
vMX ge-0/0/0のIP: 172.31.10.57
稼働確認用ノードのIP: 172.31.9.34

設定実施後、以下のように各ノードのipが配布されてきていることと、稼働確認用ノードからのping, ssh疎通 (セキュリティグループで許可しているvm(office, mgmt)について) ができることが確認できた。

> show route
contrail-dc-router.inet.0: 4 destinations, 4 routes (4 active, 0 holddown, 0 hidden)
 + = Active Route, - = Last Active, * = Both

10.0.11.4/32       *[BGP/170] 00:07:49, MED 100, localpref 200, from 172.31.3.97
                      AS path: ?, validation-state: unverified
                    > via gr-0/0/0.32769, Push 34
10.0.12.4/32       *[BGP/170] 00:07:48, MED 100, localpref 200, from 172.31.3.97
                      AS path: ?, validation-state: unverified
                    > via gr-0/0/0.32769, Push 40
10.0.13.4/32       *[BGP/170] 00:07:49, MED 100, localpref 200, from 172.31.3.97
                      AS path: ?, validation-state: unverified
                    > via gr-0/0/0.32769, Push 51
10.0.14.4/32       *[BGP/170] 00:07:49, MED 100, localpref 200, from 172.31.3.97
                      AS path: ?, validation-state: unverified
                    > via gr-0/0/0.32769, Push 45

なお、vMXで終端しないといけないのは少々面倒に見えるが、例えば、openstackのml2プラグイン等では、bgp無しのvxlanを使用する関係上、networkノードという特別なノードを設置しないと終端が出来ない。
https://docs.openstack.org/liberty/ja/networking-guide/scenario-classic-ovs.html
contrailではbgp/mplsという標準的な仕組みを使っている関係で、ルーターで直接オーバーレイを終端出来る、というのは、メリットといえるのではなかろうか。