26
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

NTTコミュニケーションズAdvent Calendar 2017

Day 1

tsuruの紹介とtsuru-nowを使った簡単な導入方法

Last updated at Posted at 2017-11-30

こんにちは、 @hico_horiuchi です。
この記事は NTTコミュニケーションズ Advent Calendar 2017 の1日目です。

普段は Enterprise Cloud 2.0 のベアメタルサーバメニューの開発をしていますが、
今回は来週末開催予定のハッカソンのためにPaaSを構築してみたので、その紹介をします。

tsuruとは?

tsuru ( :star: 2.6k) は Docker をベースにしたオープンソースのPaaS(Open PaaS)です。
ブラジル最大の放送局である globo.com が中心となって、Go言語で開発されています。
Open PaaSには他にもありますが、Flynnと悩んだ末、今回はtsuruを採用しました。
(参考: Best Platform as a Service Software - 2017 Reviews of the | StackShare )

  • Dokku ( :star: 14.6k)
    • Minimalだが、その分Node追加/ユーザー管理などの機能が不足している。
  • Flynn ( :star: 6.4k)
    • 今回の用途にはオーバースペックで、構築が少し難しい。
  • Deis ( :star: 6.1k)
    • Microsoftに買収され、OSSとしてのメンテナンスが終了してしまった。
  • OpenShift ( :star: 3.7k)
    • Kubernetesのノウハウが無く、構築・運用が難しい。

tsuruの用語とコンポーネント

アーキテクチャ

2017/12/09 アーキテクチャの図を追加しました。

tsuru_archtecture.png

用語

Concepts より。

  • Cluster
  • Node
    • Unitが動作するDockerホスト。
    • EC2などのIaaS上でオートスケール可能。
  • Application
    • Unit上で動作するアプリケーション。
    • パッケージやライブラリの依存情報と Procfile を含む。
  • Unit
    • アプリケーションが動作するDockerコンテナ。
    • デプロイ時にDockerイメージがビルドされる。
  • Platform
    • 各言語のランタイムを含んだDockerイメージ。
    • PlatformをベースにUnitのDockerイメージがビルドされる。
    • Node.jsやRubyだけでなく、Buildpackにも対応している。
  • Service
    • Application向けのミドルウェアを提供する機能。

コンポーネント

Architecture より、全てGo言語で開発さています。

  • tsuru/tsuru
    • tsurud と呼ばれるRESTful APIサーバ。
    • データベースにMongoDBを使用している。
    • API reference
  • tsuru/gandalf
    • Gitリポジトリを管理するRESTful APIサーバ。
    • ユーザーの作成、公開鍵の登録、リポジトリの作成など。
  • tsuru/planb
    • HipacheインスパイアのHTTPプロキシサーバ。
    • バックエンドにRedisを使用している。
    • アプリケーションへのアクセスをUnitに転送している。

tsuru-nowを使ったインストール

2017/12/09 tsuru-nowをベースに tsuru-ansible を作りました。

では、実際にtsuruをインストールしてみます。
インストール方法は主に種類ありますが、今回はtsuru-nowを使います。

今回はConoHa 2GBプランの仮想サーバ上のUbuntu 16.04にインストールします。
基本的に、サーバにログインして下記のコマンドを実行するだけで環境が出来上がります。

--host-name でドメイン名を指定していますが、標準では {ip address}.nip.io が設定されます。
(ドメイン名を指定する場合は、DNSで *.example.com のようにワイルドカードも設定する必要があります。)
tsuru-dashboard は使わないので除外しています。

$ curl -sL https://raw.github.com/tsuru/now/master/run.bash -o run.bash
$ LANG=C bash ./run.bash --host-name example.com --without-dashboard

手元のMacなどで tsuru/tsuru-client をダウンードしておきます。
管理ユーザ( admin@example.com )でログインして、パスワードを変えておきます。
初期パスワードはインストールの最後にも表示されますが admin123 のはずです。

$ tsuru target-add default http://example.com:8080 -s
$ tsuru login
$ tsuru change-password

プラットフォームの追加

後程JavaScriptのサンプルアプリケーションを動作させるので、Node.jsのプラットフォームを追加しておきます。

$ tsuru platform-add nodejs

