Dosh 開發日誌
交大資工系計中原本有一款蠻好玩的服務叫做 Dosh,但他們停止維護了,我覺得很可惜。 於是想重新開發,基本上就是所有的 UNIX user 都可以在那臺主機上面進入 dosh 這個 shell,這個 shell 可以和 K8S 交互。 具體來說可以開一定數量的 containers,並且 attach 進去,不過當然,每個使用者的總資源量是有限制的。
24/10/07
把 dosh 的 shell 部分雛形寫好了,原本在那邊自己處理 I/O 串接,結果問題一堆:
- 分成兩個 Thread,一個負責 input,一個負責 ouput;結果 process 死了,input 還要你繼續輸入下一個指令,結果 boken pipe。
- process 檢測到你不是交互式界面,所以很多設定是沒有開啓的,所以不會有 prompt、color 和一些其它功能,使用者體驗很糟糕。
- Code 難以理解、維護,並且冗長,還同時涉及了 Multithreads、Multiprocesses 的運作。
於是後來採用了比較簡單的方法,直接把 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。
