Rancher コンテナのオーケストレーション
実践

【技業LOG】技術者が紹介するNTTPCのテクノロジー

2017.08.10
その他
堀田 祥一

サーバー / ソフトウェアエンジニア
堀田 祥一

技業LOG

はじめに

今回は、Rancherというソフトウェアを使いDockerコンテナでシステムを作成してみました。
RancherとDockerの紹介については以下にありますので参照ください。

  • WebARENA -backstate- :: 「Docker(ドッカー)」とは
    https://blog.arena.ne.jp/vps/235
  • WebARENA -backstate- :: Rancherとは
    https://blog.arena.ne.jp/vps/602
  • WebARENA -backstate- :: Dockerコンテナ管理ソフトRancherをVPSにインストールする
    https://blog.arena.ne.jp/vps/1121

最近では、コンテナやマイクロサービスという言葉をよく聞くようになってきました。
有名なところでは、クックパッド[※1]やAbemaTV[※2]等でも導入があるようです。

用語の範囲を明確にすると、マイクロサービスは、システムを構築するためのソフトウェアエンジニアリング的な考え方でありコンテナは、システムを実装する方式の一つです。
マイクロサービスとコンテナの特長と関係をひらたくまとめると次のようになります。
マイクロサービスの世界では、ソフトウェアの主な機能がそれぞれコンポーネント化されAPIを使い公開します。
それぞれのコンポーネントは、サービスとして必要な機能を備えており独自に自律的な状態管理を行います。
一方でコンテナは、ホストサーバーのOSのカーネルと同じものを使いますが仮想化というカプセル化を行うので提供する機能を作成するコードは、ホストに同居するほかのコードに干渉しにくくなっておりそれぞれが自律的に存在します。
他にも要因はあるようですが、このようなことがマイクロサービス的なソフトウェアの構築に用いられやすくなっているようです。
マイクロサービス的に複数のホストサーバーをまたがってたくさんのDockerコンテナを使いシステムを構築する場合、「どこにサービスを提供するコンテナがあるのか」、また「必要なときに該当するサービスを提供するコンテナが起動しているかどうか」など統合的なコンテナ管理を少し楽にする仕組みが必要になります。
それらをオーケストレーションといいます。[※3 ※4 ※5]

Dockerコンテナを使う際のオーケストレーションとして「Kubernetes」「Mesos」 「Docker Swarm」 等が有名でありこれらは、Rancherでも利用可能ですがRancher には、独自のオーケストレーション機能である「Cattle」があります。

今回は、Cassandra Clusterの作成を通してこの「Cattle」を試してみました。

Rancherのインストール

Rancher

♢今回は以下のようなホストサーバーの構成で作成しました。

ホストサーバー名: RancherServer, Host1, Host2, Host3

ホストサーバー構成図

<図1>

利用バージョン:

Linuxサーバー     centos7.3
Docker            1.12.6
Rancher server    1.5.6
        agent     1.2.2

DockerとRancherのバージョンについては、Rancherにてサポートされているものの対応表が以下にあるので確認が必要です。
https://docs.rancher.com/rancher/v1.6/en/hosts/#supported-docker-versions

Dockerのインストールはこのサイトにある以下を実行しました。


# curl https://releases.rancher.com/install-docker/1.12.sh | sh

Dockerの操作については以下を参照ください。

WebARENA -backstate-  Docker(ドッカー)実践編(1)
https://blog.arena.ne.jp/vps/419

♢Rancherサーバーのインストール

Rancherサーバーのインストールは、「RancherServer」のホストにログインして以下のコマンドでインストールします。


# docker run -d --restart=unless-stopped -p 8080:8080 rancher/server:v1.5.6

インストールに成功すると以下のようになります。


[root@RancherServer /]#
[root@RancherServer /]# docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                              NAMES
5fc4c9d5629a        rancher/server:v1.5.6   "/usr/bin/entry /usr/"   10 seconds ago      Up 8 seconds        3306/tcp, 0.0.0.0:8080->8080/tcp   nauseous_fermi
[root@RancherServer /]#

♢RancherServerへのログイン

ブラウザで以下URLへログインします。
http:// <サーバーのIPアドレス> :8080

正しく起動できると以下のような画面が起動します。

<図2> RancherServerへのログイン

<図2>

♢ Hostサーバーの取り込み

