むっちゃ遅れましたが、 Rancher Advent Calendar 2017 の 20日目の記事です。
- TLDR
- なんでカタログ化したいん?
- 前提条件
- プライベートカタログの作成
- プライベートカタログをリモートリポジトリへ追加
- ローカルボリュームを作成する
- プライベートカタログをRancherへ登録
- redashカタログからサービスを起動
- 今後について
- おまけ:pgAdmin4の使い方
redash便利ですよね?データの民主化よろしくredashはとても良いツールだと思います。 redash自体については、Redash Advent Calendar 2017 の 22日目の記事も書いているのでそちらも見て頂ければと言う事で宣伝。
TLDR
Pros
- プライベートカタログを作成し、Redashカタログを作成した yassan/rancher-catalog: Rancher Catalogs
- 「PostgreSQLをRedashカタログに入れるか?」や「http proxyを使うか」など、docker-composeを切り替え出来るよう 条件分岐
{{- if ○}} ~ {{- end}}
を試してみた - カタログにPostgresを含める場合にデータベース管理用にpgAdmin4も一緒に加えた
Cons
- Redash側の問題(?)で、カタログの起動は手動
- Redashの
REDASH_STATSD_HOST
に指定するパブリックIPの指定が配置先のホストのパブリックIPを手動で入力が必要 - RedashのHTTPS化やバックアップ、性能監視など運用面への改善が必要
なんでカタログ化したいん?
政治的な理由でどうしてもダッシュボードを分けたいとか言うことがどうしても出てくる事が容易に想像付くが、その場合にサクッと用意したい。 その他にも、おためし用と外部公開用と分けたいとか。
Rancherならカタログから選んでポチポチ必要事項入力したらすぐ出来ます!簡単ですね。 昔、ちらっとコミュニティカタログに存在していた(?) redash さんは、今は存在しないので自前でやってみます。
前提条件
- Rancher環境が構築済み
- Rancher v1.6.12
- ホストOS:Ubuntu Server 16.04 LTS
プライベートカタログの作成
redash用のカタログが公式には無いのでプライベートカタログを作成します。
カタログの作成方法は以下がとても参考になります。
ちなみに本家のカタログの中身は、下記の通り。
GitHub - rancher/community-catalog: Catalog entries contributed by the community
公式ドキュメントは以下
今回作成したプライベートカタログは、ここ に上げているので参考にどうぞ。
また、一からプライベートカタログを作成する場合は、Rancherで用意しているYeomanのカタログジェネレータを使うと便利です。 使い方については、以下の記事を書いています。
Redashのカタログの工夫ポイント
その1:docker-compose.ymlの条件分岐
以下の様に「HTTP_PROXY」や「PostgreSQLの有無」の切り替えを行えるようにしています。 その為、拡張子を「docker-compose.yml.tpl」としています。
<docker-compose.yml>
environment: {{- if eq .Values.USE_HTTP_PROXY "true" }} HTTP_PROXY: ${HTTP_PROXY} HTTPS_PROXY: ${HTTPS_PROXY} NO_PROXY: ${NO_PROXY} {{- end }} PYTHONUNBUFFERED: 0 REDASH_LOG_LEVEL: "IN
<rancher-compose.yml>
- variable: "USE_HTTP_PROXY" label: "Use HTTP_PROXY?" required: true default: false type: boolean
※HTTP_PROXYのあるネットワークの環境にてredashを置いて、BigQueryなどの外部のデータソースを使う場合に必要になります
if文については、以下の記事を書いています。
その2:pgAdmin4の追加
カタログにPostgreSQLを利用する場合(ADD_PG_CONTAINER
をtrueした場合)に、pgAdmin4を入れてデータベースの管理に使っています。
そうすることで、pgAdmin4からテーブルやデータベースの操作を実施出来るようになっています。
その3:サンプルデータセットの容易
redashを使うにも、データセットが必要ですが、これを用意するのも割りと手間です。
そこで、 id:kakku22 さんがRedashハンズオン資料として用意したものを使わせてもらっています。
不要な場合は、カタログの設定で ADD_SAMPLE_DATASET
をfalseにしてください。
その4:sidekickを使って初回起動前に実施が必要なcreate_dbを実施
以下にあるとおり、Rancherにはサービス実行制御の為の機能が備わっています。
cf. Services
そこで、create_dbを一回実行するだけのサービスを追加
server-init: image: redash/redash:3.0.0.b3134 labels: io.rancher.container.start_once: true ※1回実行したら終了する command: create_db
通常時に実行するserverには、 io.rancher.sidekicks: server-init
を追加して、server-init
の後に server
を実行するようにしてあげます。
services: server: image: redash/redash:3.0.0.b3134 labels: io.rancher.sidekicks: server-init io.rancher.container.hostname_override: container_name command: server depends_on:
また、INIT_REDASH_DB
を追加して、起動時にserver-init
を実施するか判断するよう条件を追加しています。
これは、カタログを再作成した場合に削除する前の情報を使いたい場合に利用します。
その5:スタックの配置先のローカルボリュームをスタック削除しても消えないようにした
PostgresとpgAdmin4のスタック用にローカルボリュームを割り当てています。 同一ホスト内ならカタログを削除しても、ボリュームを削除しないことで再度スタックを作り直してもDBを削除する前の状態からやり直せます。
最終的に、作成したカタログ
docker-compose.yml.tpl
rancher-compose.yml
プライベートカタログをリモートリポジトリへ追加
作成したプライベートカタログを、Gitのリモートリポジトリに追加。 これは、GitHubでもGitBucketでもなんでも良いです。
ローカルボリュームを作成する
cf. Volumes in Rancher
cf. Rancher CLIを触ってみる - Qiita
cf. Rancher Command Line Interface (CLI)
今回のカタログでは、外部のPostgreSQLを利用しない場合は、配置したローカルのボリュームを使う様にしています。
: redashdb: restart: always image: postgres:9.6.6-alpine : volumes: - redash-pgdata:/var/lib/postgresql/data ※← ここ : pgadmin: links: - redashdb:redashdb image: dpage/pgadmin4 : volumes: - pgadmin-data:/root/.pgadmin ※← ここ : volumes: redash-pgdata: driver: ${VOLUME_DRIVER} external: true ※←これが無いとスタック破棄した時点でデータが飛びます。 pgadmin-data: driver: ${VOLUME_DRIVER} external: true ※←これが無いとスタック破棄した時点でデータが飛びます。
カタログを起動する前に、Rancher CLIを使って配置先のホストにローカルボリュームを作成します。
Racher CLI setup
RancherServerからAPIキーを取得後、Rancher CLIをダウンロードして、該当ホストに配置します。 その後、配置先のホストにて、Rancher CLIを使う為の設定を実施します。
$ ./rancher config URL []: http://XX.XX.XX:8080 Access Key []: 0C(ひ・み・つ)7 Secret Key []: F(ひ・み・つ)nN INFO[0016] Saving config to /home/rancher/.rancher/cli.json
使えるか確認
$ ./rancher volume ls ID NAME STATE DRIVER DETAIL 1v95 rancher-agent-state active local 1v97 /var/run/docker.sock active 1v99 /lib/modules active :
ローカルボリュームを作成
配置するホスト上で、以下のようにコマンドを実行することで、ローカル上に永続的なボリュームを作成出来ます。
$ ./rancher volume create --driver local redash-pgdata 1v238 $ ./rancher volume create --driver local pgadmin-data 1v239
状態の確認
$ ./rancher volume ls --all : 1v223 active 1v238 redash-pgdata detached local ※←これ 1v239 pgadmin-data detached local ※←これ 1v280 active :
また、カタログ起動時に、上記コマンドを実行すると、 「detached」→「active」になっていることが分かります。
※注意※
カタログ起動時に「redash-pgdata_(ランダム文字列)」となっている場合は、失敗しています。揮発性(カタログ削除時に消える)のボリュームとなります。
プライベートカタログをRancherへ登録
Rancher Serverへ管理者アカウントでログインして、下図のようにして作成したカタログを追加します。
- 管理者メニューの「設定」を選択
- 下にある「カタログ」の項目に、リモートリポジトリのURLを追加。名前は、UI上の表示名なのでなんでも良いです。
- カタログメニューをクリックしてカタログを更新するか、再度、管理者アカウントで再ログインすると、カタログが追加されているのを確認
redashカタログからサービスを起動
- カタログ内に、redashがあるので「詳細を見る」を選択
- テンプレートバージョンは「0」を選択すると入力項目が表示するので、詳細画面に必要事項を入力
- 「起動」ボタン押下と同時にサービスを起動しないようにチェックボックスを外し、「起動」ボタンを押下
- スタック詳細の画面に遷移するので、「nginx」と「server」以外のスタックを起動(▶を押下したらOK)
- 下記の状態になったら、「server」→「niginx」の順に起動
- 暫く待つと全てのスタックがActiveになるので、赤枠のURLを押下
手順3でチェックボックスをOFFにするのは、以下の記事にある通り、create_dbの実行でどうしてもコケてしまうので、しゃーなし対応です。
最初は、sidekickつかって、redashdb→server-init→serverの順で実行すれば良いかと考えてたのですが、そもそも、redashdb自体は正常起動出来ているので効果なかったです。
原因は、postgresが接続受付け出来るようになるまでの間に、server-initからのcreate_dbを実行してしまうからです。
上記の記事では、15秒の待ちを空けてますが、下記のdocker-composeのように、pg_isready
を使ってコネクション確立するまで待つって実装の方がより良いかなぁとも考えますが、、
serverからpostgresのコマンド pg_isready が直で使える訳でも無いのでこのまま適用ってのも微妙。。
Docker Composeのドキュメント(以下は日本語訳)でも同様の例が有りました。
Compose の起動順番を制御 — Docker-docs-ja 17.06.Beta ドキュメント
今後について
今回は、プライベートカタログにRedashを「追加した」程度ですが、下記のようにまだまだやりたいことがたくさんあります。
REDASH_STATSD_HOST
を配置したホストのパブリックIPに指定- Redashのバージョンの指定
- Redashのアップグレード
- Redashのバックアップ
- RedashのHTTPS対応
- RancherのUIからRedashのServerやWorkerをスケールアップ
- Redashの性能監視
- redashdbやpgAdmin4に割り当てるvolumeをスタック起動時にRancher側で割り当てる
おそらく community-catalog/templates/postgres を参考にしたら出来そう。
- ただ、PostgreSQLは別カタログから起動してリンクさせた方が流用も出来るし、別カタログにしても良さそう。
rancher-compose.yml
にて、USE_HTTP_PROXY
やADD_PG_CONTAINER
で、false
にした場合、関連する変数のquestions
を非表示にしたい- Hubotなど入れておいて、SlackやRocket.chatなどにアラートなどのメッセージ飛ばせるようにしたい
今後、上記は進めていきます。
おまけ:pgAdmin4の使い方
- スタックからURLを選択
- ログイン画面に、カタログの詳細画面で指定したpgAdmin4の管理者用ID/PWを入力
- cf. pgAdmin4の管理者用ID/PW
- 上図で指定したID/PWを入力
- データベースへの接続設定を追加
するとこんな感じになります。