Dosh 開發日誌

交大資工系計中原本有一款蠻好玩的服務叫做 Dosh,但他們停止維護了,我覺得很可惜。 於是想重新開發,基本上就是所有的 UNIX user 都可以在那臺主機上面進入 dosh 這個 shell,這個 shell 可以和 K8S 交互。 具體來說可以開一定數量的 containers,並且 attach 進去,不過當然,每個使用者的總資源量是有限制的。

24/10/07

把 dosh 的 shell 部分雛形寫好了,原本在那邊自己處理 I/O 串接,結果問題一堆:

於是後來採用了比較簡單的方法,直接把 python 自己的 sys.stdin 和 sys.stdout 接到 subprocess 上,然後 subprocess 死了之後,就自動歸還回來。 使用體驗大幅上升。

第二個處理的點是 python 預設的 input 函式太粗糙,連左右移動都沒辦法。因此這裏採用 readline 的 library,優化了這部分的使用者體驗,這個 library 還提供了歷史記錄功能。

第三個部分就是 Shell,因爲我們只需要支援少數的指令,也不需要允許使用者呼叫外部程式,因此我們直接把每個指令寫成一個函式即可;但如果這樣,我們勢必要引入 switch 或是一大串 if,然而我不喜歡這樣。因此,我使用 decorator,將每個函式的對應指令和介紹經由 decorator 放入一個字典,然後直接查找即可。

然後引入了 pylint,並加入到 github action。

24/10/9

終於把 Kubernetes Cluster 架設完成,我架了好久。

可以參考這篇文章

24/10/10

撰寫了 dosh 的 Kubernetes UserManager Module,可以新增、授權、刪除使用者。

並且研究了 RBAC 以及 Kyverno,後者可以制訂一些細緻的 Policy,用來限制使用者 Deployment 數量,以及權限控制。

最後爲他們撰寫了 Unittests。

可以參考這篇文章

24/10/11

首先先將昨天撰寫的 tests/utils 的各個操作 Kubernetes 的函式拔出來,經過修改,組成了 Kubenetes DeploymentManager Module,負責 Deployment 的操作。

然後爲此撰寫了簡單的 Unittests。

基本上把整體功能寫完了,還撰寫了一個可以設置 setuid 的 C 語言的 entrypoint。

在內網部署了一個測試版的 dosh,基本能用,在加入了基礎的資源限制機制。

但是錯誤訊息未經處理的輸出,有點醜陋。

24/10/12

重構了之前撰寫的 cores 部件,使用了一些 python 語言特性來讓程式碼更加簡潔。

然後將錯誤訊息進行了一些處理,僅輸出最核心的錯誤訊息。

接下來應該暫時就不會再更動 Dosh 的程式碼了,應該要研究 IPS 和 Kubernetes 的動態資源管理(當然後者可能還是需要撰寫程式)。

24/10/13

夜長夢多,還是想到了 Dosh 很多要改動的地方。

早上,爲每個 Deployment 加上了 Headless Service,以提供 DNS 給每一個 Pod。