RancherServerの中で以下の操作をしてホストサーバーを管理対象として追加します。

  1. 「INFRACTURE」⇒ 「Hosts」の順にクリックします。
  2. 「Add Host」をクリックします。最初は、HostResigration URLの画面が出ますが「Save」をクリックして次の画面に移動します。
  3. 「Hosts: Add Host」の画面で以下の赤線枠で囲んだ部分の文字列をコピーします。コピーは、赤線枠の右隣のボタンをクリックで完了します。
    <図3> Hostサーバーの取り込み 手順3

    <図3>

  4. 該当するホストにコマンドラインでログインして3.の内容を貼り付けます。今回はホスト名 Host1, Host2, Host3のサーバーです。
  5. RancherサーバーのWeb GUIで 1.の操作をして待っていると以下のようになりRancherサーバーの管理下に置かれたことがわかります。
    <図4> Hostサーバーの取り込み 手順5

    <図4>

♢Hostラベル取り付け

今回は、各ホスト毎に起動するコンテナの起動を操作したいのでHost ラベルを使ってみます。
ホスト毎に次の内容をHostラベルとして、追加で設定します。

Hostラベル表
ホスト名 key value
Host1 hostname cassandra1
Host2 hostname cassandra2
Host3 hostname cassandra3

作業は以下で実行できます。

  1. 各ホストサーバーの右上をクリックして「Edit」を選択します。

    <図5> Hostラベル取り付け 手順1

    <図5>

  2. 図の赤枠で囲まれた「Labels」で「Add Label」をクリックして入力フィールドを追加してHostラベル表に指定した値を入れます。

    • 図では、Host1での記入です。
    <図6> Hostラベル取り付け 手順2

    <図6>

1. , 2. を各ホストサーバーについて実施します。すべて終わると以下のようになります。

<図7> Hostラベル取り付け

<図7>

以上でRancherの設定は終わりです

Dockerコンテナイメージ

次に構築したRancherシステムに何か入れてみたいと思います。
今回は、前回ご紹介しましたCassandraのDocker版がホストサーバー3台にまたがってクラスターを組んでいる環境を作成します。

CassandraのDockerイメージはDocker Hubにあるものを利用します。
https://hub.docker.com/_/cassandra/

ここでは、このDockerコンテナのイメージファイルをDocker単体で利用するときにどのように使えるのか等の確認をします。

♢データディレクトリ:

コンテナの中ですが、/var/lib/cassandra 以下がCassandraのデータが入る領域なので今回は、ここをホストサーバーの共有ディレクトリに接続してデータはコンテナが変わっても残るように構築します。

♢起動方法:

起動するには次のフォーマットで実行すると作成されます。

docker run --name <コンテナ名> -d cassandra:<tag> ※tagでバージョン名を指定できます。

例)
同じホストで次の条件で3つCassandraコンテナを起動してクラスターを組む場合Dockerコマンドは以下のようになります

条件:
ホスト名 cdb1, cdb2, cdb3
SeedNodeの指定 cdb1を1台目のサーバーとします。
※cdb1のIPアドレスが10.42.0.48の場合
Cassandraのバージョン v3.9

Dockerコマンド:


1台目    docker run --name cdb1 -d cassandra:3.9
2台目    docker run --name cdb2 -d  -e CASSANDRA_SEEDS=10.42.0.48 cassandra:3.9
3台目    docker run --name cdb3 -d  -e CASSANDRA_SEEDS=10.42.0.48 cassandra:3.9

その他ホストサーバーのリソースと接続するdocker run のオプション

共有ディレクトリ

コンテナ内のデータディレクトリをホストサーバーの共有ディレクトリに保存する場合

-v /cassandra/data/:/var/lib/cassandra/
コンテナの/var/lib/cassandraディレクトリをホストの/cassandra/dataに接続します。

Rancher Cattleで作成

今回利用するコンテナのdocker run での利用方法がわかったところでいよいよRancher Cattleを利用し次の条件で動作するように作成します。

  1. コンテナ内のディレクトリをホストの共有ディレクトリに保存するコンテナをBusyBoxで作成します。
    コンテナディレクトリ /var/lib/cassandra
    ホストディレクトリ  /cassandra/data
  2. BusyBoxコンテナのボリュームをCassandraのコンテナにマウントします。
  3. Cassandraのコンテナは3つ作成しそれぞれ以下のホスト名と起動するホストサーバーの配置とします。
    Cassanraコンテナ名 ホストサーバー配置 Seed_node BusyBox コンテナ名
    cdb1 Host1 Seed_nodeとして作成 data1
    cdb2 Host2 cdb1を指定 data2
    cdb3 Host3 cdb1を指定 data3
  4. cdb1のIPアドレスを10.42.0.48で指定して作成します。
  5. コンテナアップデート時(Upgrade利用)にIPアドレスが変わらないようにします。

