GoでOpenStackを操作する

OpenStackを操作するGoのSDKとして、OpenStackコミュニティ側にGoのSDKがあります。現在は残念ながら開発は止まっているようです。その代わりにRackspaceが開発を行っているGopher CloudがOpenStack用のGoのSDKとして活発に開発が行われています。

http://gophercloud.io/

今回はこのGopher Cloudを利用して、Goを使ってOpenStackの操作を行いたいと思います。

インストール

Goは以下からDownloadしてインストールを行います。主要Platformではインストーラー形式で提供されています。

https://golang.org/dl/

環境変数GOPATH配下にパッケージがインストールされるため、まずは環境変数を設定しておきます。自分で作成するのコードはsrc配下にフォルダ等を作成して配置します。githubアカウントがある場合はgithub.com配下にアカウント名でフォルダを作成するか、github側の自分のレポジトリを作ってgo getしても良いです。その後以下のコマンドでgophercloudのインストールを行います。これにより、$GOPATH/src/github.com/rackspace/gophercloud配下にコードがDownloadされます。

go get github.com/rackspace/gophercloud


認証

“GoでOpenStackを操作する” の続きを読む

広告
GoでOpenStackを操作する

OpenStackの監視をMackerelでやってみる

OpenStackシステムの監視を行いたい場合はZabbix等を利用するのも良いですが、SaaSの監視サービスであるMackerelを利用すると色々面倒な準備を行わずとも監視の開始が出来ます。Mackerelは標準でCPU使用率等の監視を行ってくれるのですが、OpenStackシステムに関連する項目を独自監視を行いたい場合はカスタムメトリックの投稿で簡単に行う事が出来ます。以下カスタムメトリックの投稿の方法が記述されています。

http://help-ja.mackerel.io/entry/advanced/custom-metrics

要約すると以下の3つになります。

  1. メトリックは次の形式でタブ区切りで標準出力。
    {metric name}\t{metric value}\t{epoch seconds}
  2. 名前(metric name)はドット区切りで最後の区切りの名前がグラフの値の表示名となる。最後の区切り前までが同一の場合は同一グラフとして一つのグラフに表示されます。
  3. 環境変数MACKEREL_AGENT_PLUGIN_METAが設定された時にグラフ定義を出力するとグラフの形式を定義出来る(オプション)

このMackerelでカスタムメトリックを投稿したい場合にGoはライブラリが用意されていますが、Python用は特に用意されてないため上記3点を抑えた形で自分で書くことになります。

カスタムメトリックを投稿するコード例

以下OpenStack SDKを利用して特定のプロジェクト内のサーバ数をカウントして投稿する例です。OpenStackへの接続情報はargparseを使って引数として指定出来るようにしてあります。今回はグラフの表示形式の指定は省略しています。

import argparse
import time
from openstack import connection


def main():
    p = argparse.ArgumentParser()
    p.add_argument("-authurl", default="http://localhost:5000/v2.0")
    p.add_argument("-user", default="admin")
    p.add_argument("-password", default="password")
    p.add_argument("-tenant", default="admin")
    args = p.parse_args()
    conn = connection.Connection(auth_url=args.authurl, 
                                 username=args.user,
                                 password=args.password, 
                                 project_name=args.tenant)
    server_list = []
    for server in conn.compute.servers():
        server_list += [server]
    l = map(str, ["openstack.servers", len(server_list), time.time()])
    print "\t".join(l)

if __name__ == '__main__':
    main()

Mackerelの設定

まずサーバーにMackerelのAgentをインストールします。インストール後に上記のようなコードを含んだファイルを例えば/opt/openstack.pyとして保存します。Mackerel Agentの設定ファイルである/etc/mackerel-agent/mackerel-agent.confの最終行辺りに以下を追加します。Mackerel AgentはDefaultで1分毎に指定のcommandを実行して、標準出力から値を取得してくれます。自動で生成されるためグラフの追加等の作業は必要ありません。

[plugin.metrics.openstack]
command = "python /opt/openstack.py -authurl=http://localhost:5000/v2.0 -user="admin" -password=password -tenant=admin"

まとめ

Mackerelを使うと簡単に監視メトリックの追加が可能です。OpenStackに関連した項目であれば、OpenStack SDKを使ってサーバーリストを取得して以下のようにNova等のAPIのレスポンスタイム等の監視も出来ます。

スクリーンショット 2016-01-03 8.41.15

OpenStackの監視をMackerelでやってみる

Unityで作るOpenStackのGUI

これはOpenStack Advent Calender 2015の14日目の記事です。

はじめに

Unityはゲーム開発のPlatformで、Unityを利用すれば2D / 3Dの様々なゲームを簡単に開発出来ます。このUnityを使って、OpenStack GUIを使えば楽しいGUIが開発出来るのでは無いかと思いSilver Weekを利用して実装してみました。元々は山崎さんのスライドに触発されてます。

