ぱいぱいにっき

Pythonが好きすぎるけれど、今からPerlを好きになりますにっき

そろそろ正式サービスが始まる#arukas でkuiperbeltを動かしてみる

arukas.io

これで

github.com

を動かす話

要約と言うか感想

  • Arukasは簡単だけれど、その裏返しで制限が厳しい
    • private registryにはまだ対応予定状態だとか
    • VPNっぽい仕組みがないとか
  • kuiperbeltが想定している環境ではない
    • 特定のコンテナに対する通信がしたい
      • コントロールパネルやAPIからはホスト名とポートを取れる
      • コンテナ自身が割り当てられている環境を知る方法はなさそう?
        • 環境変数とかで知れるようにしてほしいと要望メールした
        • 追記: Twitter眺めてたら取る方法を発見した。下の方に追記してます
  • データストアとArukasは非常に相性が悪い
    • と言うかストレージが無い
    • MySQLだとレプリ組んでなんとかするとかRedisでもそうするとかそういうレベル
    • そもそもDocker自体とも相性が悪いのだけれど
    • 海外のContainer as a Serviceであるhyper.shにはあるらしい
  • kuiperbelt instance 1台構成なら出来たのでやり方を晒してみる

何を構築した?

  • かんたんなWebSocketを使ったチャットアプリ
  • kuiperbeltを使えばWebSocketとか何も考えずに作った普通のWeb Applicationでも簡単にWebSocketを扱えるようになりますというのを示したい

構成

f:id:mackee_w:20180321145828p:plain

  • Perl/PSGI Application x N
    • Plackで書いたPrefork Server
    • 別にここはRailsでもSinatraでもLaravelでもSlimでもDjangoでもFlaskでもExpressでもなんでも、Webサーバーであればなんでも良い。僕がPerlならサクッと書けるからそうしただけ
    • ここはスケール可能で、詰まったら何台でも並べられる
  • Redis x 1
    • 高可用性取るならレプリケーションしたほうが良い
    • というかコンテナでデータストア運用するのが(ry
    • ここもRedisじゃなくてもKVS的な機能を持っていれば良くて、pub/subとかは使ってない。SET型使ってるけれどmemcachedであれば、カンマ区切りで複数個入れるのでも良くて、と思ったけれどアトミックに要素を出し入れするのは考えないといけ無さそう
    • ぶっちゃけRDBMSでも良い
    • というか認証も暗号化もかかってない。ノーガード戦法で平文をインターネットが漂っている
      • ホストとポートを推測しにくいものを使って、パケットがArukas内部で収まっていることを祈りながら使っているけれど、みなさんは真似しないように
      • ローカルのredis-cliから繋げられてデバッグに便利
  • kuiperbelt x 1
    • アイコンはWebSocketのロゴらしいです
    • ここが現状1台なんだなぁ
    • いや、今回はAppのほうでkuiperbeltのエンドポイントを返すようにしたのでそこを複数個にしてクライアントがランダムで何処かに繋げば複数台が可能
    • ここには課題があります

kuiperbeltがのびのびと動くための条件

  • のびのび=クライアントからのWebSocketを扱うkuiperbeltが複数台でロードバランサー配下に収まって機能する
  • Web Application側がメッセージをクライアントに送る時に対象のクライアントがどのkuiperbeltにつながっているかを知る必要がある
    • この情報は接続時コールバックで渡ってきてWeb Application側がKVSとかに保存する
  • 接続時コールバックでWeb Applicationに通知するための「外からつながる自分のホスト名/IPアドレスとポート」をコンテナ自身が知る必要がある

Arukasでは

  • アプリケーションは単一のエンドポイントを持つ
    • これが曲者でアプリケーション起動時に設定したポートに飛んでいくが、httpsしか対応していないっぽい?
  • コンテナ一個一個にホスト名とポートが割り当てられる
    • これらはガチャ
  • コンテナごとに割り当てられるホスト名とポートをコンテナ自身が知ることができれば勝つる
    • 現在は敗北してます
  • しょうがないので1アプリケーション1コンテナ、増やしたいならアプリケーションを増やす、この辺のリストはWeb Application側に環境変数で渡せるようにした
    • このやり方でも無停止でkuiperbelt側を増やすことが出来る
  • 1コンテナでも512MBもメモリがあれば2500接続ぐらいは余裕で持つ事ができるわけで、全然問題無さそう。メッセージ数はちょっとあれだけれど
    • 今のやつはつながっている全員にブロードキャストしているので危ない

設定例

kuiperbelt

f:id:mackee_w:20180321152806p:plain

webapp

f:id:mackee_w:20180321153037p:plain

redis

  • redis:latest指定して立ててるだけ

展望

  • 前述のhyper.shでも試してみる
    • つながるIPをコンテナにアタッチできるみたい
    • ドキュメント見る限りはそれでもやはりよしなスケールは出来無さそう?
  • GKEもといkubernetes...
  • もっとちゃんとしたアプリケーションを作る
    • このサンプルアプリだと見た目で夢が広がりにくいかなあ
  • あとコンテナで監視ってどうやるんだろう。。。

追記:2018-03-22

Twitter眺めてたら、 pottavaというイメージをArukasで立てている人がいて、そのコンテナのURLを叩いてみると、渡ってきた環境変数やらがババっとJSON APIで取得できるという代物だった。

その中にMARATHON_HOSTMARATHON_PORT という環境変数があり、値の方はコントロールパネルで見たことのあるようなものが。。。。

早速自分も同じイメージで立ててみて検証してみた。

である。つまりこれは望んでいたものではーーー?????

今のkuiperbeltの公式イメージにそのまま適用することは出来ないが、arukas用の設定ファイルを作ればいけるのでそういうDockerfileを書いてみようと思う。