2013年12月17日火曜日

コマンドラインからだけで OpenVNet の機能を推測してみる

Wakame Advent Calendar http://atnd.org/events/45749 を機会に wakame-vdc から分離された? OpenVNet を触ってみようと思います。機能を知るには API を見るのが一番なので、まずは動かす前に API を見てみます。 API は https://github.com/axsh/openvnet/wiki/WebAPI-Reference にあるということですが、最新版ではないかも?という噂を聞いたので、今回は CLI の vnctl のコマンドラインから機能を推測してみることにします(きちんと更新されているようでしたらごめんなさい)。実際に動かしてみるのは明日以降にします。

CLI のインストール


Advent Calendar 2日目のエンジニアじゃないけど仮想ネットワークOSSのOpenVNetをサクっとインストールしとく。 #wakameug を参考にインストールしてみます。

用意した環境はインストールガイドと微妙に違いますが、CentOS 6.5 に入れました。
# vi /etc/yum.repos.d/openvnet.repo
[openvnet]
name=OpenVNet
baseurl=http://dlc.openvnet.axsh.jp/packages/rhel/6/vnet/current/
enabled=1
gpgcheck=0
# vi /etc/yum.repos.d/openvnet-third-party.repo
[openvnet-third-party]
name=OpenVNet Third Party
baseurl=http://dlc.openvnet.axsh.jp/packages/rhel/6/third_party/current/
enabled=1
gpgcheck=0
# rpm -Uvh http://dlc.wakame.axsh.jp.s3-website-us-east-1.amazonaws.com/epel-release
# yum install -y wakame-vnet

今日は実際のデーモンは起動しないので、CLI が使える環境を設定だけ。

# export PATH=/opt/axsh/wakame-vnet/ruby/bin:/opt/axsh/wakame-vnet/vnctl/bin:$PATH
# which vnctl
/opt/axsh/wakame-vnet/vnctl/bin/vnctl
# which ruby
/opt/axsh/wakame-vnet/ruby/bin/ruby
# ruby --version
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]
# vnctl
/opt/axsh/wakame-vnet/vnctl/bin/vnctl:8:in `<main>': undefined method `setup' for Bundler:Module (NoMethodError)

vnctl と ruby が入っている場所に PATH を通してみたのですが、vnctl がうまく動きません。 Ruby の bundler の設定が必要なようです。 Ruby の bundler 初心者の僕にはよく分かりません。検索してみると、 bundler は Gemfile.lock というファイルが場所で bundle exec でファイルを実行するといいみたいです。 /etc/init/vnctl.conf でもそうなっているので、チャレンジしてみます。

# cd /opt/axsh/wakame-vnet/vnctl/
# which bundle
/opt/axsh/wakame-vnet/ruby/bin/bundle
# bundle exec ./bin/vnctl
Could not find fuguta-1.0.2 in any of the sources
Run `bundle install` to install missing gems.

まだダメです。言われたとおりに bundle install を実行してみます。

# bundle install
Fetching gem metadata from http://rubygems.org/.......
Fetching gem metadata from http://rubygems.org/..
Installing fuguta (1.0.2)
Installing multi_json (1.8.0)
Installing multi_xml (0.5.5)
Installing httparty (0.11.0)
Installing thor (0.18.1)
Using bundler (1.3.5)
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.
Post-install message from httparty:
When you HTTParty, you must party hard!
# vnctl
Commands:
  vnctl datapath         # Operations for datapaths.
  vnctl help [COMMAND]   # Describe available commands or one specific command
  vnctl interface        # Operations for interfaces.
  vnctl ip_address       # Operations for ip addresses.
  vnctl ip_lease         # Operations for ip leases.
  vnctl mac_lease        # Operations for mac leases.
  vnctl network          # Operations for networks.
  vnctl network_service  # Operations for network services.
  vnctl route            # Operations for routes.
  vnctl route_link       # Operations for route links.
  vnctl security_group   # Operations for security groups.
# vnctl
/opt/axsh/wakame-vnet/vnctl/bin/vnctl:8:in `<main>': undefined method `setup' for Bundler:Module (NoMethodError)

今度はきちんと動きました。ただし、/opt/axsh/wakeme-vnet/vnctl 以下で vnctl を実行する必要があるようです。何はともあれ vnctl が動いたので、やっと今日の目的に進めます。

RPM だけでだめなのはそういうものなのでしょうか? 誰か教えてください。

CLI の使い方を探る

さて CLI のコマンドとオプションを探ってみます。 今日のポリシーとしてコードは読みません。