方針

OpenStackのRest APIを直接呼び出すコードを作成して、実装しています。今回のGUIのテーマですが、色々使い回しの出来て、ITと親和性の高く、国際的にも認知度の高いSushi(寿司)をベースにGUIの開発を行いました。Sushi等の3Dオブジェクトは自身でお絵かきするのでは無く、購入してます。Uniyでは3Dオブジェクトやスクリプト等をAssetと呼びますが、AssetはUnity内のAssetストアから購入可能です。今回は以下を購入 or 無料Downloadして利用してます。

  • Asian Food Heaven
    アジア系の食べ物の3Dオブジェクト集です。寿司等の3D Objectが含まれています
  • Best HTTP
    RESTでOpenStackで接続するために利用。標準のAPIでも良いですがより使い勝手が良いので使ってます

実装の結果

以下ビデオをご覧ください。

寿司がサーバー、巻物がボリューム、寿司台がネットワークとなっています。サーバーとNWは作成すると寿司、寿司台が降ってきます。Flavorによってネタのすrボリュームの作成はUnityらしさを出してあり、簡単なゲームになっています。ボールで巻物をピックアップすると、1個=1Gとなります。ボールが落ちるとそこでゲームオーバーとなり、ピックアップした巻物の数だけボリュームが作成可能です。

検証した接続先

OpenStakcはTrystack / RDO / MetaPodと接続してみて確認しています。それぞれアプリを作って接続した時のちょっとしたTipsです。

  • Trystack
    HTTPで実装されています。OpenStackでよく利用されるPortを利用するため、80番しか通さないインターネット環境から接続すると問題が生じました。
  • Conoha
    HTTPSで443で接続を提供してくれるので比較的に楽に実装出来ましたが、Volumeが200Gか500Gかの作成だったので 残念ながらVolume作成ゲームが使えませんでした。Conoha Document
  • MetaPod
    HTTPSでOpenStackのよく利用されるPort番号が使われてました。残念ながらUnityはHTTPSの接続は443以外は許可出来ないので、ネットワーク接続部分を他のモジュールを置き換えての対処が必要でした。以下BestHTTPのDocumenthttps://docs.google.com/document/d/181l8SggPrVF1qRoPMEwobN_1Fn7NXOu-VtfjE6wvokg/edit#

UnityでのUIの実装について

3D Objectの配置や、ゲームの実装についてはUnityが得意とする所なのでUnityのサイト内のチュートリアルに従えば簡単に実装が可能です。Unityを使ってコーディングして行く中で、注意が必要なのは基本的にC#(必要があればJava Script)のスクリプトを記述します。Scriptは空でも良いのですが、何らかのGame Objectに添付すると実行されます。独特の考え方として、Scriptを新規作成すると以下の空スクリプトが作成されます。シーン起動時にStartが呼ばれ定期的にUpdateが呼ばれます。そこら辺の考え方を理解するとCodingがやりやすくなると思います。

public class SushiParameter : MonoBehaviour {
    // Use this for initialization
    void Start () {
    }
    // Update is called once per frame
    void Update () {
    }
}

また、OpenStackのGUIを作るにはServer名を入れたりするためのUIが必要となります。UnityにはUIクラスが用意されているため、それを利用します。UIは3D Objectと同じく画面上で配置の調整が可能となっています。UIの位置を調整するためには、編集画面の中の2Dボタンを押すと位置調整がやりやすくなります。以下ざっとした動きです。

  • 起動するとログイン画面が表示されます
  • 認証情報を入力するとシーンの切り替えでSushiの画面に遷移します。シーンはUnityの考え方で、ゲームの次のステージへの切り替え等で利用されます。
  • 画面は3Dで作成されており、矢印キーを押すとカメラの位置が移動します。
  • Create Server / Networkを押すと新規作成画面が表示されます。今回はあらかじめ、新規作成画面を非表示で置いてあり、ボタンがクリックされると表示される手法を取っています。
  • Create Volumeを押すとゲームへシーンが切り替わります。キーボードの矢印ボタンで、慣性が与えられます。ボールと巻物の衝突を検知して、Pickup数のカウントを行っています。画面中は物理法則が効いてるので床から落ちると下に落下します。縦軸がマイナスになる所で落下を検知してゲームを終わらせて、確認画面を表示しています。Create VolumeがクリックされるとOpenStackに対してRestの命令を発行しています。
  • 作成後にSushiの元画面に戻ります。戻る時にコードから新しい巻物を生成しています。

まとめ

今回紹介したGUIは売り物では無いですが、Sushi Stackと名づけてOpenStack Summit Tokyoで展示しました。海外のエンジニア受けを狙って作りましたが、見事に刺さりました。すごく気に入ってくれた人は毎日見に来てたので作ったかいが有りました。ちなみに会社として展示してたので会社の上層部にも事前に見てもらったのですが受けが良く色々とUpdateのアイデアも出していただけました。

 

