仮想マシン
 Computer >> コンピューター >  >> ソフトウェア >> 仮想マシン

VagrantとCoreOSでクラスタを構築する方法――ネットワーキング設定の徹底解説

Vagrantは、VirtualBoxやKVMといった一見複雑な仮想化ソフトウェアを、シンプルで整ったラッパーとして扱えるようにすることを目指したソリューションです。さらにDockerコンテナやクラウドサーバー環境にも対応しており、単なるローカル仮想化ツールの枠を超えた存在といえます。

今回はこの流れを発展させ、少し異なるユースケース――いわゆる「クラウド寄り」のシナリオを取り上げます。以前の記事でも登場したCoreOSは、クラウド時代の波に乗るプレイヤーのひとつで、洗練されたクラスタ機能と自動化の仕組みを提供しています。本記事では、クラスタの立ち上げ方に加え、公式ドキュメントでも十分に説明されていないネットワーキング部分について詳しく見ていきます。

ディスカバリートークンの設定

前回はあえてWindows上のPowerShellからVagrantを試し、「いろいろなやり方がある」ということを示しましたが、今回はLinux環境(正確にはXubuntu Vivid)を使用します。

公式ガイドに従えば、Vagrant向けのCoreOSセットアップはそれほど難しくありません。とはいえ、オンラインのリファレンスが示すほど簡単でもなく、ドキュメント全体から「早く始めたい」という焦りが透けて見えます。

リポジトリをクローンしたら、いくつかのファイルが手に入ります。Vagrantを初期化・起動できるようにするには、これらを少しずつ編集する必要があります。まずはuser-data.sampleファイルをuser-dataという名前に変更して編集しましょう。特に重要なのがトークンの部分です。

#cloud-config

coreos:
  etcd:
    # 一意なクラスタごとに新しいトークンを生成する
    # https://discovery.etcd.io/new?size=3
    # ?size=X でクラスタの初期サイズを指定
    # 警告: 'vagrant destroy' を実行するたびに置き換えること
    discovery: https://discovery.etcd.io/<token>

CoreOSでは、トークンと呼ばれる一意な識別子を使って、稼働中のインスタンス同士が互いを認識できるようにします。同じトークンを持つホストはすべて同じクラスタに属し、etcdによる共有設定・ディスカバリーサービスを通じて一元的に管理されます。

新しいトークンは、以下のURLにアクセスして希望するクラスタサイズを指定すれば生成できます。デフォルト構成は3ホストです。生成されたトークンを控えて、設定ファイルに追記してください。

https://discovery.etcd.io/new?size=<size>
https://discovery.etcd.io/21e4099c23b52a8403640c2d48cdca6f

このトークンが後で重要になる理由は、ネットワーキングのセクションで明らかになります。

クラスタの構成

次に、Vagrant起動時に何台のCoreOSインスタンスを立ち上げるかを定義します。クローンしたGitディレクトリ内のconfig.rb.sampleファイルをconfig.rbにリネームし、そこへ変更を加えます。ここでは差別化を図って、4インスタンスを試してみましょう。

# Vagrantが作成するCoreOSクラスタのサイズ
$num_instances=4

クラスタの起動

準備が整ったらVagrantを実行します。オンラインリポジトリをクローンしていれば、カレントディレクトリにすでにデフォルトのVagrantfileが存在するため、vagrant initを実行するとエラーになります。

vagrant init
`Vagrantfile` already exists in this directory. Remove it before
running `vagrant init`.

また、VirtualBoxなどの仮想化ソフトウェアがインストールされていない場合も、起動時にエラーが発生します。事前にこうした小さな問題を解決しておきましょう。

vagrant up
The provider 'virtualbox' that was requested to back the machine
'core-01' is reporting that it isn't usable on this system.

Vagrant could not detect VirtualBox! Make sure VirtualBox is properly installed.
Vagrant uses the `VBoxManage` binary that ships with VirtualBox, and requires
this to be available on the PATH.

うまくいけば、Vagrantが起動してCoreOSインスタンスを1台ずつ作成していきます。時間がかかることもあり、大きなクラスタを扱う場合は十分なネットワーク帯域とメモリが必要です。

