準備運動が終わったので、より楽しく厳しいところ、ネットワークの作成へ参ります。
ここが最も個々で異なる部分だと思いますので、1例として眺める程度になるかもです。
テナントIDの設定
Keystoneで作成する tenant(=project) IDを変数に格納しておきます。最初は自動作成済みの admin でいきますが、2つ目以降は keystone tenant-create してからになります。
1 2 |
tenant_name=admin tenant_id=$(keystone tenant-list | grep -v invisible | grep " $tenant_name " | awk '{print $2}') |
ルータを作成
ルータを作成します。これがNetwork Namespaceの単位になります。この時、ip netns を確認して qrouter-${id} のnamespaceが作られていなかったら、関連ネットワークを一度全部削除してから再作成する必要があります。が、原因はまだわかっていません。
1 2 3 4 5 |
router_name=admin-router-01 quantum router-create --tenant-id $tenant_id $router_name quantum router-list quantum router-show $(quantum router-list | grep " $router_name " | awk '{print $2}') ip netns |
内部ネットワークを作成
いわゆるVMのfixed ip用ネットワークを作成します。テナント・OVSインターフェース・VLAN IDを関連付けます。
1 2 3 4 5 6 |
net_name=admin-private-01 quantum net-create \ --tenant-id $tenant_id $net_name \ --provider:network_type vlan --provider:physical_network physnet2 --provider:segmentation_id 1001 quantum net-list quantum net-show $(quantum net-list | grep " $net_name " | awk '{print $2}') |
サブネットを作成します。
1 2 3 4 5 6 7 8 |
subnet_name=admin-private-01-subnet-01 quantum subnet-create \ --tenant-id $tenant_id --name $subnet_name \ --allocation-pool start=172.31.0.10,end=172.31.0.240 \ $net_name 172.31.0.0/24 \ --dns_nameservers list=true 192.168.120.71 192.168.120.72 quantum subnet-list quantum subnet-show $(quantum subnet-list | grep " $subnet_name" | awk '{print $2}') |
ルータと内部ネットワークを紐付けます。
これにより、Namespaceにrouteが追加されます。
1 2 3 4 5 6 7 8 |
quantum router-interface-add $router_name $subnet_name ovs-vsctl show # 数秒経過してから確認 ip netns exec qrouter-$(quantum router-list | grep " $router_name " | awk '{print $2}' ) route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 172.31.0.0 0.0.0.0 255.255.255.0 U 0 0 0 qr-1535d412-28 |
pingで疎通を、ip netnsを通して確認します。ここではGatewayとなる 172.31.0.1 と、ルータ割り当てとなる allocation_poolsの最初のアドレス 172.17.31.10 を確認します。疎通できない場合は、1つ1つ見なおしてやり直します。
1 2 |
ip netns exec qrouter-$(quantum router-list | grep " $router_name " | awk '{print $2}' ) \ ping 172.31.0.1 |
外部ネットワークを作成
いわゆる floating ip 用ネットワークを作成します。注意点として、–router:external=True の宣言が必要ですが、1つのOVSインターフェース(ここではphysnet1)に対して、–router:external=True の net-create を2つ以上作成しようとすると、エラーが出ます(Exception: must configure ‘gateway_external_network_id’ if Quantum has more than one external network.)。
これをメッセージ通り gateway_external_network_id を設定しても解決しなかったので、
1ルーター1プロジェクトをやめて、1ルーター複数プロジェクトと変更して進めました。複数ルーターにしたい場合、gateway_external_network_id で解決するか、OVSのmappingで解決するか、他の方法を考えるのかはそれぞれだと思います。
1 2 3 4 5 6 |
net_name=admin-public-01 quantum net-create --tenant-id $tenant_id $net_name \ --router:external=True \ --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 101 quantum net-list quantum net-show $(quantum net-list | grep " $net_name " | awk '{print $2}') |
外部ネットワークのサブネットを作成します。DHCPは不要なのでFalseにしています。
1 2 3 4 5 6 7 |
subnet_name=admin-public-01-subnet-01 quantum subnet-create \ --tenant-id $tenant_id --name $subnet_name \ $net_name 192.168.141.208/29 \ -- --enable_dhcp False quantum subnet-list quantum subnet-show $(quantum subnet-list | grep " $subnet_name" | awk '{print $2}') |
ゲートウェイを設定し、ルータと外部ネットワークの紐付けを行います。
1 2 3 4 5 6 7 8 9 10 11 |
quantum router-gateway-set $router_name $net_name quantum router-list quantum router-show $(quantum router-list | grep " $router_name " | awk '{print $2}') # 確認 quantum port-list -c fixed_ips -c device_owner ip netns exec qrouter-$(quantum router-list | grep " $router_name " | awk '{print $2}' ) route -n for i in `ip netns`; do echo; echo; echo ----- $i -----; ip netns exec $i ip addr list; done ip netns exec qrouter-$(quantum router-list | grep " $router_name " | awk '{print $2}' ) \ ping 192.168.141.210 |
ホストOSネットワークとVMネットワークを通す
いちいち ip netns exec コマンドを使うのは面倒ですし、VMにfloating ipを割り当てないとControllerNode以外から繋げないというのも不便です。なので、ControllerNodeのIPアドレスとルーティングを工夫することで、ControllerNode上で普通にpingを打てたり、引いては外部サーバからVMのfixed ipに直接繋げるようにします。(不要なら飛ばしてください)対象NamespaceのrouteにDefaultG/Wが追加されているので、そのG/WアドレスをホストOSに割り当てることでVMネットワークから外への経路を作ります。
この時、floating ip の subnet cidr内に通常ネットワークのG/Wがある場合は、–gatewayに指定して subnet-create することでもVMネットワークから出て行くことは可能です。が通常はcidr外に管理ネットワークG/Wがあるはずなので、メモ程度に。
そして、外からVMネットワークへの経路を、router G/W(quantum port-list -c fixed_ips -c device_owner | grep network:router_gateway)のアドレスにすることで、往復の経路が出来上がります。通信が確認できたら、/etc/network/if-pre-up.d/openstack にでも書いておいて、起動時に反映されるようにします。
1 2 |
ip addr add 192.168.141.209/29 dev br-ex route add -net 172.31.0.0/24 gw 192.168.141.210 |
これで、ControllerNode上で ip netns を使わずにpingが通るようになりました。
通らない場合はやはり1つずつ丁寧にやり直してください。
1 2 3 |
ping 192.168.141.209 # HostOS Address ping 172.31.0.1 # VM G/W ping 172.31.0.11 # VM instanceの作成後 |
ContollerNode => VM が通るということは、外部サーバがVMネットワークへ接続する際に、ControllerNodeをG/WにすればFORWARDINGで通るということになります。なので、VMへ直接つないだり、途中のG/Wに転送してもらうために、外部サーバでrouteを設定します。
1 2 |
# 172.16.0.0/12 はfixed ip、192.168.140.3 はControllerNodeの管理アドレス route add -net 172.16.0.0/12 gw 192.168.140.3 |
接続経路メモ
fixed ip
HostOSをまたぐ場合も含む、FixedIP同士の通信は、最初の一回はL2確認のため ControllerNode に通信が飛びますが、その後は ControllerNode を通すことなく直接通信してくれます。floating ip
それに対し floating ip はVMに割り当てているように見えて、実際はControllerNodeの各Namespace内に割り当てられているので、floating ipへの接続は必ずControllerNodeを介する接続となります。分散せずControllerNodeに集中するため、高トラフィックに対して不安が残ります。ネットワークの設定には色々あってまだ追いきれていませんが(vlanがー flatがー externalがー 色々複数がー とか)、これで基礎ネットワークはできたと思っています。が、他にも冗長性・分散性・セキュリティなど検証したいところが山ほどあり、当分退屈はしなさそうです。