FURYU Tech Blog - フリュー株式会社

フリュー株式会社の開発者が技術情報を発信するブログです。

Open vSwitchのVRRP(L3HA)で高可用性を実現する!

みなさん、こんにちは。コンテンツ・メディア第1事業部インフラ担当の藤本佳世です。

今回もOpenStackの続き、【Open vSwitchのVRRP(L3HA)で高可用性を実現する!】についてお話しします。

VRRPとは

VRRP(Virtual Router Redundancy Protocol)とは、ルータの冗長化をサポートするプロトコルです。

フリューでは、OpenStackで立ち上げた仮想インスタンスに接続する際に、このVRRP機能を採用しています。

仮想インスタンスへはFloatingIPでssh接続しています。

その通信が、Neutron(networknode)サーバでプライベートIPアドレスにNAT変換され、仮想インスタンスに接続されます。この処理を行うNeutron(networknode)サーバ2台をVRRP構成にすることで、master側のサーバに障害が発生した場合、すぐにstandby側のもう1台のサーバに自動的に処理を切り替えることができます。

<イメージ図>

構築について

公式ドキュメントを参考に構築を進めました。

ネットワークの知識が必要なので、慣れないうちは苦労するかもしれません。

サーバ構成について

コンポーネント ノード
サーバ1 Keystone/Horizon/Nova/Cinder/Glance/Neutron ※1 MySQL/Memcached/RabbitMQ ※2 Heartbeat controllernode
サーバ2 Keystone/Horizon/Nova/Cinder/Glance/Neutron ※1 MySQL/Memcached/RabbitMQ ※2 Heartbeat controllernode
サーバ3 Nova/Cinder/Neutron computenode/storagenode
サーバ4 Nova/Cinder/Neutron computenode/storagenode
サーバ5 Nova/Cinder/Neutron computenode/storagenode
サーバ6 Nova/Cinder/Neutron computenode/storagenode
サーバ7 Neutron networknode
サーバ8 Neutron networknode

ネットワーク作成について

ネットワーク名 ext-net80 vxlan-net80
プロジェクト admin service
ネットワーク種別 flat vxlan
外部ネットワーク external1
割り当てサブネット ext-subnet80 10.0.80.0/24 vxlan-subnet80 192.168.80.0/24
Gateway 10.0.80.1 192.168.80.1

※1ネットワークセグメントのみの情報です。実際には同じような構成で3パターン作成しました。

設定内容

各ノードに対して設定を行います。ポイントとなる部分を書き出してみました。

用語の説明

NAT変換 IPアドレスを変換する技術のこと
VXLAN L3ネットワーク上に論理的なL2ネットワークを構築するトンネリングプロトコルのこと
ML2プラグイン OpenStack Networking で、複雑な実世界のデータセンターで使われている様々な L2 ネットワーク技術を同時に利用できるようにするフレームワークのこと
GRE ML2 がサポートするネットワークセグメントタイプの一種
Flat ML2 がサポートするネットワークセグメントタイプの一種
DHCP IPアドレスなどを自動的に割り当てる仕組みのこと

controllernode

共通のオプションを設定します。

[DEFAULT]
verbose = True
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
router_distributed = False
l3_ha = True
l3_ha_net_cidr = 169.254.192.0/18
max_l3_agents_per_router = 3
min_l3_agents_per_router = 2
dhcp_agents_per_network = 2

ML2プラグインを設定します。

[ml2]
type_drivers = flat,vlan,gre,vxlan    
tenant_network_types = vlan,gre,vxlan 
mechanism_drivers = openvswitch      ←opnevswitchを指定
 
[ml2_type_flat]
flat_networks = external1,external2,external3
 
[ml2_type_vlan]
network_vlan_ranges = external1,external2,external3,vlan:1000:2999
 
[ml2_type_gre]
tunnel_id_ranges = 1:1000           ←お使いの環境に応じたGREの最小値:最大値に置き換えて下さい
 
[ml2_type_vxlan]
vni_ranges = 1000:2000           ←お使いの環境に応じたVXLAN IDの最小値:最大値に置き換えて下さい  
vxlan_group = 239.1.1.1
 
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_security_group = True
enable_ipset = True

networknode

Open vSwitchエージェントを設定します。