vagrant up
Bringing machine 'core-01' up with 'virtualbox' provider...
Bringing machine 'core-02' up with 'virtualbox' provider...
Bringing machine 'core-03' up with 'virtualbox' provider...
Bringing machine 'core-04' up with 'virtualbox' provider...
==> core-01: Box 'coreos-alpha' could not be found. Attempting to find and install...
core-01: Box Provider: virtualbox
core-01: Box Version: >= 308.0.1
==> core-04: Importing base box 'coreos-alpha'...
==> core-04: Matching MAC address for NAT networking...
==> core-04: Fixed port collision for 22 => 2222. Now on port 2202.
==> core-04: Preparing network interfaces based on configuration...
    core-04: Adapter 1: nat
    core-04: Adapter 2: hostonly
==> core-04: Forwarding ports...
    core-04: 22 => 2202 (adapter 1)
==> core-04: Booting VM...
==> core-04: Waiting for machine to boot. This may take a few minutes...
    core-04: SSH address: 127.0.0.1:2202
    core-04: SSH username: core
    core-04: SSH auth method: private key
==> core-04: Machine booted and ready!
==> core-04: Setting hostname...
==> core-04: Configuring and enabling network interfaces...
==> core-04: Running provisioner: file...
==> core-04: Running provisioner: shell...

すべてのマシンが作成されたら、vagrant statusコマンドで既存マシンの一覧と現在の状態を確認できます。

ネットワーキング

ここからが本当に面白い部分です。4台の仮想マシンがあるのはいいのですが、どうやって接続すればよいのでしょうか?Dockerを検証したときにも似たような課題に直面しましたが、ここでも同じ考え方が通用します。

まず、稼働中の各マシンにはvagrant sshコマンドで接続できます。鍵の管理などはすべてVagrantが面倒を見てくれます。ただし、このコマンドはクローンしたディレクトリ内で実行する必要があります。そうしないとエラーになります。

vagrant ssh core-02 -- -A
A Vagrant environment or target machine is required to run this
command. Run `vagrant init` to create a new Vagrant environment.
Or, get an ID of a target machine from `vagrant global-status`
to run this command on.

正しいディレクトリで実行すれば、問題なく接続できるはずです。

ところがifconfigを実行すると、すべてのマシンが同じIPアドレスを持っているように見え、相互にルーティングできないことがわかります。さらにVirtualBoxのインターフェースは172系のプライベートセグメントで動作しているため、状況は少し厄介です。これはDockerのときとよく似た現象です。

VirtualBoxの内部ネットワーク範囲を使い、ファイアウォール規則やルーティングを調整する方法もあります。しかし、この方法ではどの仮想マシンがどのIPアドレスを使っているのか把握しづらく、その場で簡単に特定できません。つまり、適切な情報を取得するには、もう少しエレガントな手段があるということです。

localhost経由で接続する

思い出してください。起動時、Vagrantは各仮想マシン向けにSSHをlocalhost上の別々のポート(2200番など)で設定しています。クライアントにSSHでログインしたい場合は、この方法が使えます。

ssh 127.0.0.1 -p 2202
The authenticity of host '[127.0.0.1]:2202 ([127.0.0.1]:2202)' can't be established.
ED25519 key fingerprint is 32:a0:57:58:b3:55:fc:03:c8:89:7d:7c:cc:6f:85:9d.
Are you sure you want to continue connecting (yes/no)?

任意の場所からIPアドレス経由で接続する

しかし、この方法ではVM間通信には対応できません。ここでディスカバリーの仕組みが真価を発揮します。クラスタが稼働している状態で、先ほどのURLに再度アクセスしてみてください。今度は見た目こそ美しくないものの、実用性の高いJSONデータが表示されるはずです。

キーと値に注目してください。各エントリーにはIPアドレス(例:172.17.8.103)が含まれており、この出力から解析できます。これで内部アドレスが判明したので、クライアントへ直接接続できるようになり、さらに重要なことに、ノード同士の相互通信も可能になります。

あとひとつ足りないのは、coreユーザーのパスワードが不明な点です。そこで、.vagrant.dサブディレクトリ内にある提供済みの秘密鍵を使用します。鍵を登録すれば、シームレスに接続できるようになります。この手法は最初のガイドでも紹介しました。

