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(英語)やユーザーズグループ(日本語)に問い合わせてください。

2017年10月17日火曜日

Kolla Openstack Ocata と Open Contrail4.0のインストール

DockerhubにアップロードされているOpenstack OcataとOpenContrail4.0のコンテナイメージを利用して、インストールする方法を紹介します。

今回の構成はUbuntu16.04.2をKVM上に4つ作成し、それぞれ以下のような役割になっています。作成したVMは2つ以上のNICを設定してください。(Openstack kollaの仕様)
作業はすべてkolla1から行います。
** KVMを利用する場合、ホストマシンでnestedを有効にしVMのCPUアトリビュートでVMXを有効にしてください。

構成:
kolla1(10.84.50.117): Openstack Controller/Ansible
kolla2(10.84.50.118): Contrail Controller
kolla3(10.84.50.119): Compute node
kolla4(10.84.50.120): Compute node
手順:
  1. 事前準備
  2. Ansible Playbookのダウンロードと設定
  3. インストール
  4. インストール後作業
  5. 動作確認

1.事前準備

今回はkolla1より各サーバにRootアクセスして設定するため、証明書を発行し対象サーバに登録します。
Kolla1で実行
ssh-keygen -t rsa 
すべてのノードでに対して実行
ssh-copy-id -i ~/.ssh/id_rsa.pub lab@10.84.50.117
ssh -t lab@10.84.50.117 'sudo mkdir /root/.ssh'
ssh -t lab@10.84.50.117 'sudo cp /home/lab/.ssh/authorized_keys /root/.ssh/authorized_keys' 

Ansibleを使うための事前準備
Kolla1で実行
apt update
apt install python-pip sshpass
pip install -U pip
pip install -U ansible
pip install  pyOpenSSL==16.2.0
すべてのノードに対して実行
ssh -t root@10.84.50.117 'apt-get -y install python-simplejson'

2.Ansible Playbookのダウンロードと設定

githubからインストール用ファイルをダウンロードします。
git clone https://github.com/gokulpch/OpenContrail-Kolla.git
ダウンロードしたファイルは2つあり、contrail-ansibleはOpenContrial用、kolla-ansibleはOpentack用です。

Openstackの設定ファイルの変更

OpenContrail-Kolla/kolla-ansible/etc/kolla/globals.ymlの修正

以下の4項目を修正します。
network_interface: "ens3"
kolla_internal_vip_address: "10.84.50.117"
contrail_api_interface_address: "10.84.50.118"
neutron_external_interface: "ens4"
  • network_interface:実際に使用するVMのNICを設定
  • kolla_internal_vip_address: Kolla1のens3のIPアドレスを設定
  • contrail_api_interface_address: kolla2のens3のIPアドレスを設定
  • neutron_external_interface: kolla1のNICを設定(ダミー)

OpenContrail-Kolla/kolla-ansible/etc/kolla/passwords.ymlの修正

各種コンポーネントのパスワードが設定されています。(デフォルトではcontrail1)
パスワードを変更したい場合はこのファイルを変更してください

OpenContrail-Kolla/kolla-ansible/ansible/inventory/multinodeの修正

[control] [network] [compute] [monitoring] [storage]の項目を修正してください。以下の例ではホスト名になっていますが、ホスト名を使う場合、IPアドレスが引けることが条件です。
[control]
kolla1
[network]
kolla1
[compute]
kolla3
kolla4
[monitoring]
kolla1
[storage]
kolla1

Contrailの設定ファイルの変更

OpenContrail-Kolla/contrail-ansible/playbooks/inventory/my-inventory/hostsの修正

[contrail-controllers] [contrail-analytics] [contrail-compute] [openstack-controllers]の項目を修正してください。ホスト名を設定すると動作しないので必ずIPアドレスを設定してください。
[contrail-controllers]
10.84.50.118
[contrail-analyticsdb]
10.84.50.118
[contrail-analytics]
10.84.50.118
[contrail-compute]
10.84.50.119
10.84.50.120
[openstack-controllers]
10.84.50.117

OpenContrail-Kolla/contrail-ansible/playbooks/inventory/my-inventory/group_vars/all.yml の修正

