おうちk8sとリモートワーク

おうちk8sでリモート勤務を少しだけハックしている。

去年ミニPC (GMKtec NucBox G3) を購入して、おうちk8sをやりたいなーと思ってズルズルしていたんですけど、とりあえず動かせるようにはなった。

で、k8sに何を載せるかなんですけど、もともとはお遊びで書いている自前のCMSを載せようと思ってガリガリやってたんですけど、半年ぐらい放置してしまったので気分を変えることにした。 この夏に同棲を始めて、僕はフルリモート、彼女はリモート多めのハイブリッドという構成で、ミーティング中なのか (話しかけて良いのか) どうかがわかると良いという話になったので、そういうのがわかるダッシュボードみたいなのを作ってみた。

dashboard

機能

  • 今ミーティング中かどうかON/OFFできる
  • ミーティング時刻のスケジュールを設定できる

Infrastructure

k8sディストリビューションはk3sを使っています。最初はMicroK8sにしていたんですけど、なんかk3sのほうがかっこよいと思ったから。まあなんとなくです。

デリバリーツールとしてArgo CDを使っています。アプリケーションの定義も宣言的にできるし、状態とかが見れるダッシュボードがほしいなーと思ってとりあえず導入してます。管理構成はApp Of Appsパターンにしています。ArgoCDでApplicationをmanifestで管理する

イメージレジストリはDocker公式のregistryイメージをクラスタ内に作っています。

ちなみに、このおうちk8sクラスタはインターネットには出していなくてLANで運用しています。基本的に乗せるのはリモートワーク中にしか利用しないアプリケーションというのもあり、認証とかいろいろ考えなくて良いようにLAN運用にしてます。なので外部からCI/CDができないので、デプロイとかはおててで心を込めてやることになっています。まあそんなに頻繁に更新しないというのもある。このあたりはCloudflare Zero Trustとかでなんとかなるとは思うけど、今の所はこの構成にしている。

Web

WebはなぜかSolidJSを使っています。今まで個人開発ではReactベースのものばかりだったんですけど、なんとなくSolidJSを採用。今の所SolidJSのSすらわかっていない。

SPAとしてNginxで配信しています。

バックエンド

バックエンドAPIとしてHonoを使っています。他のプロジェクトとかでNext.jsを使っていることも多くて、Node.jsベースの素のAPIフレームワークって実はあまり触ったことがなかったので何にしようかという感じでしたが、今ならHonoが熱いよねーということに。炎だけに。

一応DBも持つようにしていて、Node.js組み込みSQLiteを使っています。まだ実験段階の機能 (--experimeltal-sqliteフラグが必要) なんですけど、こういうホームラボ的なシステムでは良さそうです。データの永続化はしていなくて、少量の初期データのみ起動時に登録されるようにしています。

リアルタイム通信

ダッシュボードなのでリアルタイムに状態を反映したい欲があります。今回はSSEを使って実現しました。更新リクエストが発生した場合にイベントをサーバーからクライアントへ送って、クライアントからrefetchをする形式にしています。サーバーtoクライアントのイベントには何も情報を乗せていません。通信量は多少多くなるかもですが、この方がシンプルになりそうなので。

構成図

lan-k8s

感想

例によってほとんどのコードはAIに書いてもらっています。コードに限らずいろいろAIに聞いています。今回は特にSSEとか。そういうものはそもそものところから調べる必要があるんだけど、納得いくまでしょうもない質問もできるのでこういう点では良い世界になったと思う。

実利用に関して、今の所は手元のブラウザでダッシュボードを開く感じだけど、部屋にもちゃんとしたダッシュボードディスプレイを置きたいなーとは思う。TRMNLとかどうなんすかね。どこまでできるんだろう。

難しいなーと認識改めした点はミーティングのON/OFFのUI。ON/OFFステータスを捉える色も人によって違うだろうし、OFFの場合にONにするボタンの色は?その逆は?という感じで、デザインとかUIの難しさを感じた。ステータスの色は実際のユーザーに聞けたのでこれでいっかーという感じだけど、ON/OFFボタンに関しては、実際にはトグルスイッチ形式のUIの方が良いんだろうなーとか思ったりしている。