_・)Keep Smiling

モソモソと日々の雑感を書き溜めるというか書き殴るというか書き捨てるというか

OpenStackを支えるLinux技術 〜これから触る人向けの話〜

_・)これは『OpenStack Advent Caledar 2015』9日目の記事です。

東京OpenSolaris勉強会の方角から来ましたツカマンです。 でも今回はLinuxの話です。OpenStack on Solarisな話は@satokazさんにご期待ください(無茶振り)。

はじめに

さて、坊さんも駆けずり回るという師走とやらも1/3が過ぎ去ろうとしていますが皆様におかれましては諸々の進捗はいかがでしょうか。ドキッとした方は色々頑張ってください。

振り返りますと2015年は特に日本におけるOpenStack界隈が大きな盛り上がりを見せた一年だったと思うわけですが、そんな状況の中「そろそろOpenStack触っときたいんだけど何から手をつけるべきかなぁ・・・」という想いを抱いている方も少なくないんではないかと思います。

行動力のある方は仮想環境あたりにさっさとDevStackでもPackStackでも使って構築しちゃえばいいと思うのですが、世の中そんな方ばかりではないというのもまた真実かと思います。

そこで今回は、これからOpenStackを始めたいなーと思っている方向けに「この辺のことを先に知っとくと色々安心だよ?」という内容をお伝えしたいと思います。熟練者の方々には「もう知っとるがな」という話ばかりですが、そこは生暖かく見守ってやってください(そして認識が誤っているところはこっそりご指摘ください)。

さて、そもそもOpenStackとはなんでしょうか?

ってさすがにそれを知らないという方はこの記事を読んじゃいないと思うんですが、簡単に言えばクラウドコンピューティング基盤(特にIaaS)を構築できるオープンソースソフトウェアであります。

これだけ聞くとなんか難しそうに感じるのですが、結局のところはこれまでLinuxエコシステムにおいて磨き上げられてきた技術をPythonによってクラウドコンピューティング基盤としてまとめ上げたもの(かなり乱暴な表現ですが・・・)だったりします。

OpenStackのことを学んでいくのに順番があるわけではないのですが、結局のところ、いつかはLinux側の技術について学ばなければならないフェーズがやってきますので、とっかかりとして先に個々の技術を学んでおくことは決して無駄ではありません。

と、前置きが無駄に長くなりましたが、ここから一気に「先に知っておいて損はないLinuxの技術」を列挙していきたいと思います。数が多いので面食らってしまうかもしれませんが、ひとまずは「どんなものか」という概要を理解しておくだけでも十分です(全てを極めているなんて人はまずいない・・・はずです)。

Linuxの基本的な管理知識

当たり前といえば当たり前ですが、Linuxのことを全く知らないでOpenStackを触るのはかなりキツイです。 インストール、パッケージ管理、ネットワーク設定、基本的なコマンド操作などのスキルや知識はまず身につけておきましょう。

PythonDjango

前述の通り、OpenStackの中身はPythonで出来ています。深く学ぼうとソースコードに手を出す時にはPythonコードとお友達になるしかありません。幸い、Pythonは初めての人でも学びやすいプログラミング言語の1つですので、これを機に学習してみる価値はあるでしょう。

さらにPythonで実装されているWebアプリケーションフレームワークDjangoについても、ついでに概要を調べてみると良いでしょう。DjangoはHorizon(Webのダッシュボードサービス)で利用されています。

また、このHorizonは Apache HTTP Server + WSGI(Web Server Gateway Interface)上で動作します。WSGIはWebサーバ(Apache HTTP Server)とWebフレームワーク(今回はDjango)の接続インタフェースとなるPythonAPIです。この辺りの概要も良かったら調べてみてください。

データベース関連

OpenStackでは様々な情報の格納先としてMySQLMariaDB)を利用します。RDBMSSQLの基礎知識を身につけておくと良いでしょう。少し触る程度であれば特に操作スキルまでは必要としませんが、環境を長く使っていく時などには操作が必要となる場合もあります。

また、最初は使わないかもしれませんが Ceilomater(利用状況などを計測するサービス)ではバックエンドDBとしてMongoDB(NoSQLと呼ばれるものの一つ)の利用を推奨していますので余裕があれば調べてみてください。

あと、少し話が変わりますがKVS(Key Value Store)であるmemcachedも各コンポーネントで利用されていたりするので、どんなもんかなーってのを知っておくとトラブった時などに役立つでしょう。

