:wq!

Google Compute Engineネットワーク入門 #gcpja

ども、takiponeです。GCPの500ドルクーポンをゲットしたので、GCEをいろいろ触ってみたいと思います。

GCP(Google Cloud Platform)はGoogleが提供するクラウドサービスの総称で、GCE(Google Compute Engine)は、そのうちの仮想マシンを提供するサービスです。AWS(Amazon Web Services)とAmazon EC2の関係に似ていると思っていただければ良いと思います。(厳密に言うと、GCEにはネットワーキングやディスクストレージも含まれるので、Amazon VPC、Amazon EBSなどを内包します。)

GCE自体の入門は、以下のブログ記事が詳しいです。

今回は、GCEで立ち上げるインスタンスのネットワークについてまとめてみます。あ、ちなみにAmazon VPCについては、以下のシリーズものが詳しいです。(ステマ

GCEのネットワーク

基本的な概念はAmazon VPCに良く似ています。インスタンス同士で通信を行うためのGCE内に閉じた内部ネットワークと、インターネットの不特定多数のホストと通信するための外部ネットワークを区別します。各インスタンスには、内部ネットワーク向けの内部IPアドレスと外部ネットワーク向けの外部IPアドレスが付与されます。外部IPアドレスは、GCEのゲートウェイでStatic NATとして処理されるため、インスタンスのOSからは見えません。

概念図を書いてみました。

内部ネットワークは、Networkオブジェクトとして複数作成することが可能です。Networkオブジェクトで10.0.0.0172.16.0.0などプライベートのCIDRレンジを設定し、それぞれルーティングテーブル、ファイヤーウォールを定義します。現時点でNetworkオブジェクトは同一プロジェクト(GCEの一番大きな管理単位、AWSのアカウントに相当)に閉じ、プロジェクトをまたぐことはできません。

ユニークなのは、リージョンおよびゾーンをまたげるところです。Networkオブジェクトの設定にはリージョンに関する項目が無く、異なるリージョンのインスタンスから同一Networkオブジェクトに接続し、同一レンジのプライベートIPアドレスを設定できます。ネットワークの設計時にリージョンおよびゾーンを意識する必要がないため、設計コストを抑えることができそうです。

基本はDHCPでL3通信

ドキュメントより、GCEのネットワークではブロードキャスト、マルチキャストが通りません。さらに、DHCPで払い出されるIPアドレス設定を確認すると、サブネットマスクが/32になっており、インスタンス間はL2ではなく全てゲートウェイを経由するL3で通信することがわかります。L2前提で通信するプロトコルの場合、工夫が必要になるかもしれません。

/sbin/ifconfig/sbin/routeコマンドの結果を貼っておきます。

$ /sbin/ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 42:01:0a:f0:88:96
          inet addr:10.240.136.150  Bcast:10.240.136.150  Mask:255.255.255.255
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          RX packets:391267 errors:0 dropped:0 overruns:0 frame:0
          TX packets:33252 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:560330833 (534.3 MiB)  TX bytes:5364264 (5.1 MiB)
$ /sbin/route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.240.0.1      0.0.0.0         UG    0      0        0 eth0
10.240.0.1      *               255.255.255.255 UH    0      0        0 eth0
$

MTUが1460になっている辺りに、そこはかとないSDN/NFV臭がしますね(笑) Andromedaという技術らしいです。

Debianインスタンスの/etc/network/interfacesも参考までに貼っておきます。

$ cat /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
$

DNS

内部ネットワークには他の用途と兼任で、2台のDNSサーバーが用意されます。1つはメタデータサーバー(169.254.169.254)、もうひとつはゲートウェイ(既定ではCIDRの4オクテット目が.1)です。インターネットへのリゾルバとしてはもちろん、内部ネットワークのインスタンスのホスト名もサービスします。登録されるインスタンスのホスト名はAmazon VPCと異なり、内部IPベースではなく、インスタンス名です。内部IPに依存しないので、インスタンスのリストアなどでもホスト名が変化せず、可用性確保のトリックとして利用できるかも知れません。

外部IPアドレス

インターネットと通信するための外部IPには、予約できる静的IPと揮発性のエフェメラルIPの2種類があります。静的IPは、Amazon EC2のElastic IPに相当します。Elastic IPとの違いは、ロードバランサにも静的IPが設定でき、しかもインスタンスとロードバランサ間で付け替えができる点です。ロードバランサについては、改めて検証したいところですね。リージョン毎に取得/管理することに注意してください。

まとめ

簡単ですが、GCEのインスタンスが使用するネットワークについて解説してみました。マルチリージョンを基本設計として、必要十分シンプルな構成という印象を持ちました。構成が簡単な分、いろいろ試したくなるメシウマなネットワークなので、レイテンシなどを測ってまた別の記事でご紹介できればと思います。