ステートレス Ubuntu 仮想マシンに IP を自動的に割り当てる方法は?

ステートレス Ubuntu 仮想マシンに IP を自動的に割り当てる方法は?

異なるネットワークや異なるデータセンターにある複数の仮想マシンにアプリケーションを展開するための、再利用可能なテンプレート イメージを作成する予定です。ホスト システムを完全に制御し、KVM をハイパーバイザーとして実行する予定です。

イメージは仮想マシンに接続されると不変になるため、各マシンの内部ソフトウェアではなく単一のテンプレートを更新することで、より簡単に変更を展開できます。

通常の Ubuntu システムで /etc/network/interfaces ファイルを構成する方法は理解していますが、最初の起動時に仮想マシンの不変イメージを使用している場合、各仮想マシンに 1 つ以上の IP アドレスを自動的に割り当てるにはどうすればよいでしょうか。

これまで私が考えついた唯一の方法は、テンプレートが起動時にネットワークに DHCP を使用するように設定することです。マシンが起動したら、ネットワーク構成情報を持つ別のサーバーまたはリモート ファイル システムに接続して IP 構成を検証および再構成するスクリプトを実行できます。

おそらく、ネットワークが利用可能になった直後に、接続されたネットワーク インターフェイスの MAC アドレスを一意の ID として送信するスクリプトをゲスト VM 上で実行し、IP 割り当てを持つ別の「マスター」サーバーからネットワーク構成を取得できます。これは、すべての VM が作成されるときに一意の MAC アドレスが割り当てられることを前提としています。

起動直後にネットワークが再起動しても重要な処理が中断されないように、ネットワークが構成され検証されるまで、mysql や php などのサービスを起動しないようにする必要があるかもしれません。

それは正しいやり方のように思えますか?

Amazon EC2、openstack などは、ネットワーク自動化に対して異なるアプローチを採用していますか? おそらく、起動時に同じことを実行する API やスクリプトを提供しているのでしょうか?

私は Ubuntu ホストで KVM を使用しており、ゲスト OS も Ubuntu になります。

答え1

ホスト側から制御できるのは、VM に提供する MAC だけです。したがって、最も簡単な方法は、特定の VM に割り当てたい IP を特定の MAC の DHCP で予約し、セットアップ時にその MAC アドレスを対象の VM に与えることです。これはある程度まで拡張できますが、VM が数百台になると MAC の管理が面倒になります。

そこで次のアプローチは、VM ごとに追加の設定ファイルが提供される、接続された ISO またはフロッピー イメージを使用して VM を起動することです。VM は起動時にスクリプトを実行し、接続された ISO/フロッピー イメージを検索し、そのようなイメージが接続されている場合、そこに見つかった設定を適用します。新しい VM を構成するときや、既存の VM を再構成するときに簡単に使用できます。

もちろん、最善のアプローチは、構成管理システム (puppet/chef/cfengine/ansible/saltstack など) または theForeman のような統合デプロイメント/構成システムを使用することです。これは、これまでで最もスケーラブルであり、ネットワークだけでなく、さまざまな設定を柔軟に管理できます。

答え2

必要以上に難しくしようとしているように思います。Ubuntu のデフォルトの KVM ネットワークは、Usermode と呼ばれます。

https://help.ubuntu.com/community/KVM/Networking#ユーザーモードネットワーク

これにより、物理ホスト上に NAT が作成され、すべての VM が NAT 経由でネットワークにアクセスできるようになります。VM は、上記のように DHCP アドレスを取得します。

あるいは、ブリッジネットワーク外部ホストがゲスト オペレーティング システム上のサービスに直接アクセスできるようにします。

関連情報