Author Archive

    はてなブックマーク - Beccoame Ver0.1の話 (Tatsumaki, Sys::Virt)
    このエントリーをはてなブックマークに追加

    平田です。
    先日のFukuoka Perl Workshop #16で話したBeccoameについて、つらつらと。

    資料は英語ですが、喋りは全て日本語でした。

    Beccoame = Bogus elastic computing, like Amazon EC2 or Eucalyptus
    ざっくり訳すると「Amazon EC2やEucalyptusっぽい偽クラウド」。
    Eucalyptusを使っている上で
    ・-n 40とかで大量のインスタンスを一気に起動すると、処理が追いつかずにタイムアウト扱いになってしまう
    ・以前のEC2互換であるため、インスタンスの再起動ができない(停止=インスタンス消滅)
    などなど、ちょっと困ったなーの部分を解消できないもんかと思い。
    簡素化したもので構わないので、勉強ついでに作れないものかと考えたのが実装のきっかけです。
    で、libvirtまわりの調査がてらざっくり組んでみたというお話を。

    EucalyptusとAmazon EC2の関係を簡単に表すと、こうなります。

    これにBeccoameを挟むと、こんな感じです。

    で、今回はTatsumakiを採用しました。
    理由は単純で、僕が勉強がてらTatsumakiを触ってみたかっただけです。

    サーバ環境は以下になります。
    Dell PowerEdge T105
    CPU: Quad-core AMD Opteron 1354
    メモリ: 4GB
    HDD: 250GB 7,200rpm
    # 要するに、Eucalyptus環境の1台を使いまわしています1

    これにUbuntu 10.04 LTS Server(x86_64)をインストール。
    追加でKVMをapt-getでさくっとインストール。
    操作するためのlibvirtもインストールします。

    $ sudo apt-get install kvm libvirt

    libvirtは、Linuxの仮想化ライブラリです。
    いろんな仮想環境に対する操作を行うAPIを提供します。
    付属のvirshを用いれば、いろいろと操作が行えます。

    $ virsh
    virsh にようこそ、仮想化対話式ターミナルです。
     
    入力方法: 'help' コマンドに関するヘルプ
              'quit' 終了します
     
    virsh # help
    コマンド:
     
        help            ヘルプの表示
        attach-device   XML ファイルからデバイスを追加
        attach-disk     ディスク装置の接続
        attach-interface ネットワークインターフェースを接続します
        autostart       ドメインの自動起動
    ...
    (以下略)
    ...
     
    virsh #

    で、libvirtのPerlバインディングがSys::Virtです。
    要は「PerlでKVMなどの仮想環境を操作できる」モジュールです。
    # 他の言語のバインディングについては、公式サイトをご覧ください。
    # PHPバインディングも存在するんですね。。。

    というわけで、必要なCPANモジュール群をインストール。

    $ sudo cpan install Tatsumaki
    $ sudo cpan install Sys::Virt
    ...
    (以下略)
    ...

    で、コードはこんな感じになります。
    # 久しぶりに書いたPerlなもので、いろいろ作法違いなどあってもご容赦ください。。。
    app.psgi

    use strict;
    use warnings;
     
    use Tatsumaki::Application;
    use RunInstancesHandler;
    use TerminateInstancesHandler;
    use DescribeInstancesHandler;
     
     
    package MainHandler;
    use base qw(Tatsumaki::Handler);
     
    sub get {
        my $self = shift;
        $self->write("Work well.\n");
    }
     
    package main;
    use File::Basename;
     
    my $app = Tatsumaki::Application->new([
            '/' => 'MainHandler',
            '/RunInstances' => 'RunInstancesHandler',
            '/TerminateInstances' => 'TerminateInstancesHandler',
            '/DescribeInstances' => 'DescribeInstancesHandler',
            ]);
    return $app;

    RunInstancesHandler.pm

    # run instance handler
    package RunInstancesHandler;
     
    use parent qw(Tatsumaki::Handler);
    use strict;
    use warnings;
     
    use Sys::Virt;
    use XML::Simple;
    use Data::Dumper;
    use String::Random;
    use File::Basename;
    use File::Copy;
    use File::Spec;
     
    sub post {
        my $self = shift;
     
        # create XML::Simple object
        my $xs = new XML::Simple(forcearray => 1, KeyAttr => [], RootName => '');
     
        # receive XML request
        my $xmlRequestRef = $xs->XMLin($self->request->content);
        my $xmlRef = $xs->XMLin($self->request->content);
     
        my $currentDir = dirname(__FILE__);
     
        # image id (default: lucid)
        my $imageId = 'lucid';
     
        # image file name
        my $baseImageFileName = $currentDir . '/images/' . $imageId . '.qcow2';
     
        # base xml file name
        my $baseImageXmlFileName = $currentDir . '/images/xml/' . $imageId . '.xml';
     
        # generate MAC address script path
        my $genMacAddrPath = $currentDir . '/tools/gen_mac_addr.sh';
     
        # instance memory size (default: 121072)
        my $memorySize = '131072';
     
        # Open & read base XML file
        open my $fh, '<', $baseImageXmlFileName or die "Could not open file: $!";
        sysread $fh, my $baseImageXml, -s $fh;
     
        # variables
        my $instanceName, my $uuid, my $macAddress, my $imageFileName, my $imageXmlRef;
     
        # get max instance count from request
        my $maxCount = $xmlRef->{maxCount}->[0];
     
        # connect QEMU
        my $vmm = Sys::Virt->new(address => "qemu:///system");
        my $domain;
     
        my $responseXmlTemplate = $currentDir . '/xml/run_instances_response.xml';
        my $responseItemXmlTemplate = $currentDir . '/xml/item.xml';
     
        # Open & read base XML file
        open $fh, '<', $responseXmlTemplate or die "Could not open file: $!";
        sysread $fh, my $responseXml, -s $fh;
     
        # Open & read item XML file
        open $fh, '<', $responseItemXmlTemplate or die "Could not open file: $!";
        sysread $fh, my $responseItemXml, -s $fh;
     
        my $responseXmlRef = $xs->XMLin($responseXml);
     
        my $itemXmlRef;
        my $domainXmlRef;
     
        # create images
        for (my $i = 0; $i < $maxCount; $i++) {
     
            # generate new instance name
            $instanceName = 'i-' . String::Random->new->randregex('[a-f0-9]{8}');
     
            # generate new UUID
            $uuid = `uuidgen`;
     
            # generate MAC address
            $macAddress = `$genMacAddrPath`;
            chomp($macAddress);
     
            # copy image file
            $imageFileName = File::Spec->rel2abs($currentDir . '/store/' . $instanceName . '.qcow2');
            copy($baseImageFileName, $imageFileName);
     
            # create XML Reference for booting
            $imageXmlRef = $xs->XMLin($baseImageXml);
     
            # change XML values
            $imageXmlRef->{domain}->[0]->{name}->[0] = $instanceName;
            $imageXmlRef->{domain}->[0]->{memory}->[0] = $memorySize;
            $imageXmlRef->{domain}->[0]->{currentMemory}->[0] = $memorySize;
            $imageXmlRef->{domain}->[0]->{uuid}->[0] = $uuid;
            $imageXmlRef->{domain}->[0]->{devices}->[0]->{disk}->[0]->{source}->[0]->{file} = $imageFileName;
            $imageXmlRef->{domain}->[0]->{devices}->[0]->{interface}->[0]->{mac}->[0]->{address} = $macAddress;
     
            $itemXmlRef = $xs->XMLin($responseItemXml);
            $itemXmlRef->{instanceId}->[0] = $instanceName;
            $itemXmlRef->{instanceState}->[0] = 'pending';
            $responseXmlRef->{RunInstancesResponse}->[0]->{item}->[0]->{instancesSet}->[0]->{item}->[$i] = $itemXmlRef;
            $domainXmlRef = '';
     
            # create domain
            $domain = $vmm->create_domain($xs->XMLout($imageXmlRef));
        }
        $self->response->headers([ 'Content-Type' => 'text/xml; charset=utf-8' ]);
        $self->write($xs->XMLout($responseXmlRef));
        $self->finish;
    }
     
    1;

    # DescribeInstancesHandler.pmとTerminateInstancesHandler.pmは略。

    これをplackupで起動し、

    $ plackup &
    [1] 16392
    Twiggy: Accepting connections at http://0.0.0.0:5000/

    起動したサーバに対して、XMLでリクエストを送信します。
    run_instances.pl

    #!/usr/bin/perl -w
     
    use strict;
     
    use LWP::UserAgent;
    use HTTP::Request::Common;
    use File::Basename;
     
    my $userAgent = LWP::UserAgent->new(agent => 'perl post');
     
    my $requestXmlFile = dirname(__FILE__) . '/run_request.xml';
    my $requestUrl = 'http://localhost:5000/RunInstances';
     
    open my $fh, '<', $requestXmlFile or die "Could not open file: $!";
    sysread $fh, my $message, -s $fh;
     
    my $response = $userAgent->request(POST $requestUrl,
            Content_Type => 'text/xml',
            Content => $message);
     
    print $response->error_as_HTML unless $response->is_success;
     
    print $response->as_string;

    リクエストに使用するXMLは、EC2公式のAPIドキュメントのものに合わせています。

    <RunInstances xmlns="http://ec2.amazonaws.com/doc/2010-06-15/">
        <imageId>ami-60a54009</imageId>
        <minCount>1</minCount>
        <maxCount>3</maxCount>
        <keyName>example-key-name</keyName>
        <groupSet/>
        <placement>
            <availabilityZone>us-east-1b</availabilityZone>
        </placement>
        <kernelId>aki-ba3adfd3</kernelId>
        <ramdiskId>ari-badbad00</ramdiskId>
        <blockDeviceMapping>
            <item>
                <virtualName>ami</virtualName>
                <deviceName>sda1</deviceName>
            </item>
            <item>
                <virtualName>root</virtualName>
                <deviceName>/dev/sda1</deviceName>
            </item>
            <item>
                <virtualName>instancestore0</virtualName>
                <deviceName>sdb</deviceName>
            </item>
            <item>
                <virtualName>instance1</virtualName>
                <deviceName>sdc</deviceName>
            </item>
        </blockDeviceMapping>
        <userData version="1.0" encoding="base64">
            <data>"VGhpcyBpcyBiYXNlIDY0IQ==</data>
        </userData>
        <addressingType>public</addressingType>
        <monitoring>enabled</monitoring>
    </RunInstances>

    これを実行すると、

    $ perl run_instances.pl
    HTTP/1.0 200 OK
    Content-Type: text/xml; charset=utf-8
    Client-Date: Wed, 28 Jul 2010 02:56:47 GMT
    Client-Peer: 127.0.0.1:5000
    Client-Response-Num: 1
      <RunInstancesResponse xmlns="http://ec2.amazonaws.com/doc/2006-10-01">
        <groupSet>
          <item>
            <groupId>default</groupId>
          </item>
        </groupSet>
        <instancesSet></instancesSet>
        <item>
          <instancesSet>
            <item>
              <amiLaunchIndex>0</amiLaunchIndex>
              <dnsName></dnsName>
              <imageId>ami-60a54009</imageId>
              <instanceId>i-ea19a11c</instanceId>
              <instanceState>pending</instanceState>
              <keyName>example-key-name</keyName>
            </item>
            <item>
              <amiLaunchIndex>0</amiLaunchIndex>
              <dnsName></dnsName>
              <imageId>ami-60a54009</imageId>
              <instanceId>i-e89ae6b5</instanceId>
              <instanceState>pending</instanceState>
              <keyName>example-key-name</keyName>
            </item>
            <item>
              <amiLaunchIndex>0</amiLaunchIndex>
              <dnsName></dnsName>
              <imageId>ami-60a54009</imageId>
              <instanceId>i-fb30dc5a</instanceId>
              <instanceState>pending</instanceState>
              <keyName>example-key-name</keyName>
            </item>
          </instancesSet>
        </item>
        <ownerId>495219933132</ownerId>
        <reservationId>r-47a5402e</reservationId>
      </RunInstancesResponse>

    といった感じで、起動要求を投げたインスタンスの情報がXMLで返ってきます。
    レスポンスもEC2公式のAPIドキュメントに準拠する形にしています。
    # と言っても、すごく半端な実装です。
    # 起動時はmaxCountしか今のところ見てないですし。
    # 返ってくるXMLも、instanceIdしか書き換えていない状態です。

    実際に起動したかどうかは、virshで確認できます。

    $ virsh list
     Id 名前               状態
    ----------------------------------
     47 i-ea19a11c           実行中
     48 i-e89ae6b5           実行中
     49 i-fb30dc5a           実行中

    無事に起動できているようです。:-)

    と言った感じで、とりあえずここまで。
    次は処理を非同期化したり、エラー処理をきちんと行ったりといったところでしょうか。
    # 実は各インスタンスのIPアドレスを取得するのが、結構面倒だったり2 しますが。
    また、インストールした直後だとNATで構成されているので、これをBridgeに変えたり。
    そもそもの互換性がまだ低いので、勉強しながらちまちまと実装していく予定です。

    個人的な感想としては、
    ・TatsumakiがモダンなPerlを学ぶ上で非常によい教材になる
    ・しばらく仕事でPHPを書いていたので、php-funcref-in-perlが非常に役立った
    といったところです。

    なお今回、弊社の新サービスを用いてプレゼンを行ないました。
    # 終わってみたら、そっちに話を持って行かれて嬉しいやら寂しいやら。
    新サービスついては、おいおい当blogのほうで紹介させていただくと思います。

    1. 直前はCentOS5.5上でEucalyptus NCが動いていました。 []
    2. arpの結果から引っ張るくらいしか思いつかず。いい方法あったら教えてください。。。 []
    • eucalyptus
    はてなブックマーク - Ubuntu 9.10改め10.04でUEC構築
    このエントリーをはてなブックマークに追加

    Fusic 平田です。
    前回の続きを書く前にUbuntu 10.04 LTS(Lucid Lynx)が登場しました。
    また前回「靭帯が切れた」と書きましたが、その後入院など挟みつつ。
    やっとこ復帰して記事を書ける状態になりましたので、10.04での設定などをつらつらと。
    構成は前回と同じですが、せっかくなのでFrontendは32bit機にしてみました。
    ついでついでと言うことで(?)、インストール作業は後輩君に任せてみました。

    インストール時の大きな違いとしては、コントローラ単位での選択式になりました。
    # 9.10の場合はCluster/Nodeの2択でした。
    # ClusterにNode Controller以外の全てがインストールされていたのですが、今回は選択可能です。

    このためStorage Controllerだけ別にするなども可能なので、構成の幅が大きく広がります。
    今回は同様の構成にしています。
    [Frontend] Cluster Controller他1 : 192.168.11.100/24
    [Backend] Node Controller: 192.168.11.101/24

    インストール後、まずは管理画面にアクセスします。
    [Frontend IP]:8443/
    ログイン画面
    まずadmin/passwordでログインし、パスワード設定と管理者メールアドレスを入力。
    管理画面はこんな感じです。
    管理画面

    UECがめっぽう楽な理由の一つ2 が「Store」の項目。
    Store
    Store2
    あらかじめ用意されている起動イメージを1クリックでインストールできます。
    以下が現時点で用意されているイメージの一覧。

    • Ubuntu 9.10 – Karmic Koala (i386)
    • MediaWiki Demo Appliance (i386)
    • Ubuntu 9.10 – Karmic Koala (amd64)
    • M/DB Appliance
    • Ubuntu 10.04 LTS – Lucid Lynx (i386)
    • Ubuntu 10.04 LTS – Lucid Lynx (amd64)

    とりあえず動かしてみたい!という方は是非使ってみてください。

    さて、Eucalyptusの操作は主にコマンド(Euca2ools)を使用して行います。
    というわけでまずは下準備。
    # 以下の流れは、9.10でも10.04でも変わりはありません。

    1. Frontendにsshでログイン
    2. euca_conf –get-credentialsで認証情報を取得

    gintama@gintama-front:~$ sudo euca_conf --get-credentials euca.zip
    [sudo] password for gintama:
    --2010-06-11 10:44:57--  https://localhost:8443/getX509?user=admin&code=dc4sfR3CSYk1V0G3qNvtyP2BL8vx4387zYPWk8K2NVDAz7SL5jkS8k7kDC2sBBMp7hcMES6wMLyJQU8ng1dg
    localhost をDNSに問いあわせています... ::1, 127.0.0.1
    localhost|::1|:8443 に接続しています... 失敗しました: Connection refused.
    localhost|127.0.0.1|:8443 に接続しています... 接続しました。
    警告: localhost の証明書(発行者: `/C=US/ST=CA/L=Santa Barbara/O=db/OU=Eucalyptus/CN=localhost')の検証に失敗しました:
      自己署名証明書です。
    HTTP による接続要求を送信しました、応答を待っています... 200 OK
    長さ: 5052 (4.9K) [application/zip]
    `euca.zip' に保存中
     
    100%[==================================================================================================================================>] 5,052       --.-K/s   時間 0s
     
    2010-06-11 10:44:58 (584 MB/s) - `euca.zip' へ保存完了 [5052/5052]

    3. 解凍してsourceで読み込む3

    gintama@gintama-front:~$ unzip euca.zip
    Archive:  euca.zip
    To setup the environment run: source /path/to/eucarc
      inflating: eucarc
      inflating: cloud-cert.pem
      inflating: jssecacerts
      inflating: euca2-admin-8de7c506-pk.pem
      inflating: euca2-admin-8de7c506-cert.pem

    これでeuca-****なコマンドを使っていろいろ操作できるようになりました。
    主に使うコマンドの説明をしつつ、一気にインスタンス起動まで話を進めます。

    ・euca-describe-availability-zones verbose
    クラスタの状態(起動できるイメージの数など)を表示します。

    gintama@gintama-front:~$ euca-describe-availability-zones verbose
    AVAILABILITYZONE        gintama-front   192.168.11.100
    AVAILABILITYZONE        |- vm types     free / max   cpu   ram  disk
    AVAILABILITYZONE        |- m1.small     0004 / 0004   1    192     2
    AVAILABILITYZONE        |- c1.medium    0004 / 0004   1    256     5
    AVAILABILITYZONE        |- m1.large     0002 / 0002   2    512    10
    AVAILABILITYZONE        |- m1.xlarge    0002 / 0002   2   1024    20
    AVAILABILITYZONE        |- c1.xlarge    0001 / 0001   4   2048    20

    ・euca-describe-images
    登録されている起動イメージの一覧を表示します。

    gintama@gintama-front:~$ euca-describe-images
    IMAGE   emi-E0851072    image-store-1276057589/image.manifest.xml       admin   available       public          x86_64  machine eki-F6F41100    eri-0B6B1169
    IMAGE   eki-F6F41100    image-store-1276057589/kernel.manifest.xml      admin   available       public          x86_64  kernel
    IMAGE   eri-0B6B1169    image-store-1276057589/ramdisk.manifest.xml     admin   available       public          x86_64  ramdisk

    emi-******が起動イメージ、eki-******がkernel、eri-******がramdiskです。
    Amazon EC2のami/aki/ariと同様だと考えていただければ結構です。

    ・euca-bundle-image, euca-upload-image, euca-register
    イメージ登録に使用するコマンド群。
    bundle→upload→registerの流れになります。
    これについてはEucalyptus 日本語 Wikiあたりを参考に。
    今回はStoreからインストールしたイメージを使用するので、この項目は省略します。

    ・euca-add-keypair [keypair_name] > keyfilename
    起動したインスタンスへのログインは、公開鍵認証を用います。
    起動時にkeypair名を指定し、対応した秘密鍵を用いて認証する流れになります。
    この元となるkeypairを作成するコマンドです。
    今回はsilverkeyというkeypairを作成、silverkey.privとして秘密鍵を保存しました。
    ついでにパーミッションも変更しておきます。

    gintama@gintama-front:~$ euca-add-keypair silverkey > silverkey.priv
    gintama@gintama-front:~$ chmod 600 ~/silverkey.priv

    ・euca-add-group, euca-describe-group
    細かい権限の設定はgroupという単位で管理されます。
    groupごとに通信を許可するポートの指定などが行えます。
    初期状態ではdefault groupのみが存在します。

    gintama@gintama-front:~$ euca-describe-groups
    GROUP   admin   default default group

    ・euca-run-instances
    インスタンスの起動を行います。
    必ず指定するのはgroup(-g)、keypair(-k)、image_id(emi-*******)の3つ。
    インスタンスのCPU数・メモリ容量・ディスク容量はtype(-t)で指定します。

    gintama@gintama-front:~$ euca-run-instances -g default -k silverkey -t m1.small emi-E0851072
    RESERVATION     r-3339074D      admin   admin-default
    INSTANCE        i-47D5088C      emi-E0851072    0.0.0.0 0.0.0.0 pending silverkey       0               m1.small        2010-06-11T02:35:00.451Z        gintama-front   eki-F6F41100        eri-0B6B1169

    しばらくしてeuca-descibe-instancesを実行すると、

    gintama@gintama-front:~$ euca-describe-instances
    RESERVATION     r-3339074D      admin   default
    INSTANCE        i-47D5088C      emi-E0851072    192.168.11.201  172.19.1.2      running silverkey       0               m1.small        2010-06-11T02:35:00.451Z        gintama-front       eki-F6F41100    eri-0B6B1169

    となり起動していることが確認できます。

    ・euca-authorize
    group単位でのアクセス許可設定です。
    Firewallの設定だと考えていただければ、分かりやすいかと思われます。
    例えば192.168.11.0/24に対してsshを許可するならこんな感じになります。

    gintama@gintama-front:~$ euca-authorize -P tcp -p 22 -s 192.168.11.0/24 default
    GROUP   default
    PERMISSION      default ALLOWS  tcp     22      22      FROM    CIDR    192.168.11.0/24

    前述の通り、sshでのログイン時は公開鍵認証を行います。
    # Storeに登録されているイメージの場合、ユーザIDはubuntuを使用します。

    gintama@gintama-front:~$ ssh -i silverkey.priv ubuntu@192.168.11.201
    Linux ip-172-19-1-2 2.6.32-21-server #32-Ubuntu SMP Fri Apr 16 09:17:34 UTC 2010 x86_64 GNU/Linux
    Ubuntu 10.04 LTS
     
    Welcome to the Ubuntu Server!
     * Documentation:  http://www.ubuntu.com/server/doc
     
      System information as of Fri Jun 11 02:50:13 UTC 2010
     
      System load: 0.17              Memory usage: 23%   Processes:       64
      Usage of /:  42.7% of 1.36GB   Swap usage:   0%    Users logged in: 0
     
      Graph this data and manage this system at https://landscape.canonical.com/
    ---------------------------------------------------------------------
    At the moment, only the core of the system is installed. To tune the
    system to your needs, you can choose to install one or more
    predefined collections of software by running the following
    command:
     
       sudo tasksel --section server
    ---------------------------------------------------------------------
     
    0 packages can be updated.
    0 updates are security updates.
     
     
    The programs included with the Ubuntu system are free software;
    the exact distribution terms for each program are described in the
    individual files in /usr/share/doc/*/copyright.
     
    Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
    applicable law.
     
    To run a command as administrator (user "root"), use "sudo <command>".
    See "man sudo_root" for details.
     
    ubuntu@ip-172-19-1-2:~$

    起動したインスタンスに無事ログインすることができました。

    だいぶ駆け足でしたが、起動まではこんな感じです。
    インストール作業は基本お任せでやってもらったのですが、何の苦労もなく起動しました。
    もう少し苦戦するだろうと思っていたのですが。。。

    次回は各コマンドの追加説明や、GUIのツールなどについて説明しようと思います。

    1. Cloud Controler, Storage Controller, Warlus []
    2. もう一つはインストーラの手軽さ []
    3. .bashrcであらかじめ読み込むようにしておいたほうが便利です []
    • eucalyptus
    はてなブックマーク - Ubuntu 9.10でUEC構築 ~インストール~
    このエントリーをはてなブックマークに追加

    Fusic 平田です。
    「次回は」と書きつつ間が開きすぎて申し訳ありません。
    靭帯が切れたりしていたということで、ご容赦ください。。。

    というわけで、前回の続きでEucalyptusインストールのお話です。

    マシンとネットワーク

    今回使用するマシンのスペックは以下になります。
    Dell PowerEdge T105
    CPU: Quad-core AMD Opteron 1354
    メモリ: 4GB
    HDD: 250GB 7,200rpm
    CPUがAMD-V対応であることを条件に選定しています。
    これを2台使用し、それぞれFrontendとBackendとして使用します。

    ネットワーク構成としては、前回の記事にあった
    ネットワーク構成図
    の構成で組むことにします。

    IPアドレスはそれぞれ以下の通り。
    [Frontend] Cluster Controller他1 : 192.168.11.100/24
    [Backend] Node Controller: 192.168.11.101/24

    仮想インスタンスには、内部IPとして自動的に1つのIPアドレスが割り当てられます。
    これはインスタンス同士、あるいはEucalyptus内部の通信に用いられます。
    これとは別に、外部からの通信用に別途IPアドレスを割り当てることが可能です。
    この「仮想インスタンスが外部とのやりとりに使用するIP」がPublic IPです。
    今回はPublic IPとして192.168.11.201-220/24を割り当てます。

    インストール

    Ubuntu公式サイトからUbuntu 9.10 serverのISOファイルをダウンロードし、インストールCDを作成します。
    作成したCDから起動すると、
    言語の選択
    言語の選択が表示されるので「日本語」を選択します。

    Ubuntu 9.10 Serverから、インストール項目に
    インストール画面
    「Ubuntu エンタープライズ クラウドをインストール」が追加されているので、これを選択します。

    以降は通常のUbuntuインストール手順ですが、途中いくつか異なる点があります。
    Cluster選択
    ClusterとNode、どちらとしてインストールするかを選択。
    Clusterの場合は「Cluster」を、
    Node選択
    Nodeの場合は「Node」を選択します。

    ここで注意点をひとつ。
    Ubuntuでは全体、もしくはホームディレクトリの暗号化が可能です。
    ただし、暗号化したファイルシステムを使用した場合は起動imageが正常に動作しないので、今回は暗号化しません。2
    ディスクガイド
    ホームディレクトリ暗号化

    Cluster側は、さらにいくつか設定項目があります。

    Cluster名入力
    Cluster名の入力。
    任意のCluster名を入力してください。

    Public IP入力
    Public IPの入力。
    今回は「192.168.11.201-220」と入力しました。

    以上でインストールは完了です。

    なお、前回の記事で仮想化技術に対応していないCPUのマシンをNodeにしようとした場合は
    Nodeインストール時の警告画面
    こんなのが出ると書きましたが、これが出るのはインストールの最後です。
    結構げんなりすること請け合いですので、Node側のマシン選定にはご注意ください。
    ちなみにCluster側は出ません。3

    インストールはこれで完了です。
    設定まで含めようと思ったのですが、長くなったので次回に回します。

    1. Cloud Controler, Storage Controller, Warlusが一緒に入ります。 []
    2. ホームディレクトリ上で作業する事が多かったので、ホームディレクトリも暗号化していません。 []
    3. 試しに余ったマシンにClusterを入れてみたところ、仮想インスタンスの起動までは動作しました。 []