redash on Rancher

f:id:yassan0627:20171202155827p:plain むっちゃ遅れましたが、 Rancher Advent Calendar 2017 の 20日目の記事です。

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のカタログジェネレータを使うと便利です。 使い方については、以下の記事を書いています。

yassan.hatenablog.jp

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

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へ管理者アカウントでログインして、下図のようにして作成したカタログを追加します。

  1. 管理者メニューの「設定」を選択
    f:id:yassan0627:20171225110820p:plain
  2. 下にある「カタログ」の項目に、リモートリポジトリのURLを追加。名前は、UI上の表示名なのでなんでも良いです。
    f:id:yassan0627:20171225110827p:plain
  3. カタログメニューをクリックしてカタログを更新するか、再度、管理者アカウントで再ログインすると、カタログが追加されているのを確認
    f:id:yassan0627:20171225110842p:plain

redashカタログからサービスを起動

  1. カタログ内に、redashがあるので「詳細を見る」を選択
    f:id:yassan0627:20171225110857p:plain
  2. テンプレートバージョンは「0」を選択すると入力項目が表示するので、詳細画面に必要事項を入力
    f:id:yassan0627:20171225110907p:plain
  3. 「起動」ボタン押下と同時にサービスを起動しないようにチェックボックスを外し、「起動」ボタンを押下
    f:id:yassan0627:20171225145959p:plain
  4. スタック詳細の画面に遷移するので、「nginx」と「server」以外のスタックを起動(▶を押下したらOK)
    f:id:yassan0627:20171225150259p:plain
  5. 下記の状態になったら、「server」→「niginx」の順に起動 f:id:yassan0627:20171225150311p:plain
  6. 暫く待つと全てのスタックがActiveになるので、赤枠のURLを押下 f:id:yassan0627:20171225150411p:plain

手順3でチェックボックスをOFFにするのは、以下の記事にある通り、create_dbの実行でどうしてもコケてしまうので、しゃーなし対応です。
最初は、sidekickつかって、redashdb→server-init→serverの順で実行すれば良いかと考えてたのですが、そもそも、redashdb自体は正常起動出来ているので効果なかったです。
原因は、postgresが接続受付け出来るようになるまでの間に、server-initからのcreate_dbを実行してしまうからです。

ariarijp.hatenablog.com

上記の記事では、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_PROXYADD_PG_CONTAINER で、false にした場合、関連する変数の questions を非表示にしたい
  • Hubotなど入れておいて、SlackやRocket.chatなどにアラートなどのメッセージ飛ばせるようにしたい

今後、上記は進めていきます。


おまけ:pgAdmin4の使い方

  1. スタックからURLを選択 f:id:yassan0627:20171225123318p:plain
  2. ログイン画面に、カタログの詳細画面で指定したpgAdmin4の管理者用ID/PWを入力
    • cf. pgAdmin4の管理者用ID/PW f:id:yassan0627:20171225124134p:plain
    • 上図で指定したID/PWを入力 f:id:yassan0627:20171225124544p:plain
  3. データベースへの接続設定を追加 f:id:yassan0627:20171225124314p:plain f:id:yassan0627:20171225124324p:plain f:id:yassan0627:20171225124331p:plain

するとこんな感じになります。 f:id:yassan0627:20171225124714p:plain