Tech Sketch Bucket of Technical Chips by TIS Inc.

SoftLayerの仮想ネットワークでmulticastDNSを試してみた

Pocket

いつでも簡単にサーバを立ち上げることができるクラウドは大変便利ですが、オンプレミスで実装している機能が全てクラウド上で再現できるとは限りません。特に仮想ネットワークはアーキテクチャが複雑なため、仮想IPとmulticastを用いた冗長化などunicast以外の通信が必要な機能は、対象のクラウド上で問題なく動作するのか実際に確かめる必要があります。今回はSerfクラスタをクラウドの仮想ネットワーク上へ構築する場合を例に取り、AWSSoftLayerの仮想ネットワークのアーキテクチャの差異について見ていきます。

serf-logo
amazon-aws-logo
softlayer-logo


AWS VPCのネットワーク

AWS(Amazon Web Service)は、Amazon.comが提供しているクラウドサービス群の総称です。コンピュートサービスのAmazon EC2(Elastic Computing Cloud)やストレージサービスのAmazon S3(Simple Storage Service)など、様々なサービスがリリースされています。

その中でもAmazon VPC(Virtual Private Cloud)は、パブリックなAWS内で仮想的にプライベートなネットワークを構築できるサービスです。
VPCを用いて任意のネットワークアドレスを持ったプライベートサブネットを作成し、EC2インスタンスの仮想NICへサブネット内のIPアドレスを自動的に、あるいは任意のアドレスを指定して割り当てることができます。仮想NICへサブネット内のセカンダリIPアドレスを割り当てたり、仮想NICを追加して別のサブネットへ接続することもできます。
VPCでパブリックサブネットを構築することはできませんが、EC2インスタンスにパブリックIPアドレスを割り当てプライベートIPアドレスへNATさせることで、インターネットからのINBOUND通信を受け取ることもできます。

softlayer_serf-ec2

ただしVPCの仮想ネットワークは、broadcastとmulticastを許可していません(Amazon VPC のよくある質問)。broadcastやmulticastパケットを投げても、VPCによってdropされてしまいます。
broadcastが通らないので、arp requestを投げてもreplyは返ってきません。arpテーブルはVPCがイイカンジにメンテナンスしているため、VPCが知らないIPアドレスをIP aliasに設定しても動作しません。またmulticastも通らないため、VRRPを用いるkeepalivedなどは動作しませんし、今回例に取るmulticastDNSを用いるSerfクラスタの自動ディスカバリ機能も動作しません。

broadcastやmulticastのパケットをトラップしてunicastへ書き換えたり、GREでトンネルしてunicast化する等、AWS VPC上でbroadcastやmulticastを必要するミドルウェアを動作させることも不可能ではありません。

SoftLayerのネットワーク

SoftLayerは、IBMが提供するクラウドサービスです。SoftLayer Technologyが提供していたサービスを、IBMが2013年に買収しました。仮想サーバだけでなく物理サーバ(ベアメタル)もプロビジョニングでき、世界各国のDC間を結ぶ高速で低遅延な通信網が無料で利用できるなど、他のクラウドサービスにはない特色を持っています。日本データセンターも2014年中に開設予定と発表されており、今注目のクラウドサービスと言えるでしょう。

SoftLayerで作成した仮想インスタンス&ベアメタルインスタンスでは、パブリックサブネットに接続された仮想NICとプライベートサブネットに接続された仮想NICが最初から利用できます。
残念ながら、この最初にSoftLayerから与えられるサブネットのネットワークアドレスや仮想NICに割り当てられるIPアドレスは、SoftLayerによって勝手に割り振られてしまいます。インスタンス作成時に利用者がアドレスを指定することはできません。Portable IPやStatic IPという仕組みを使って新しくサブネットを作成し、インスタンスにそのサブネット内のIPアドレスでIP aliasを設定することも可能ですが、それらのサブネットのネットワークアドレスも指定することができません。

softlayer_serf-softlayer

一方SoftLayerの仮想ネットワークはVLANという形で実現されており、与えられたVLAN上のサブネット内ではbroadcastやmulticastが通ります。そのためこれまでのネットワーク周りの常識がある程度通用しやすく、broadcastやmulticastを利用するミドルウェアもそのまま利用することができます。SoftLayerはその内部アーキテクチャを勉強会などでも公開していますし(【緊急開催】第4回東京SoftLayer勉強会の紹介記事)、インフラエンジニアに好まれやすいクラウドだと言えるかもしれません。

SoftLayerの仮想ネットワークでmulticastを検証してみよう