構成後の概要図は以下のようになります。

<図8> 構成後の概要図

<図8>

Stackの作成

コンテナの集合体であるサービスが起動する領域を作成します。

  1. RancherサーバーのWeb画面より「STACKS」⇒「User」の順番にクリックします。
  2. 「UserStacks」の画面で「Add Stack」をクリックします。
  3. 「Add Stack」の画面で「Name」「Description」に図の通りいれて「Create」ボタンをクリックします。
<図9> Stackの作成

<図9>

サービスの作成

いよいよCassandraのサービスを作成します。
Rancher Cattleでは、「サービス」とは一つの機能を提供するまとまりという位置づけでその実体は、複数のコンテナにより構成されます。そのため、CassandraとBusyBoxのコンテナがsidekickで結ばれた状態のサービスを作成します。これをCassandraサービスとして起動します。
今回は 3つCassandraサーバーが起動するため、最終的に3つサービスが各ホストに一つづつ出来上がります。

♢一つ目のサービス作成:

  1. Stack作成後に表示される画面で「Add Service」ボタンをクリックします。
  2. 図の赤枠のとおり上半分と下半分があるので、まずは上半分を記入します。
    <図10-1> 一つ目のサービス作成

    <図10-1>

    • ②-1 Cassandraコンテナの設定: 次の図のとおり設定します。
      <図10-2> Cassandraコンテナの設定

      <図10-2>

    • ②-2 BusyBoxコンテナの設定: 次の図のとおり設定します。
      <図10-3> BusyBoxコンテナの設定

      <図10-3>

  3. 次に下半分を記入します。
    • ③-1 Cassandraコンテナの設定:
      「Volumes」「Networking」「Scheduling」のタブで次の図のとおり設定します。その他では設定していません。
      <図10-4> Cassandraコンテナの設定

      <図10-4>

      記入がおわったら、②-1でBusyBoxコンテナ用に記入で作成した場所に表示のある「data1」をクリックしてBusyBox用コンテナの設定をつづけます。

    • ③-2 BusyBoxコンテナの設定:
      「Volumes」「Scheduling」のタブで次の図のとおり設定します。
      <図10-5> BusyBoxコンテナの設定

      <図10-5>

  4. 「Create」をクリックすると一つ目のCassandraサービスが作成されます。

♢二つ目以降のサービス作成:

2つ目以降も一つ目と同じようにCassandraとBusyBoxのコンテナをsidekickを使い作成しますがCassandraコンテナ作成の設定時に<図10-1>の下半分の設定は次のようにします。

設定するタブは「Command」「Volumes」「Networking」「Scheduling」です。
「Volumes」「Scheduling」タブの登録は一つ目のCassandra作成と同じです。
「Command」「Networking」タブは図のとおり作成します。

<図10-6> 二つ目以降のサービス作成

<図10-6>

以上で作成完了です。3つサービスが上がると次のようになります。

  • RancherサーバーのWeb画面で「INFRACTURE」⇒「HOSTS」の選択で表示
<図11> 3つサービスが上がった際の画面

<図11>

動作の確認

nodetool status で3台認識されたか確認します。

次のようにCassandraサービスのボタンをクリックするとメニューが表示されるので「Execute Shell」をクリックしてCassandraサーバーのコンテナにログインします。

<図12> 動作の確認

<図12>

nodetool status で3台認識されているのがわかります。

<図13>

<図13>

ホストのディレクトリとコンテナ内のdataディレクトリが共有されたことを確認します。
代表で Host3に入っているcdb3のサービスについて確認します。

cdb3コンテナは次のとおりです

<図14> cdb3コンテナ

<図14>

ホストは以下の通りです:


[root@Host3 ~]# ls -l /cassandra/data/data/
total 16
drwxr-xr-x 26 polkitd ssh_keys 4096 Jun 20 16:59 system
drwxr-xr-x  6 polkitd ssh_keys 4096 Jun 20 16:59 system_auth
drwxr-xr-x  5 polkitd ssh_keys 4096 Jun 20 16:59 system_distributed
drwxr-xr-x 12 polkitd ssh_keys 4096 Jun 20 16:59 system_schema
drwxr-xr-x  4 polkitd ssh_keys  100 Jun 20 16:59 system_traces
[root@Host3 ~]#