[ovs]
local_ip = XX.XX.XX.XX     ←GRE/VXLAN プロジェクトネットワークを扱うインターフェースのIPアドレスに置き換えて下さい 
bridge_mappings = vlan:br-vlan,external1:br-ex1,external2:br-ex2,external3:br-ex3
 
[agent]
tunnel_types = gre,vxlan
l2_population = False
 
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_security_group = True
enable_ipset = True

L3エージェントの設定します。

[DEFAULT]
verbose = True
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
use_namespaces = True
external_network_bridge =
router_delete_namespaces = True
agent_mode = legacy
ha_confs_path = $state_path/ha_confs
ha_vrrp_auth_type = PASS
ha_vrrp_auth_password = openstack
ha_vrrp_advert_int = 2

DHCPエージェントを設定します。

[DEFAULT]
verbose = True
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
use_namespaces = True
dhcp_delete_namespaces = True

メタデータエージェントの設定します。

computenode

Open vSwitchエージェントを設定します。

[ovs]
local_ip = XX.XX.XX.XX    ←GRE/VXLAN プロジェクトネットワークを扱うインターフェースのIPアドレスに置き換えて下さい
bridge_mappings = vlan:br-vlan
 
[agent]
tunnel_types = gre,vxlan
l2_population = False
 
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_security_group = True
enable_ipset = True

ネットワークの作成

次は、ネットワークの作成の手順をご紹介します。
フリューでは、3つのネットワークセグメントが存在し、それぞれ仮想ルータを3台構築しました。

下記の通り、flat外部ネットワークとプロジェクトネットワーク(vxlan)を作成しました。

ネットワーク名 ext-net80 vxlan-net80
プロジェクト admin service
ネットワーク種別 flat vxlan
外部ネットワーク external1
割り当てサブネット ext-subnet80 10.0.80.0/24 vxlan-subnet80 192.168.80.0/24
Gateway 10.0.80.1 192.168.80.1

※1ネットワークセグメントのみの情報です。実際には同じような構成で3パターン作成しました。

flat外部ネットワーク作成

  1. 外部ネットワークを作成 ※下記の例では「ext-net80」というネットワーク名で作成しました。

    neutron net-create ext-net80 --router:external1 True --provider:physical_network external1 --provider:network_type flat
  2. 外部ネットワークのサブネットを作成
    neutron subnet-create ext-net80 10.0.80.0/24 --name ext-subnet80 --allocation-pool start=10.0.80.101,end=10.0.80.200 --disable-dhcp --gateway 10.0.80.1

プロジェクトネットワーク(vxlan)作成


  1. serviceプロジェクトのidを取得
    ※ここではすでにserviceプロジェクトが存在することを前提としています。

    openstack project show service
    +-------------+----------------------------------+
    |   Field     |              Value               |
    +-------------+----------------------------------+
    | description |           Demo Tenant            |
    |   enabled   |               True               |
    |      id     | 443cd1596b2e46d4996xxxxxxxxxxxxx |
    |     name    |               service            |
    +-------------+----------------------------------+
  2. ネットワーク作成
    ※先ほどとは異なり、network_typeにvxlanを指定します。

    neutron net-create vxlan-net80 --tenant-id 443cd1596b2e46d4996xxxxxxxxxxxxx --provider:network_type vxlan
  3. サブネットを作成
    neutron subnet-create vxlan-net80 192.168.80.0/24 --name vxlan-subnet80 --gateway 192.168.80.1
  4. 仮想ルータの作成
    neutron router-create router80
  5. サブネットを仮想ルータにインターフェースとして接続
    neutron router-interface-add router80 vxlan-subnet80
  6. ルータに外部ネットワークへのゲートウェイを追加
    neutron router-gateway-set router80 ext-net80