以下の5項目を修正します
ansible_ssh_private_key_file: ~/.ssh/id_rsa
global_config: { external_rabbitmq_servers: 10.84.50.117 }
rabbitmq_config: { user: openstack, password: contrail1 }
keystone_config: {ip: 10.84.50.117, admin_password: contrail1, auth_protocol: http}
vrouter_physical_interface: ens3
  • ansible_ssh_private_key_file:証明書のログインを指定(コメントアウトを外す)
  • global_config: RabbitMQのアドレスを設定。
  • rabbitmq_config: RabbitMQのパスワードを設定。passwords.ymlを変更した場合はここも変更
  • keystone_config: KeysoneにアクセスするAdminパスワードを設定。passwords.ymlを変更した場合はここも変更
  • vrouter_physical_interface: ContrailのvRouterが使用するNICを設定。ComputeノードごとにNIC名が違う場合はhostsに個別に設定。

3.インストール

Openstackインストールの事前準備

依存ファイルのインストールとAnsible作業時にssh keyを無視する変数をExport
ssh -t root@10.84.50.117 'apt-get -y install python-oslo-config'
export ANSIBLE_HOST_KEY_CHECKING=False

Openstackのインストール

cd OpenContrail-Kolla/kolla-ansible/ansible/
ansible-playbook -i inventory/multinode -e @../etc/kolla/globals.yml -e @../etc/kolla/passwords.yml -e action=bootstrap-servers kolla-host.yml
ansible-playbook -i inventory/multinode -e @../etc/kolla/globals.yml -e @../etc/kolla/passwords.yml -e action=deploy site.yml

OpenContrailのインストールの事前準備

Dockerのインストール
ssh -t root@10.84.50.118 'curl -sSL https://get.docker.io | bash'

OpenContrailのインストール

cd OpenContrail-Kolla/contrail-ansible/playbooks/
ansible -i inventory/my-inventory -m shell -a 'apt-get install -y ntp' all
ansible-playbook  -i inventory/my-inventory site.yml

compute nodeのリブート

ssh -t root@10.84.50.119 reboot
ssh -t root@10.84.50.120 reboot

4.インストール後作業

horizonのバグFix対応

docker exec -i horizon sudo sed -i -e 's:/usr/share/openstack-dashboard/static:/var/lib/openstack-dashboard/static:g' /etc/apache2/conf-enabled/000-default.conf
docker exec -i horizon /usr/share/openstack-dashboard/manage.py collectstatic --noinput
docker exec -i horizon /usr/share/openstack-dashboard/manage.py compress
docker exec -i horizon sudo service apache2 reload

openstackrc の作成

echo 'export OS_USERNAME=admin
export OS_PASSWORD=contrail1
export OS_PROJECT_NAME=admin
export OS_USER_DOMAIN_NAME=Default
export OS_PROJECT_DOMAIN_NAME=Default
export OS_AUTH_URL=http://10.84.50.117:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2' > openstackrc

Openstack clientのインストール

pip install python-openstackclient

flavorの作成

source openstackrc
openstack flavor create --id 1 --disk 1 --ram 512 --vcpus 1 --public m1.tiny
openstack flavor create --id 2 --disk 20 --ram 2048 --vcpus 1 --public m1.small
openstack flavor create --id 3 --disk 40 --ram 4096 --vcpus 2 --public m1.medium
openstack flavor create --id 4 --disk 80 --ram 8192 --vcpus 2 --public m1.large
openstack flavor create --id 5 --disk 160 --ram 16384 --vcpus 4 --public m1.xlarge

5.動作確認

openstack network listを発行し、以下のように3つのネットワークが返ってきたらOpenstackとOpenContrailの設定は終了です。
+--------------------------------------+-------------------------+--------------------------------------+
| ID                                   | Name                    | Subnets                              |
+--------------------------------------+-------------------------+--------------------------------------+
| a5432e6b-0155-4b13-abe8-e6290f6dc9fe | __link_local__          |                                      |
| 5a58e2d9-88b1-4ff2-9e0f-e0ed5e4e72ce | default-virtual-network |                                      |
| 65549c94-5ffc-4b30-9025-00a54813a695 | ip-fabric               |                                      |
+--------------------------------------+-------------------------+--------------------------------------+

次回、OpenContrail管理外に接続するためのSimple Gatewayの設定と動作確認を紹介します。

参考リンク
https://gitlab.com/gokulpch/OpenContrail-Kolla/blob/master/README.md