ポートフォワーディング

ボックスの設定自体にはあまり踏み込んできませんでしたが、稼働中インスタンスのIPアドレスがわかった今、かなり自由度の高い操作が可能になります。たとえばポートフォワーディングは、サービスを公開する仮想マシンにとって非常に価値のある機能です。

必要な変更は、Vagrantfile内にディレクティブとして記述します。Dockerfileのように、複数の構成に対して複数の設定を持たせることもできます。たとえばHTTPSポートを転送するなら次のようになります。

config.vm.forward_port 443, <host port>

Docker関連の記事を読んでいただいた方なら、すぐ理解できるでしょう。ホストポートとゲストポートを指定するだけです。ボックスごとに複数の宣言を並べることもできますし、システムを完全に制御したい場合はファイアウォール規則を手動で設定することも可能です。これはほんの導入にすぎず、今後じっくり取り上げていく予定です。

もちろん次のステップはDockerとの連携です。デフォルトのポート範囲が似通っているのはおそらく偶然ではなく、クラスタ、コンテナ、並列実行といった高度な概念で遊び始められます。Vagrantにはプラグイン機構が備わっており、これについては別記事で解説します。作業が終わったら、vagrant destroyでインスタンスを破棄するだけです。

関連記事

併せて読みたい関連コンテンツをご紹介します。

  • CoreOSクイックスタートガイド(やや難易度が高め)
  • etcdに近い機能を提供するsupervisordチュートリアル
  • KVMとVirtualBoxのサイドバイサイド構成の調整テクニック

まとめ

VagrantもCoreOSも、野心的で型破り、反骨精神あふれる興味深いアイデアに思えます。ビジネス環境でどれほどの価値があるのかはまだ確信を持てませんが、実際の作業の細部を隠蔽するラッパー技術は急速に普及しつつあります。誰もがフロントエンドやオーケストレーションツールを求めています。問題は、市場があまりに移り気で不安定なこと、標準がないこと、そしてPythonやRuby、JSONのような扱いにくいものが使われていることですが、それはさておき。

私たちはまたひとつ、未知の領域を切り拓きました。VagrantとCoreOSの両方に少し親しめたはずです。次回は、これらのクラスタサービスを実際に触っていきます。そしてそれはほんの始まりにすぎません。

今後数か月にかけて、Fleet、Kubernetes、Mesos、etcdなど、魅力的なプロジェクトを幅広く探索していく予定です。CoreOSなどをクラウドプロバイダーと連携させたり、分散・並列ファイルシステムを検証したり、JenkinsやAnsibleのような自動化ツールを試したりと、話題満載でお腹いっぱいになること間違いなしです。お楽しみに。

それでは、また。

  1. VMware ESXi活用ガイド:パフォーマンス最適化からSSH有効化までの実践テクニック

    当ブログでは、これまでESXについてあまり深く取り上げてきませんでした。今回はその埋め合わせとして、ESXiに関する実用的なノウハウをたっぷりとご紹介します。ESXiで仮想マシンをクローンする方法に関するチュートリアルに続き、今度はVMwareの魅力をさらに掘り下げていきましょう。ESXiは無償で提供されているベアメタル型ハイパーバイザーであり、最も高価かつ高機能な仮想化ソリューション「ESX」へとつながる最初のステップです。念のため整理しておくと、VMwareにはホームユーザー向けの「VMware Player」や「Workstation」があります。また、ESXの機能を小規模でお手軽に体験

  2. Meltdown・Spectreパッチを6台の実機で検証 ― 性能への影響はあるのか?

    先日、アンチウイルスソフトをインストールしていない環境でもWindows向け2018年1月のMeltdown(メルトダウン)パッチを導入する方法を紹介しました。Microsoftは互換性のない一部のアンチウイルス製品を一時的にブラックリスト化し、その結果として「アンチウイルスを一切入れていないユーザー」まで更新対象から外れてしまったのです。この点についてMicrosoftは何も説明してくれませんでした。「羊の群れ」とは違う発想をすることなど、想定外なのでしょう。さて、パッチのインストールが完了したので、次に確認すべきは性能と安定性です。私は合計6台のシステムでテストを行いました。Microso