HA確認

  1. 下記のコマンドでVRRP(active,standby)構成になっていることが確認できます。
    $ neutron l3-agent-list-hosting-router router80
    +--------------------------------------+---------+----------------+-------+----------+
    | id                                   | host    | admin_state_up | alive | ha_state |
    +--------------------------------------+---------+----------------+-------+----------+
    | 71a98e8f-1438-4e9aXXXXXXXXXXXXXXXXXX | サーバ7  | True           | :-)   | active   |
    | 09a9a76d-d67d-44ebXXXXXXXXXXXXXXXXXX | サーバ8  | True           | :-)   | standby  |
    +--------------------------------------+---------+----------------+-------+----------+

  2. networknodeで、qrouterとqdhcp名前空間の作成を検証します。
    ※両方のqrouter名前空間で同じUUIDが使われているはずです。

    ip netns
    qrouter-7a46dba8-8846-498c-9e10-588664558473

    ip netns
    qrouter-7a46dba8-8846-498c-9e10-588664558473

  3. networknodeでHAの動作確認をします。
    ※qrouter 名前空間には ha, qr, qg インターフェースがあります。バックアップノードはqrとqgインターフェースはIPアドレスを持ちません。


  4. ha インターフェース 169.254.192.0/18 の範囲の一意な IP アドレスを持つ
    qr インターフェース プロジェクトネットワークのゲートウェイ IP アドレスを持つ
    qg インターフェース 外部ネットワーク上のプロジェクトルーターの IP アドレスを持つ

    ip netns exec qrouter-7a46dba8-8846-498c-9e10-588664558473 ip addr show

    11: ha-255d2e4b-33: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1450 qdisc noqueue state UNKNOWN group default link/ether fa:16:3e:25:05:d7 brd ff:ff:ff:ff:ff:ff inet 169.254.192.1/18 brd 169.254.255.255 scope global ha-255d2e4b-33 valid_lft forever preferred_lft forever inet6 fe80::f816:3eff:fe25:5d7/64 scope link valid_lft forever preferred_lft forever 12: qr-8de3e172-53: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1450 qdisc noqueue state UNKNOWN group default link/ether fa:16:3e:10:9f:f6 brd ff:ff:ff:ff:ff:ff inet 192.168.1.1/24 scope global qr-8de3e172-53 valid_lft forever preferred_lft forever inet6 fe80::f816:3eff:fe10:9ff6/64 scope link valid_lft forever preferred_lft forever 13: qg-374587d7-2a: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc noqueue state UNKNOWN group default link/ether fa:16:3e:82:a0:59 brd ff:ff:ff:ff:ff:ff inet 10.5.80.101/24 scope global qg-374587d7-2a valid_lft forever preferred_lft forever inet6 fe80::f816:3eff:fe82:a059/64 scope link valid_lft forever preferred_lft forever

    ip netns exec qrouter-7a46dba8-8846-498c-9e10-588664558473 ip addr show

    11: ha-90d1a59f-b1: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1450 qdisc noqueue state UNKNOWN group default link/ether fa:16:3e:ae:3b:22 brd ff:ff:ff:ff:ff:ff inet 169.254.192.2/18 brd 169.254.255.255 scope global ha-90d1a59f-b1 valid_lft forever preferred_lft forever inet6 fe80::f816:3eff:feae:3b22/64 scope link valid_lft forever preferred_lft forever 12: qr-8de3e172-53: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1450 qdisc noqueue state UNKNOWN group default link/ether fa:16:3e:10:9f:f6 brd ff:ff:ff:ff:ff:ff inet6 fe80::f816:3eff:fe10:9ff6/64 scope link valid_lft forever preferred_lft forever 13: qg-374587d7-2a: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc noqueue state UNKNOWN group default link/ether fa:16:3e:82:a0:59 brd ff:ff:ff:ff:ff:ff inet6 fe80::f816:3eff:fe82:a059/64 scope link valid_lft forever preferred_lft forever

  5. Networknodeで、マスターノードの HA インターフェースの IP アドレスから VRRP 通信が行われていることを確認します。
    tcpdump -lnpi eth1
    16:50:16.857294 IP 169.254.192.1 &gt; 224.0.0.18: VRRPv2, Advertisement, vrid 1, prio 50, authtype simple, intvl 2s, length 20
    16:50:18.858436 IP 169.254.192.1 &gt; 224.0.0.18: VRRPv2, Advertisement, vrid 1, prio 50, authtype simple, intvl 2s, length 20
    16:50:20.859677 IP 169.254.192.1 &gt; 224.0.0.18: VRRPv2, Advertisement, vrid 1, prio 50, authtype simple, intvl 2s, length 20
    

冗長化することは、どんなシステムでも重要視される部分ですね。

最後に

今回初めてVRRPという単語を聞いた私にとっては、かなり苦戦する部分ではありましたが、何とか構築することができました。ネットワーク知識が必要となりますが、少しでも構築の参考になれば嬉しいです。