他にはTroveと呼ばれるDB as a Serviceを提供するコンポーネントが存在しますので、もしも利用する計画がある場合は各種対応データベースについても事前に調べておくとスムーズに導入が進むかもしれません。

メッセージングキュー(AMQP)

OpenStackのコンポーネントでは、プロセス間の情報の受け渡しにメッセージングキューの1つであるAMQP(Advanced Message Queuing Protocol)が広く使われています。AMQPを利用することによってプロセスの負荷分散や冗長化が実現しやすくなります。 現在OpenStackではAMQPの配送を中継するミドルウェアとしてrabbitMQが利用されています。OpenStackの環境構築する際にも、まずは前述のMySQLMariaDB)と合わせてRabbitMQをインストールしたりします。 メッセージングキューの概要と合わせてRabbitMQについても学んでおくと良いでしょう。

ハイパーバイザー/仮想化技術関連

OpenStack上では予め用意されたイメージ(起動ディスクイメージなど)をベースに仮想インスタンスを作成します。この時、やはり事前に定義されたフレーバーを指定することによって仮想インスタンスのリソースサイズなどを指定できるのですが、このあたりの仕組みはサーバ仮想化技術を応用しています。

デフォルトのハイパーバイザーとしてはLinux KVM(Kernel-based Virtual Machine)が利用されます。KVM周りだけでも色々な技術が含まれるので学習は大変ですが、今やOpenStackを抜きにしてもサーバ仮想化の知識が求められる時代ですのでやはり学習しておいて損はないでしょう。

仮想マシンってそもそも何だろうとか、仮想ディスクの形式についてとか、QEMUってなんか昔見た気がするとか考えながら学んでみてください。また、仮想インスタンスの制御にlibvirtと呼ばれるAPIを裏側では利用していますので、この辺りについても合わせて学んでおくと効率が良いでしょう。

その他、共通イメージから個々の仮想インスタンスを作成していくにあたって、どうしても構成などもカスタマイズを行う必要が出てきますが、この部分はcloud-initという仕組みが利用されています。

cloud-initによってSSH公開鍵を仮想インスタンスに埋め込んだり、UserDataという仕組みを通じて仮想インスタンスの起動中に任意のスクリプトを実行させることなどが可能になります。ちなみに、cloud-initはAWS EC2でも利用されています。

ちなみに仮想インスタンスの管理をするコンポーネントはNova、イメージの管理をするコンポーネントはGlanceといいます。以前はNovaに仮想ネットワークの仕組みやブロックストレージの仕組みなども含まれていたんですが、現在は後述するNeutronやCinderにコンポーネントが分割されています。

ネットワーク関連

OpenStackのネットワーク周りは複雑なので学習する際もなかなか苦労する部分です。OpenStackのネットワークコンポーネントとしては現在Neutronが主流ですが、この仕組みを完全に理解するのは非常に大変です。

しかし、複雑ではあるもののNeutronは重要なコンポーネントですので、すでに世の中には良質な解説記事やスライドなどが数多くリリースされています。このような資料を探してみて読んでみてると良いでしょう(個人的には元木さん中井さんSlideShareや@ITの吉本さんの連載が良いと思います)。

今回は前提の知識の話なのでNeutronそのものの話は置いといて、中で使われている主要な技術や仕組みに注目します。 ざっと列挙するとこんな感じです。

  • Linux Namespace
    • Linuxカーネルが実装しているリソースを仮想的に分割する機能です。同一部物理ホスト上でもプロセスが認識している名前空間が異なる場合は別々の独立したネットワークとして扱われますので、テナント毎の仮想ネットワークを分割するのに利用されています。この場合、例えば各テナント内で同じIPアドレスが利用できたりします。
  • Open vSwitchとLinux Bridge
    • いわゆる仮想スイッチとして仮想ネットワーク内で各デバイスを接続します。Linux Bridgeに比べてOpen vSwitchの方が高機能ですが、セキュリティグループのためのiptablesルールを適用できるのがLinux Bridgeだけなので、この2つを併用しながら仮想ネットワークを構成します。
  • iptablesLinux IP Forwarding
    • iptablesは前述のセキュリティグループのルール適用のほか、仮想インスタンスにフローティングIPを適用させるためのNAT処理なども担当しています。地味に重要です。また、IP Forwrdingの機能と合わせて仮想ルータの機能を提供します。この仮想ルータを経由しテナント内ネットワークと外部ネットワークとで通信が可能となります。前述のLinux Namespaceにより仮想ルータ用の名前空間が用意されます。
  • dnsmasq
  • VLAN, GRE, VXLAN
    • VLAN、GRE、VXLANはマルチノード構成を取っている場合に、各テナントネットワークを分割するために利用されていたりします。これらのテクノロジーの概要を学ぶことでノード間通信の仕組みについて理解が深まるでしょう。また、VLANについては例えば管理ネットワークを分割するのに使うこともあるのでvconfigコマンドと合わせて、LinuxでのVLANインターフェースの操作を抑えておくと良いと思います。
  • HAProxy
    • NeutronにはLBaaS(Load Balancer as a Service)の仕組みが用意されていますが、そこで使われるのがHAProxyです。冗長構成された仮想インスタンスの死活管理をしたり負荷分散をするのに利用されます。LBaaSを使う計画があるのならば、まずHAProxyを学習しておくと良いでしょう。

