はじめに
AWS,Azure,GoogleCloudなどパブリッククラウドはすごく便利ですが,個人で使うには高いですよね.(貧乏学生にはきちぃ)
一生無料で,使い放題なクラウドがほしいな〜
せや自分で作ればいいやん!
ということでパブリッククラウドを自作してみました(タイトル詐欺?電気代はかかります..実家に)
宣伝
自作クラウドのコンテナサービス(ECS風)で運用しているポートフォリオサイトです
https://daigo-suhara.com
フェーズ1:kubernetesクラスタ自動構築化
基盤にはkubernetesを採用することにしました.
しかしベアメタルにクラスタ構築するのめんどいなーということで自動的にクラスタ構築してくれるようにしました.
具体的には,Tinkerbellというソフトウェアを使用しています.これによりストレージ空っぽ,電源OFFの状態から,クラスタ構築に必要最低限なパッケージ(kubeadmなど)のみ含んだOSが勝手にインストールされます.
(Tinkerbell:ベアメタルにipxe経由でOSや初期設定を自動的にプロビジョニングしてくれる)
さらにClusterAPI Provider Tinkerbellを使用することで,OSプロビジョニング後のクラスタ構築作業も自動化してくれます.
自分はこれを,ノートPCにmicrok8sで作ったクラスタの上にargocdをインストして,argocdリソースとしてtinkerbell環境を構築しています.
フェーズ2:クラウドコアシステムの作成
まず現状ですが,
- 認証系(IAM的な)
- テナント
- コンテナサービス(ECS)
- 仮想マシン(EC2)
- WEBコンソール
- API
が作成できています.
それぞれの内部システムはgrpcサーバとして切り離されていて,GitHub Actionsでコンテナ化してociレジストリにPushしたものを,ArgoCDが呼び出します.
(*APIはFastAPI,WEBコンソールはReact製です)
コンテナサービスについて
基盤はknativeで動いています.それをFastAPIからの指示に基づいてGo製のシステムで操作しています.
オートスケールやコンテナイメージURLの指定などができます.ソースコードからの継続デプロイ機能はまだ開発できていません.
また,ドメインマッピング機能もあるので,<サービスID>.drkatana.comという名前で公開URLもつきますし,CNAMEでカスタムドメインも設定できます.


仮想マシンについて
基盤はkubevirtで動いています.ubuntu,fedora,debianなどのテンプレートの他,カスタムociイメージを指定することができます.コア数やメモリ数の指定と,コンソール画面からの操作ができます.
コンソール画面はwebsocketとxterm.jsで実装しています.

おわりに
自分用クラウドとしてはOpenStackなどのOSSを使うと楽ですが,自分で1から作るというのは勉強も兼ねつつ,つい時間を忘れて徹夜してしまうくらい楽しむことができたので,ぜひクラウド自作erが増えるといいなと思いました.
謝辞
今回開発作業にあたり,私の無茶なアーキテクチャを実装するコーディング作業の多くを担当してくださったCodexに感謝を表します.