コンテナ内のディレクトリがホスト接続されて置かれていることがわかります。

Upgradeでバージョンアップ

UpgradeでCassandraをバージョン3.10にバージョンアップします。
Upgradeのタイミングでコンテナの9042番ポートをホストサーバーの9042番ポートと紐づけます。

最初にstackの画面でサービス毎に「Upgrade」ボタンをクリックします。

<図15> Upgradeでバージョンアップ 手順1

<図15>

次に図のとおり記入します。

<図16> Upgradeでバージョンアップ 手順2

<図16>

投入が終わったら 「Upgrade」ボタンをクリックします。Upgradeがおわったら次のような画面になります。

<図17> Upgradeでバージョンアップ 手順3

<図17>

ここでサービス名をクリックするとサービスの詳細な画面になります

<図18> Upgradeでバージョンアップ 手順4

<図18>

Upgrade前まで起動していたCassandra バージョン3.9のコンテナはロールバック用に停止して新しくCassandra バージョン3.10のコンテナが起動しているのがわかります。
IPアドレスは新旧どちらも同じでかわらないことがわかります。

さらに右上のほうにある「?」印をクリックするとUpgrade前まで起動していたコンテナは廃棄されUpgradeは完了するのですが、「?」印の右をクリックして「Rollback」をクリックするとUpgrade後のコンテナはなくなりUpgrade前のコンテナを起動してUpgrade前の状態にもどりますが今回は「?」印をクリックでUpgradeを終了します。
終了後は次の図のようになります。

<図19> Upgrade終了後の画面

<図19>

同じように残り2つのサービスについてもUpgradeを実施します。最終的には次の図のようになります。

<図20> Upgrade実施後の画面

<図20>

データ投入

「testdata」というkeyspaceに次のようなデータをいれてみました。

Weather
Number City Status Temperature
1 Sapporo Cloudy 17
2 Tokyo Sunny 22
3 Osaka Sunny 23
4 Hakata Rain 22
5 Naha Rain 27

ホストサーバーのポートにつながっているのでホスト側から操作します。


cqlsh>
cqlsh> CREATE KEYSPACE testdata WITH REPLICATION = {'class' : 'SimpleStrategy', 'replication_factor': 3};
cqlsh>
cqlsh> CREATE TABLE testdata.weather (num int PRIMARY KEY, city text, status text, temperature int);
cqlsh>
cqlsh> INSERT INTO testdata.weather (num, city, status, temperature) VALUES (1, 'Sapporo', 'cloudy', 17);
cqlsh> INSERT INTO testdata.weather (num, city, status, temperature) VALUES (2, 'Tokyo', 'sunny', 22);
cqlsh> INSERT INTO testdata.weather (num, city, status, temperature) VALUES (3, 'Osaka', 'sunny', 23);
cqlsh> INSERT INTO testdata.weather (num, city, status, temperature) VALUES (4, 'Hakata', 'rain', 22);
cqlsh> INSERT INTO testdata.weather (num, city, status, temperature) VALUES (5, 'Naha', 'rain', 27);
cqlsh>

♢データの状態を確認します。


cqlsh> select * from testdata.weather;


 num | city    | status | temperature
-----+---------+--------+-------------
	 5 |    Naha |   rain |         27
	 1 | Sapporo | cloudy |         17
	 2 |   Tokyo |  sunny |         22
	 4 |  Hakata |   rain |         22
	 3 |   Osaka |  sunny |         23
(5 rows)
cqlsh>

Composeファイル

ここまでRancherのGUI機能を使いシステム構築してきました。
Docker ComposeとRancher Composeのファイルを使うと一度に作成することができます。
Composeファイルには、Dockerの仕組みやRancherでのオーケストレーションのルールをスクリプトベースで書き込みます。書き方を知っていれば、そのまま書いても大丈夫ですがGUI機能を使って構築するとRancherがDocker ComposeとRancher Composeファイルを自動的に生成してくれます。

♢Composeファイルの確認

RancherServerのGUIから 「STACKS」→「User」の順にクリックして目的のStackに入ります。
図のように「Compose YAML」のボタンをクリックします。