それでは、Multicast DNSを用いるSerfクラスタの自動ディスカバリ機能を例にとり、SoftLayerの仮想ネットワークでmulticastが通るのか検証してみましょう。

Serfとは

SerfHashiCorpが公開しているサービスディスカバリやノードオーケストレーションのためのツールです。
Gossipプロトコルを用いて単一障害点の無いクラスタを構成し、クラスタ内へのノードの参加や離脱、障害を検知してクラスタメンバーへ通知して対処を促したり、発生させたカスタムイベントをクラスタメンバーへ伝播させ適切な設定を施したりすることができます。

Serfクラスタの自動ディスカバリ

Serfを利用するためには、まずSerfクラスタを構築しなければなりません。従来のSerfでは、既にSerfクラスタへ参加しているメンバーのIPアドレスを明示的に指定してクラスタへ参加する必要がありました。この場合指定したメンバーがダウンしているとクラスタへ参加できませんし、そもそもクラスタを構成するメンバーのIPアドレスを事前に知っておく必要があります。

そこでSerf 0.4.0からは、Multicast DNSを用いたSerfクラスタの自動ディスカバリ機能が実装されました。Serfを起動する際にmulticastパケットを発行して、multicastの到達範囲内に指定した名前で起動しているSerfクラスタが存在するか探索します。クラスタを発見した際には自動的に参加するため、クラスタメンバーのIPアドレスを知らなくても、Serfクラスタの名前さえ知っていればクラスタへ参加することが可能となります。

実験1

まずは、SoftLayerの同一プライベートサブネット上で実験します。Serfは現時点で最新のversion 0.6.3を用います。

環境

同一DC(San Jose 1)上で、3台のVirtual Server(OSはUbuntu Server 14.04)を起動します。

SoftLayerでは、最初のインスタンスを起動するときにパブリックVLAN上のパブリックサブネットとプライベートVLAN上のプライベートサブネットが作成されます。2つ目以降のインスタンス立ち上げ時でも、可能な限り同じサブネットに所属するようにIPアドレスが割り当てられるようです。
今回は以下のようなIPアドレス構成になりました(サブネットは10.54.222.128/26)。

host NIC mac Addr ip Addr
serf-test01 eth0 06:8a:90:33:68:cf 10.54.222.131
serf-test02 eth0 06:6c:77:46:6b:d4 10.54.222.132
serf-test03 eth0 06:97:7c:fd:95:c7 10.54.222.133

Serfの起動

以下のコマンドを各ノードで実行し、Serf agentを起動します。Multicast DNSが届いていれば、自動的に"test-cluster"という名前のSerfクラスタが構成されるはずです。

結果

クラスタメンバーのIPアドレスを指定しなくても、Serfクラスタが探索され自動的にJOINしていることがわかります。

ここから、同一サブネット内ではMulticast DNSが正常に動作していることがわかります。

実験2

次に、複数のプライベートサブネット間でのmulticast到達性を確認します。

環境

実験1と同じDC(San Jose 1)上で、今度は1台のBare Metal Server(OSはUbuntu Server 14.04)を起動します。今回、Bare Metal Serverには実験1の3台とは異なるVLAN、異なるサブネットが割り当てられました(10.91.83.0/26)。

host NIC mac Addr ip Addr
serf-test00 eth0 00:25:90:6c:6b:2e 10.91.83.2

なおSoftLayerのVLAN Spanning機能をONにしているため、サブネットが異なるVirtual Serverの3台とも通信可能です。

ただしboradcastドメインは異なるため、当然arpテーブルには載りません。(10.91.83.1はgatewayノード)。

Serfの起動

では実験1で立ち上げたSerfクラスタを起動したままで、以下のコマンドをserf-test00で実行します。Virtual Serverが所属するサブネット(10.54.222.128/26)にまでmulticastが届くのならば、既存のSerfクラスタにJOINするはずです。

結果

残念ながら、既存のSerfクラスタにはJOINしませんでした。

SoftLayerの仮想ネットワークは、VLAN Spanningを設定するだけではサブネット間でmulticastはルーティングされないようです。

少なくとも現時点では、異なるサブネットで起動しているSerfクラスタへ参加したい場合、明示的にクラスタメンバーのIPアドレスを指定する必要があるようですね。

最後に

クラウドの仮想ネットワークのアーキテクチャは、クラウドごとに千差万別です。何ができ何ができないのかを知るために、これからも色々と検証を進めたいと思います。

エンジニア採用中!私たちと一緒に働いてみませんか?