2017年11月15日水曜日

Contrail 4.0 での既存環境との接続 by Simple Gateway

前回Openstack OcataとOpenContrail 4.0を作成しました。この状態ではVM間の通信は可能ですが、既存環境からの通信はできません。
OpenContrailは別環境と接続する場合、基本的にMPBGP+MPLSoGREを話せるゲートウェイルータが必要です。(例えばJuniper MXシリーズやCisco ASRシリーズ)
このようなルータがない場合、OpenContrailのvRouterをゲートウェイとして既存環境と接続するSimple Gateway機能を利用する必要があります。

Simple GatewayはOpenstack NeutronのGateway Nodeのような働きをします。
Compute node内にSimple Gatewayが作成され、ContrailのvRouterと連携し、オーバーレイトンネルと物理NICとの橋渡しを行います。


イメージとしては下図のように、VMがインターネットなどに抜けたい場合、一度Contrail vRouterの通信をSimple Gatewayで終端。その後Simple Gatewayかれ出てきたパケットはCompute nodeのルーティングテーブルを参照し、GW経由でインターネットに接続します。

Simple Gateway作成手順

  1. Public用の仮想ネットワークを作成(外部接続用アドレス)
  2. Simple Gatewayを作成
  3. Private用の仮想ネットワークを作成(仮想マシン用)
  4. 仮想マシンを作成
  5. Floating IPを仮想マシンに設定
  6. 通信確認

1. Public用の仮想ネットワークを作成(外部接続用アドレス)

OpenstackでもOpenContrailでもどちらからでも作成可能です。

Openstackから作成する場合

作成
source openstackrc
openstack network create public --external
openstack subnet create --network public --subnet-range 203.0.113.0/24 public_subnet
確認
openstack network list --external
+--------------------------------------+--------+--------------------------------------+
| ID                                   | Name   | Subnets                              |
+--------------------------------------+--------+--------------------------------------+
| 08960915-ef83-4980-ae3d-08aea937d4fb | public | bea3e1c9-4658-4b17-bfb6-9ee8047d04c6 |
+--------------------------------------+--------+--------------------------------------+

Contrailから作成する場合

Configure > Networking >Networks を開き、+をクリックし以下を入力しSave
Name: 仮想ネットワーク名
Subnet:CIDRにネットワークアドレス (今回は203.0.113.0/24)
Adbanced Options: Externalにチェック

2.Simple Gatewayを作成

SimpleGatewayはCompute nodeに作成するため、対象ノードにログインします。
ログイン後、以下のコマンドを発行します。
docker exec agent python /opt/contrail/utils/provision_vgw_interface.py --oper create --interface vgw1 --subnets 203.0.113.0/24 --routes 0.0.0.0/0 --vrf default-domain:admin:public:public
引数の解説

  • --oper: 作成する場合はcreate 削除する場合はdelete
  • --interface: Simple Gatewayの名前。複数Simple Gatewayを作成する場合はユニークな名前を指定
  • --subnets: Simple Gatewayが使用するサブネットを指定。公開したい仮想ネットワークのサブネットを指定
  • --routes: Simple Gatewayが通信してよいネットワークを指定。インターネットなど、不特定のネットワークの場合は0.0.0.0/0を指定。特定の場合は10.0.0.0/24 などを指定。複数設定可能
  • --vrf: Contrailが使用するVRF名を使用。シンタックスはdefault-domain:<project名>:<仮想ネットワーク名>:<仮想ネットワーク名>
作成が完了するとroute -n にネットワークが追加される
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.84.50.100    0.0.0.0         UG    0      0        0 vhost0
10.84.50.0      0.0.0.0         255.255.255.0   U     0      0        0 vhost0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
203.0.113.0     0.0.0.0         255.255.255.0   U     0      0        0 vgw1
GWや他の物理サーバなどから203.0.113.0/24に通信したい場合は、Compute nodeのvhost0のIPアドレスをNexthopにしたルーティングテーブルを追加してください。
例えば、kvmホストから203.0.113.0/24に通信したい場合以下のような設定が必要です。
また、KVM Hostから外部に通信する場合、NATが必要な場合は併せてせっていしてください。
route add -net 203.0.113.0 netmask 255.255.255.0 gw 10.84.50.119
iptables -A POSTROUTING -t nat -o em1 -s 203.0.113.0/24 -j MASQUERADE

3.Private用の仮想ネットワークを作成(仮想マシン用)

OpenstackでもOpenContrailでもどちらからでも作成可能です。

Openstackから作成する場合

作成
source openstackrc
openstack network create user-VN1
openstack subnet create --network user-VN1 --subnet-range 192.168.0.0/24 user-VN1_subnet
確認
openstack network list --internal
+--------------------------------------+----------+--------------------------------------+
| ID                                   | Name     | Subnets                              |
+--------------------------------------+----------+--------------------------------------+
| 7f26e637-e4d2-4ce1-9afc-572837a096d4 | user-VN1 | 019c0a3c-b4a3-492a-8832-633ceffc07a3 |
+--------------------------------------+----------+--------------------------------------+

Contrailから作成する場合

Configure > Networking >Networks を開き、+をクリックし以下を入力しSave
Name: 仮想ネットワーク名
Subnet:CIDRにネットワークアドレス (今回は192.168.0.0/24)

4.仮想マシンを作成

Horizonやコマンドなどでuser-VN1に仮想マシンを作成します。
source openstackrc
nova boot --flavor m1.tiny --image cirros --nic net-id=7f26e637-e4d2-4ce1-9afc-572837a096d4 VM1 

5.Floating IPを仮想マシンに設定

OpenstackでもOpenContrailでもどちらからでも作成可能です。

Openstackから作成する場合

作成
source openstackrc
openstack floating ip create public
openstack server add floating ip VM1 203.0.113.3
確認
openstack floating ip list
+--------------------------------------+---------------------+------------------+--------------------------------------+--------------------------------------+----------------------------------+
| ID                                   | Floating IP Address | Fixed IP Address | Port                                 | Floating Network                     | Project                          |
+--------------------------------------+---------------------+------------------+--------------------------------------+--------------------------------------+----------------------------------+
| ef192165-151f-42f9-b58b-6215e6f92ba1 | 203.0.113.3         | 192.168.0.3      | a3b9d5a8-f33a-48be-92a3-d3b3508f9503 | 08960915-ef83-4980-ae3d-08aea937d4fb | 31ecaa5de0ea4ba783b8e267e6249d79 |
+--------------------------------------+---------------------+------------------+--------------------------------------+--------------------------------------+----------------------------------+

Contrailから作成する場合

Configure > Networking >Floating IPsを開き、+をクリックし選択しSave
Floating IP Pool: admin:public:default (203.0.113.0/24)
作成後、アドレスの右端のアイコンをクリックし、Associate Portを選択。Portより対象VMのIPアドレスを選択し、Save

6.通信確認

ここまで終わったら外部と通信できるか確認します。
通信ができない場合以下を確認してください
  • Simple gatewayのサブネットやルートの設定が正しいか
  • 外部からの通信がおかしい場合、Security groupで外部からの許可がされているか
  • KVMやGWのルーティングテーブルはが正しいか
  • NATが必要か
切り分けはCompute nodeのvhost0やKVM hostでtcpdumpし、どこまでパケットが出ているのか確認するとわかりやすいです。
解決しない場合はOpenContrailのSlack(英語)やユーザーズグループ(日本語)に問い合わせてください。