技業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のインストール
♢今回は以下のようなホストサーバーの構成で作成しました。
ホストサーバー名: 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>
♢ Hostサーバーの取り込み
RancherServerの中で以下の操作をしてホストサーバーを管理対象として追加します。
- 「INFRACTURE」⇒ 「Hosts」の順にクリックします。
- 「Add Host」をクリックします。最初は、HostResigration URLの画面が出ますが「Save」をクリックして次の画面に移動します。
- 「Hosts: Add Host」の画面で以下の赤線枠で囲んだ部分の文字列をコピーします。コピーは、赤線枠の右隣のボタンをクリックで完了します。
<図3>
- 該当するホストにコマンドラインでログインして3.の内容を貼り付けます。今回はホスト名 Host1, Host2, Host3のサーバーです。
- RancherサーバーのWeb GUIで 1.の操作をして待っていると以下のようになりRancherサーバーの管理下に置かれたことがわかります。
<図4>
♢Hostラベル取り付け
今回は、各ホスト毎に起動するコンテナの起動を操作したいのでHost ラベルを使ってみます。
ホスト毎に次の内容をHostラベルとして、追加で設定します。
ホスト名 | key | value |
---|---|---|
Host1 | hostname | cassandra1 |
Host2 | hostname | cassandra2 |
Host3 | hostname | cassandra3 |
作業は以下で実行できます。
-
各ホストサーバーの右上をクリックして「Edit」を選択します。
<図5>
-
図の赤枠で囲まれた「Labels」で「Add Label」をクリックして入力フィールドを追加してHostラベル表に指定した値を入れます。
- ※図では、Host1での記入です。
<図6>
1. , 2. を各ホストサーバーについて実施します。すべて終わると以下のようになります。
<図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を利用し次の条件で動作するように作成します。
- コンテナ内のディレクトリをホストの共有ディレクトリに保存するコンテナをBusyBoxで作成します。
コンテナディレクトリ /var/lib/cassandra
ホストディレクトリ /cassandra/data - BusyBoxコンテナのボリュームをCassandraのコンテナにマウントします。
- Cassandraのコンテナは3つ作成しそれぞれ以下のホスト名と起動するホストサーバーの配置とします。
Cassanraコンテナ名 ホストサーバー配置 Seed_node BusyBox コンテナ名 cdb1 Host1 Seed_nodeとして作成 data1 cdb2 Host2 cdb1を指定 data2 cdb3 Host3 cdb1を指定 data3 - cdb1のIPアドレスを10.42.0.48で指定して作成します。
- コンテナアップデート時(Upgrade利用)にIPアドレスが変わらないようにします。
構成後の概要図は以下のようになります。
<図8>
Stackの作成
コンテナの集合体であるサービスが起動する領域を作成します。
- RancherサーバーのWeb画面より「STACKS」⇒「User」の順番にクリックします。
- 「UserStacks」の画面で「Add Stack」をクリックします。
- 「Add Stack」の画面で「Name」「Description」に図の通りいれて「Create」ボタンをクリックします。
<図9>
サービスの作成
いよいよCassandraのサービスを作成します。
Rancher Cattleでは、「サービス」とは一つの機能を提供するまとまりという位置づけでその実体は、複数のコンテナにより構成されます。そのため、CassandraとBusyBoxのコンテナがsidekickで結ばれた状態のサービスを作成します。これをCassandraサービスとして起動します。
今回は 3つCassandraサーバーが起動するため、最終的に3つサービスが各ホストに一つづつ出来上がります。
♢一つ目のサービス作成:
- Stack作成後に表示される画面で「Add Service」ボタンをクリックします。
- 図の赤枠のとおり上半分と下半分があるので、まずは上半分を記入します。
<図10-1>
- ②-1 Cassandraコンテナの設定: 次の図のとおり設定します。
<図10-2>
- ②-2 BusyBoxコンテナの設定: 次の図のとおり設定します。
<図10-3>
- ②-1 Cassandraコンテナの設定: 次の図のとおり設定します。
- 次に下半分を記入します。
- ③-1 Cassandraコンテナの設定:
「Volumes」「Networking」「Scheduling」のタブで次の図のとおり設定します。その他では設定していません。
<図10-4>
記入がおわったら、②-1でBusyBoxコンテナ用に記入で作成した場所に表示のある「data1」をクリックしてBusyBox用コンテナの設定をつづけます。
- ③-2 BusyBoxコンテナの設定:
「Volumes」「Scheduling」のタブで次の図のとおり設定します。
<図10-5>
- ③-1 Cassandraコンテナの設定:
- 「Create」をクリックすると一つ目のCassandraサービスが作成されます。
♢二つ目以降のサービス作成:
2つ目以降も一つ目と同じようにCassandraとBusyBoxのコンテナをsidekickを使い作成しますがCassandraコンテナ作成の設定時に<図10-1>の下半分の設定は次のようにします。
設定するタブは「Command」「Volumes」「Networking」「Scheduling」です。
「Volumes」「Scheduling」タブの登録は一つ目のCassandra作成と同じです。
「Command」「Networking」タブは図のとおり作成します。
<図10-6>
以上で作成完了です。3つサービスが上がると次のようになります。
- ※RancherサーバーのWeb画面で「INFRACTURE」⇒「HOSTS」の選択で表示
<図11>
動作の確認
nodetool status で3台認識されたか確認します。
次のようにCassandraサービスのボタンをクリックするとメニューが表示されるので「Execute Shell」をクリックしてCassandraサーバーのコンテナにログインします。
<図12>
nodetool status で3台認識されているのがわかります。
<図13>
ホストのディレクトリとコンテナ内のdataディレクトリが共有されたことを確認します。
代表で Host3に入っているcdb3のサービスについて確認します。
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>
次に図のとおり記入します。
<図16>
投入が終わったら 「Upgrade」ボタンをクリックします。Upgradeがおわったら次のような画面になります。
<図17>
ここでサービス名をクリックするとサービスの詳細な画面になります
<図18>
Upgrade前まで起動していたCassandra バージョン3.9のコンテナはロールバック用に停止して新しくCassandra バージョン3.10のコンテナが起動しているのがわかります。
IPアドレスは新旧どちらも同じでかわらないことがわかります。
さらに右上のほうにある「?」印をクリックするとUpgrade前まで起動していたコンテナは廃棄されUpgradeは完了するのですが、「?」印の右をクリックして「Rollback」をクリックするとUpgrade後のコンテナはなくなりUpgrade前のコンテナを起動してUpgrade前の状態にもどりますが今回は「?」印をクリックでUpgradeを終了します。
終了後は次の図のようになります。
<図19>
同じように残り2つのサービスについてもUpgradeを実施します。最終的には次の図のようになります。
<図20>
データ投入
「testdata」というkeyspaceに次のようなデータをいれてみました。
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ファイルを見ることができます。
<図22>
この2つのComposeファイル両方をStack作成時に読み込ませると同じことをするコンテナを作成できます。
とりあえずここで作業端末にComposeファイルを保存します。
♢コンテナ再作成
Composeファイルも保存できたので、試しにCassandraDB Stackを削除してみました。
以下のとおりRancherServerのGUIから 「STACKS」→「All」の順にクリックするとシステム内のすべてのStackが表示され「CassandraDB」Stackは、削除されたことがわかります。
<図23>
「Add Stack」をクリックして「CassandraDB2」という名前のStackを作成します。
docker-compose.yml とrancher-compose.ymlについてもあらかじめ作業端末に保存しておいたファイル名を指定します。
<図24>
ファイルが読み込まれるとそれぞれ該当のテキストボックスにファイルの内容が表示されるので「Create」ボタンをクリックします。
<図25>
「Create」をクリックすると同時に作成されます。
<図26>
♢作成状態の確認
-
コンテナのIPアドレス
作成後、試しに「cdb1」のサービスへ入るとCassandraサーバーは「10.42.0.48」のIPアドレス作成されていることがわかります。<図27>
-
ホストサーバーの共有ディレクトリとの接続
cdb1サーバーのコンソールからデータディレクトリを確認します。<図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 ~]#
ホストサーバーからも確認すると再作成前のとおりコンテナ内のディレクトリがホスト接続されて置かれていることがわかります。
-
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>
コンテナ内のディレクトリにデータを置いているとコンテナ再作成時にデータはすべて失われますが、ホストサーバーの共有ディレクトリにデータを置いていたので再作成前と同じデータを読み取ることができました。
-
起動するコンテナのホスト指定
もともと以下で作成していました。Cassandra コンテナ名 ホストサーバー配置 cdb1 Host1 cdb2 host2 cdb3 host3 ホストでもそれぞれのホストサーバー上で起動していることがわかります。
<図30>
まとめ
今回は、Rancherを使いCassandraによるData Store層を作成してみました。
マイクロサービスという考え方ではこの上の層に、WebサーバーなどのアプリケーションをDockerコンテナとして作成しAPIを通して通信することで独自のシステムを構築していく事になります。
Rancher「Cattle」で試してみましたが、シンプルでたいへん便利なツールであることがわかりました。
このほか「Kubernetes」「Mesos」などのオーケストレーションについても手軽に使える環境をRancherでは提供しているのでシステム構築において選択肢が豊富なツールであることがわかりました。
参考資料
- ※1
- ※2AbemaTVにおけるMicroservices Architecture
- ※3
- ※4Getting Started with Microservices, Part 1: Advantages and Considerations
- ※5Getting Started with Microservices, Part 2: Containers and Microservices