前回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経由でインターネットに接続します。
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作成手順
- Public用の仮想ネットワークを作成(外部接続用アドレス)
- Simple Gatewayを作成
- Private用の仮想ネットワークを作成(仮想マシン用)
- 仮想マシンを作成
- Floating IPを仮想マシンに設定
- 通信確認
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が必要な場合は併せてせっていしてください。
例えば、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し、どこまでパケットが出ているのか確認するとわかりやすいです。