ストレージ関連

OpenStackのコンポーネントでストレージといえば、ブロックストレージを提供するCinderとオブジェクトストレージを提供するSwiftがあります(最近はManilaと呼ばれる共有ファイルサービスのコンポーネントも登場しています)。

ブロックストレージについては仮想的なディスクと捉えればいいので理解しやすいのですが、オブジェクトストレージに馴染みがないと理解に戸惑ってしまうかもしれないので、まずはオブジェクトストレージが何かという話を抑えておくとよいでしょう。特にSwiftはNovaと並んでOpenStackの開発当初から存在するコンポーネントですので、歴史的な流れを学習しつつ概要を抑えていくと良いと思います。

CinderではデフォルトのバックエンドストレージとしてLVM(Logical Volume Manager)が利用されます。最近のLinuxでは標準的に使われるようになってきたLVMですが、仕組みや各種操作コマンドを今一度確認しておくと良いでしょう。

また、このLVM上で用意されたブロックボリュームに仮想インスタンスから接続する場合はiSCSIプロトコルが利用されます。iSCSIがどのような仕組みのものなのか、またLinuxiSCSIターゲットとするのに利用されるtgtdについても調べてみてください。

OpenStackの各コンポーネントでは、ドライバを入れ替えることによって利用する仕組みを変更することが可能ですが、Cinderもドライバを変更することでバックエンドストレージをLVM以外のものに置き換えることができます。特に本番環境などではCephと呼ばれる分散ストレージ技術を利用するケースが多いので、余裕があれば(そろそろねぇよ!って言われそう・・・)、Cephについても概要を調べてみてください。

RESTful API

ここまで主要なOpenStackコンポーネントの名前をいろいろと挙げてきましたが、これらのコンポーネント間のやりとりはそれぞれのコンポーネントに用意されたAPIを介して行われます。このAPIは、RESTful APIとして実装されており、HTTPをベースとしたアクセス(URL/URIでリソースを指定し、HTTPのメソッドで操作を行い、結果をJSONXMLHTTPステータスコードで受け取る)を可能とします。 OpenStackの管理の中ではAPIについての理解も重要ですので仕組みについて学んでおくと良いでしょう。

このRESTful APIや前述のメッセージキューなどを用いることで、OpenStackは疎結合(ゆるいつながり)という特徴を有します。必要なコンポーネントだけを選択して柔軟に組みあせて利用することができるのも、この疎結合という特徴のおかげですね。

その他の技術とまとめ

OpenStackは今や広範囲に及ぶコンポーネント(プロジェクト)を抱える超巨大オープンソースソフトウェアですので、紹介しようとおもっても正直キリが有りません。新しいコンポーネントもどんどん出てきますので、あとは必要に応じて新しい知識を身に着けていくしかない気もします。

例えば、コンテナ技術Dockerに対応したコンテナオーケストレーションコンポーネントであるMagnumなんかは注目度も高かったりすると思うんですが、やはり仕組みを理解する前提としてコンテナとは何か、Dockerとは何かということを知るべきでしょう。

この辺りは終わりがないといえば終わりがないのですが、あくまでも新しいコンポーネントなどは選択肢のひとつとして用意されているものでもありますので、無理してすべてを習得しなくとも必要なコンポーネントの理解から深めていければ十分でしょう。

と、気づけば妙に長い投稿になってしまいましたが、当記事を年末の忙しい時期の現実逃避にでもお役立て頂ければ幸いです。進捗どうですか?