パーミッションとチームの設定

tsuruでは Managing users and permissions の通り、細かく権限を管理することができます。

デフォルト設定の確認

Roles の詳細は tsuru role-list で確認できます。

  • ユーザを作成するとチームの作成権限が付与される。
  • チームを作成するとチームメンバの権限が付与される。
    • チームメンバになるとアプリケーションの作成権限が付与される。
$  tsuru role-default-list
+-------------+-----------------------------------------------+-------------+
| Event       | Description                                   | Roles       |
+-------------+-----------------------------------------------+-------------+
| team-create | role added to user when a new team is created | team-member |
+-------------+-----------------------------------------------+-------------+
| user-create | role added to user when user is created       | team-create |
+-------------+-----------------------------------------------+-------------+

ハッカソン用のチーム作成・権限の制限

ハッカソン用の hackathon チームを作成します。
ただし、ユーザには他のチームを作成して欲しくないので、
ユーザ作成時にデフォルトで権限が付与されないように修正します。

$ tsuru team-create hackathon
$ tsuru role-default-remove --user-create team-create

ユーザーの作成とロールのアサイン

ユーザーを作成して、 hackathon チームの権限をアサインします。
これで、このユーザーは hackathon チームでアプリケーションを作成できます。
(tsuruではアプリケーションはユーザーではなくチームに紐付きます。)

$ tsuru user-create user@example.com
$ tsuru role-assign team-member user@example.com hackathon

アプリケーションのデプロイ

最後に、実際にtsuruにアプリケーションをデプロイして動作確認します。
管理ユーザをログアウトし、user@example.com でログインし直します。

$ tsuru logout
$ tsuru login
$ tsuru user-info

GitリポジトリにSSHでpushするための公開鍵を登録します。

$ tsuru key-add default ~/.ssh/id_rsa.pub

今回はサンプルとして heroku/node-js-sample をデプロイします。
tsuruでアプリケーションを作成するとリポジトリのアドレスが得られます。

$ git clone git@github.com:heroku/node-js-sample.git
$ cd node-js-sample
$ tsuru app-create node-js-sample nodejs
$ git remote add tsuru git@example.com:node-js-sample.git

git push でソースコードをアップロードすると、デプロイが始まります。
Dockerイメージのビルドが成功すると、Dockerコンテナが起動します。
( tsuru app-info でUnitのStatusがstartingになっていれば :ok_hand: です。)

$ git push tsuru master
...
remote: ---- Pulling image to node ----
remote: latest: Pulling from tsuru/nodejs
remote: Digest: sha256:e00eafac96ce34028f33277ad4c84ce51e8dc2eb9552bf58cb05ddb775af1ced
remote: Status: Image is up to date for 127.0.0.1:5000/tsuru/nodejs:latest
remote: Downloading and installing node v4.0.0...
...
remote: ---- Setting router healthcheck (Path: /) ----
remote: 
remote: OK
$ tsuru app-info
...
+--------------+----------+-----------+-------+
| Unit         | Status   | Host      | Port  |
+--------------+----------+-----------+-------+
| 7ff44d20c1d2 | starting | 127.0.0.1 | 32868 |
+--------------+----------+-----------+-------+
...

http://node-js-sample.example.com にアクセスすると「Hello World!」と表示されるはずです!
tsuru app-log でログを確認したり、 tsuru app-shell で実行中のコンテナに
ログインできたりするので、デバッグの際は使ってみてください。

その他

MongoDBの中を覗いてみました、データ構造はシンプルな印象です。

$ mongo tsurudb
> show collections
apps
builder_app_image
docker_containers
...
> db.teams.find()
{ "_id" : "admin", "creatinguser" : "admin@example.com" }
{ "_id" : "hackathon", "creatinguser" : "admin@example.com" }

Redisの中も覗いてみました、URLと転送先が保存されていますね。

127.0.0.1:6379> keys *
1) "frontend:ruby-sample.example.com"
2) "healthcheck:ruby-sample.example.com"
127.0.0.1:6379> lrange frontend:ruby-sample.example.com 0 -1
1) "ruby-sample"
2) "http://127.0.0.1:32868"

参考文献

本記事の作成に当たり、下記のページを参考にさせて頂きました。

26
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?