<図21> Composeファイルの確認

<図21>

Composeファイルを見ることができます。

<図22> Composeファイルの確認

<図22>

この2つのComposeファイル両方をStack作成時に読み込ませると同じことをするコンテナを作成できます。
とりあえずここで作業端末にComposeファイルを保存します。

♢コンテナ再作成

Composeファイルも保存できたので、試しにCassandraDB Stackを削除してみました。
以下のとおりRancherServerのGUIから 「STACKS」→「All」の順にクリックするとシステム内のすべてのStackが表示され「CassandraDB」Stackは、削除されたことがわかります。

<図23> コンテナ再作成 手順1

<図23>

「Add Stack」をクリックして「CassandraDB2」という名前のStackを作成します。
docker-compose.yml とrancher-compose.ymlについてもあらかじめ作業端末に保存しておいたファイル名を指定します。

<図24> コンテナ再作成 手順2

<図24>

ファイルが読み込まれるとそれぞれ該当のテキストボックスにファイルの内容が表示されるので「Create」ボタンをクリックします。

<図25> コンテナ再作成 手順3

<図25>

「Create」をクリックすると同時に作成されます。

<図26> コンテナ再作成 手順4

<図26>

♢作成状態の確認

  1. コンテナのIPアドレス
    作成後、試しに「cdb1」のサービスへ入るとCassandraサーバーは「10.42.0.48」のIPアドレス作成されていることがわかります。

    <図27> 作成状態の確認

    <図27>

  2. ホストサーバーの共有ディレクトリとの接続
    cdb1サーバーのコンソールからデータディレクトリを確認します。

    <図28> 作成状態の確認

    <図28>

    
    [root@Host1 ~]# ls -l /cassandra/data/
    total 0
    drwxr-xr-x 2 polkitd ssh_keys  78 Jun 21 17:02 commitlog
    drwxr-xr-x 8 polkitd ssh_keys 117 Jun  9 10:41 data
    drwxr-xr-x 2 polkitd ssh_keys   6 Jun  7 03:41 hints
    drwxr-xr-x 2 polkitd ssh_keys  47 Jun 21 15:58 saved_caches
    [root@Host1 ~]#
    
    

    ホストサーバーからも確認すると再作成前のとおりコンテナ内のディレクトリがホスト接続されて置かれていることがわかります。

  3. Cassandraの状態
    cdb1サーバーのコンソールからクラスターが組まれているか確認します。

    <図29>

    Cassandra3台で認識していることがわかります。
    次にHOST1からデータを確認します。

    
    [root@Host1 ~]# cd /usr/local/cassandra/bin
    [root@Host1 bin]# ./cqlsh
    Connected to Test Cluster at 127.0.0.1:9042.
    [cqlsh 5.0.1 | Cassandra 3.10 | CQL spec 3.4.4 | Native protocol v4]
    Use HELP for help.
    cqlsh> select * from testdata.weather;
    num | city    | status | temperature
    -----+---------+--------+-------------
     5 |    Naha |   rain |          27
     1 | Sapporo | cloudy |          17
     2 |   Tokyo |  sunny |          22
     4 |  Hakata |   rain |          22
     3 |   Osaka |  sunny |          23
    (5 rows)
    cqlsh>
    
    

    コンテナ内のディレクトリにデータを置いているとコンテナ再作成時にデータはすべて失われますが、ホストサーバーの共有ディレクトリにデータを置いていたので再作成前と同じデータを読み取ることができました。

  4. 起動するコンテナのホスト指定
    もともと以下で作成していました。

    Cassandra コンテナ名 ホストサーバー配置
    cdb1 Host1
    cdb2 host2
    cdb3 host3

    ホストでもそれぞれのホストサーバー上で起動していることがわかります。

    <図30> 作成状態の確認

    <図30>

まとめ

今回は、Rancherを使いCassandraによるData Store層を作成してみました。
マイクロサービスという考え方ではこの上の層に、WebサーバーなどのアプリケーションをDockerコンテナとして作成しAPIを通して通信することで独自のシステムを構築していく事になります。
Rancher「Cattle」で試してみましたが、シンプルでたいへん便利なツールであることがわかりました。
このほか「Kubernetes」「Mesos」などのオーケストレーションについても手軽に使える環境をRancherでは提供しているのでシステム構築において選択肢が豊富なツールであることがわかりました。

参考資料

おすすめ記事

    お気軽にご相談ください