vnctl help [COMMAND] というヘルプを実行したのですが、情報量 0 です。
面倒なので、help をつけないで実行してみると、サブコマンドが出てきました (^^
この先もかなり探検が必要なようです。

# vnctl help datapath
Usage:
  vnctl datapath

Operations for datapaths.
# vnctl datapath
Commands:
  vnctl datapath add [OPTIONS] --display-name=DISPLAY_NAME --dpid=DPID --node-id=NODE_ID  # Creates a new datapath.
  vnctl datapath del UUID(S)                                                              # Deletes one or more datapath(s) separated by a space.
  vnctl datapath help [COMMAND]                                                           # Describe subcommands or one specific subcommand
  vnctl datapath modify UUID [OPTIONS]                                                    # Modify a datapath.
  vnctl datapath networks OPTIONS                                                         # subcommand to manage networks in this datapath.
  vnctl datapath route_links OPTIONS                                                      # subcommand to manage route_links in this datapath.
  vnctl datapath show [UUID(S)]                                                           # Shows all or a specific set of datapath(s).

この次は、サブコマンドのオプションも知りたいところです。いろいろなところに help–help を入れてみたところ、サブコマンド名の直前に help をつけると、詳しいオプションが出ることが分かりました。上に表示されているヘルプをちゃんと見ると書いてありました。ゴメンナサイ、あまり直観的ではないですね。

# vnctl datapath add
No value provided for required options '--display-name', '--node-id', '--dpid'
# vnctl datapath add help
No value provided for required options '--display-name', '--node-id', '--dpid'
# vnctl datapath help add
Usage:
  vnctl add [OPTIONS] --display-name=DISPLAY_NAME --dpid=DPID --node-id=NODE_ID

Options:
  [--uuid=UUID]                    # Unique UUID for the datapath.
  --display-name=DISPLAY_NAME      # Human readable display name.
  [--is-connected]                 # Flag that detemines if the datapath is connected or not.
  [--dc-segment-id=DC_SEGMENT_ID]  # The datapath's dc segment id.
  --node-id=NODE_ID                # The node id for the datapath.
  [--ipv4-address=IPV4_ADDRESS]    # Ipv4 address for the datapath.
  --dpid=DPID                      # Hexadecimal id for the datapath.

Creates a new datapath.

API 体系を分析してみる

vnctl datapath help add のようなリソース作成コマンドのヘルプを順に実行して、リソース間を探ってみました。
矢印は、リソース作成時に指定するパラメータの関係を指しています。矢印の行先が指定されている方のパラメータです。



これを元に機能を推測してみます。

datapath
最初に作成するリソースのようです。 datapath ID と Node ID を指定することから、VM が起動するホストの OVS を表しているみたいです。
network
論理ネットワークを指すリソースのようです。論理 L2 とそのうえで動作する IPv4 サブネットがひとまとめで管理されています。
network を datapath に関連付けする際に broadcast MAC address を指定するところが特徴的に見えます。
network-mode というパラメータがあり、physical/virtual という指定ができるので、物理ネットワークの定義と仮想ネットワークの定義の両方に使用するのでしょうか。
IP address
network で使用する IP アドレスを登録するように見えます。
interface
interface は VM などが接続される endpoint に対応していると推測しました。
どうやって OVS の各ポートを識別するのかが気になります。
MAC アドレスが必須パラメータで、属性として network ID や datapath ID を指定できることから、OVS のポートに対応していて、MAC アドレスベースでネットワークを判定しているのかなと感じました。
IP lease
interface に IP Address を割り当てたり、現在の割り当て状況を管理するのに使っているようです。
なぜ network ID が IP Lease のパラメータにあるのかわかりませんでした。 interface はネットワークとは独立に存在できて、 IP Lease を変更すると、別のネットワークにもつなぎ直せるのかな?
network service
interface に接続された VM などがどんな L4 ポート番号を使用しているかを指定することで、その interface に接続されたネットワークサービスを表現しているようです。
route_link と route
経路情報があることからルーター機能に関するものであることは分かりますが、具体的にどのように使うかまでは分かりませんでした。

まとめ

おおざっぱに機能を推測してみました。ソースも読んでいませんし、実際にも動かしていないので、完全にはずしているかもしれません。

OpenStack Neutron や Amazon VPC のモデルとはだいぶ違いますね。 もう少し詳しく見てどういう思想で設計されているのかを知りたいと思います。

リソースモデルや CLI だけだとなかなか具体的なイメージが湧きませんね。 仮想ネットワーク作成例とコマンドラインシーケンスがあると分かりやすいなあと思いました。

明日も記事を書く予定ですが、実際に動かしてみようと思います。 VM を起動するのは面倒なので、network namespace を使って論理ネットワークの動作を見てみたいと思います。