システム構成はタイトル通りで、Slackから飛ばした出勤・退勤をKubernetesにデプロイしたアプリ経由でDBに登録して、 Metabaseから可視化したよって話。
タイトルだけ見ると、いや勤怠管理のアプリ使えよとなるかもしれない
やったことと
狙いとしては、Docker / Kubernetesがどれくらい使えそうか、メリットは何かをざっくり感じれればいいなと。 ついでに、勤怠報告に使えればなおよし。
全体的なフロー
- Kubernetesクラスターを作成して、Dockerコンテナ化したアプリをデプロイ
- SlackのSlashコマンドと(1)のアプリのHTTPエンドポイントを紐付け
- SlackにSlashコマンドで勤怠を入れる
- Kubernetes上のアプリ経由でMongoDBにレコードを登録
- Embulkで MongoDB → MySQL にデータ転送
- Metabaseから勤怠状況をグラフに落とし込む!
完成図
[Slackで勤怠をちょこちょこ入れて]
[Metabaseで結果をダッシュボードに出す]
うーん、激しい勤務実態が見えてしまいましたね。可視化した時点で休み時間入れるの忘れてたことに気がつきました。。。
大変だったとこ
フローごとに難所があったので、覚え書きとして。
Kubernetes
Docker コンテナのイメージさえできていれば、Deploymentは問題なくいける。
ServiceはLoad Balancerを選択しましたが、クラウドプロバイダーによってはデフォルトがHTTPになっています。HTTPSにしないといけないサービスの場合は注意が必要です。例として、SlackのMessage ButtonはHTTPSでないとボタンアクションの質問は出るものの、ボタンを押した後のRequestURLが叩かれません。
ただ、突然Podの再生成がスケジュールできなくなる事象に遭遇。これはKubernetesクラスターを動かしていたGoogle Cloud Platformの問題っぽい。
- 解決策は リソースの自動拡張をONにすること。でないと突発的にリソースを食い始めた時に全て落ちる。
- 調べていたら、もう一つ解決策はあったようですね。Servicesに SessonAffinity プロパティをを加える...ことらしい。
GCE services type LoadBalancer · Issue #18347 · kubernetes/kubernetes · GitHub
Embulk
- 言わずとしれたデータ転送ツール
- MongoDBからデータを抽出した時に、カラムが分割されない問題がありましたがFilterで対応。
- ここは別記事で紹介したい。。。
Metabase
- セットアップから可視化までは相当楽でした。ここは昔の記事を参照いただければと。