Unityで作るOpenStackのGUI

JenkinsとOpenStack Plugin

Jenkinsはよく用いられるCIツールです。Jenkinsにはビルドやテストを実際に実行するスレーブを自動的に追加して、ビルドを実行する機能が備わっています。Jenkinsは様々なプラグインが揃っているのが特徴で、AWSやOpenStack等のクラウド上にスレーブを追加するプラグインもあります。JenkinsのOpenStackをプラグインを利用すればビルド実行時にスレーブを自動追加する事が可能となります。

Openstack pluginのインストール

Jenkinsの管理 > プラグインの管理でOpenStack Cloud Pluginを検索してインストールします。JCloud PluginをOpenStackに特化させた軽量版です。

https://wiki.jenkins-ci.org/display/JENKINS/Openstack+Cloud+Plugin

OpenStack内のスレーブとJenkinsマスターとの接続

OpenStack上に作成されるインスタンスはJenkinsマスターと接続しますが、その場合の接続方法をSSHかJNLP接続の2種類から選択できます。SSHの場合はインスタンス作成時のKeypairと接続のSSHキーを合わせておくと、起動後にマスター側からインスタンスに対してSSH接続がされ、マスターに接続されます。OpenStackの場合はJenkinsとスレーブが同じNW内にあるか、同一のRouterに接続されたネットワークであればSSHで通信できます。外部NWにJenkinsのマスターが配置されている場合はNAT構成となるためJNLPの機能でスレーブとなるインスタンスからマスターに接続します。今回のOpenStack Cloud Plugin を利用して、OpenStackにスレーブを立てる場合は一般的にはJNLPを使った接続になると思います。 “JenkinsとOpenStack Plugin” の続きを読む

JenkinsとOpenStack Plugin

Nested OpenStack構成

OpenStackの検証をやっていると、OpenStackの上の仮想マシンにOpenStackをインストールして検証を行うと色々削除作成が容易に出来て色々便利です。しかしながら通常だとvirt_type=qemuとなってしまいます。この場合はKVMが使えませんのでVMで作成されたOpenStack上でさらに仮想マシンを立ち上げると著しくパフォーマンスが劣化してしまう場合があります。これを解消するための設定を以下に記述します。注意点としてはパススルーしてしまうので、CPUの差分が吸収でき無くなり、Live Migrationができる機会が減ってしまう事です。

コンピュートノードの設定

コンピュートノード上でカーネルオプションのNestedを有効化します。

CPUがIntelの場合

“Nested OpenStack構成” の続きを読む

Nested OpenStack構成

新しいOpenStackコマンドラインツール

現在OpenStackをCLIで設定する場合は各Project毎のコマンドラインツールを利用します。例えばComputeの操作はnovaコマンドを利用し、Networkの操作はneutronコマンドを利用します。この仕組みはでは、各Projectと機能を暗記しなければなりません。最初私もProject名を暗記出来なくて、何故このような仕組みになっているか理解出来ませんでした。仕組みを理解すれば納得はしますが、記法が各Projectで微妙に異なっていて統一コマンドラインツールが無いのは何かと不便でした。この問題を解消するために統一的なコマンドラインツールのopenstackコマンドが開発されています。今後各Project毎のCLIはDeplicate扱いとなりopenstackコマンドが標準となるようです。最新のkeystoneのCLIを利用した所そのようなメッセージが表示されました。

OpenStackコマンドを利用する

pipで公開されているため、pipでインストール可能です。pipがシステムにインストールされていなければeasy_installでpipをインストールしてください “新しいOpenStackコマンドラインツール” の続きを読む

新しいOpenStackコマンドラインツール

OpenStackとAPIパフォーマンス測定

OpenStackのパフォーマンスを測定を考えると様々な側面での測定があります。ゲストOSのCPU、NW、ストレージのパフォーマンスを測定する場合や、MariaDB / Rabbit MQ / Mongo DBがどの程度の処理を行えるかを測定する場合もあります。あるいはOVSのスイッチング性能や、L3性能の測定もあります。今回はOpenStackがどの程度APIコールを処理出来るかを測定したいと思います。OpenStack側で最大APIコール数のLimitを設けている場合もあるので測定時は注意ください。

APIコールの測定

OpenStackはRESTのAPIを提供していますので、APIコール数を測定したい場合はJMeterで計測する事や、Pythonでスクリプトを組んで測定する事も出来ます。今回はMirantisがメインに開発しているOpenStack用の計測ソフトウェアであるRallyを使ってみたいと思います。 “OpenStackとAPIパフォーマンス測定” の続きを読む

OpenStackとAPIパフォーマンス測定