CRDとReconcileでテトリスするKubernetesのCustom Controllerを作った

テトリスするCustom Controllerを作りました。(正確に言うと「テトリスに似た何か」です)

github.com

単にテトリスをアプリとしてKubernetesクラスター上に載せるわけではなく、(無駄に)Custom Resourceにフィールドの状態などの情報を保存しReconcileで情報を更新することでテトリスを実装したものになります。T4sというリソースをデプロイすることで遊べます(詳しくはREADME参照)。

マニフェストの例:

apiVersion: t4s.tkna.net/v1
kind: T4s
metadata:
  name: t4s-sample
spec:
  width: 11
  height: 20
  wait: 1000
  nodePort: 30080

アーキテクチャ

t4s/design.md at master · tkna/t4s · GitHub

全体アーキテクチャ
全体アーキテクチャ

こんな感じのアーキテクチャで、複数のControllerが連携してピタゴラスイッチしています。特にBoardはフィールドの情報や現在操作対象のブロックの位置情報等を持っていて、何か動きがある度にそれをReconcileで書き換えています。もはや冪等性とは?という感じですが、最終的にはGameOverというステートに落ち着くので長い目で見たら冪等と言えるかもしれません(?)

メトリクス

スコア(消した行数)はメトリクスとして見ることができます。

一度に消した行数(1~4)ごとのカウント
一度に消した行数(1~4)ごとのカウント

注意点

  • 簡単のため、1 namespaceにつきT4sは1つのみにしています。
  • 操作に若干のタイムラグがあるかもしれませんが、基本的に非同期に処理をしているのと、その他いろいろ無理をしているので大目に見てください。
  • Custom Resourceをかなり高頻度で読み取り/更新します。特に、たくさんのnamespaceにT4sをデプロイすると動作速度が低下するか動かなくなると思いますのでご注意下さい。

参考

下記ページや書籍を参考にさせていただきました。