後端部署工具選擇心得
最近在架構一個後端 Proxy 服務,一路上邊做邊學習遇到不少問題,可能因為規模小,上網找資料研究主流工具使用,反而沒辦法順利完成工作,分享這段時間的踩雷心得,也許能幫助到下一個人
容器化 VS 虛擬機
這張圖看過很多次,但讓我實際有感覺就是這次工作上遇到的情境,如果服務高度依賴底層 OS 時,使用 Docker 會很痛苦,我的情境是在 Google Compute Engine上部署服務,需要用到以下工具
- Nginx
- Nodejs
- SSH server
- systemd
- linux user managment
之前試著一步步把這些服務包裝成 docker image,但容器化的環境和 GCE 差異太大,不但開發緩慢,也難以測試,最後放棄轉而在 VM 上直接開發和部署
單體式 VS 微服務
前些年剛進入職場時很流行微服務,累積了一些相關的經驗,也發現其中不那麼美好的地方,這次選擇用單體式的架構主要考量是
降低初始建制的複雜度
微服務可以很有效的把服務獨立出來,好處是讓服務彼此不互相影響,而壞處就是當你只有一個人要負責這些全部的服務時,得重複建構一些基礎的單元,像是不同服務之間的傳輸、驗證、資料儲存等,這時單體式的好處:全部打包在一起串連功能,就很方便
還有另一個更主要的原因
早期開發階段的變動性太高
有的時候客戶、公司的需求一改,從雲原生 (Cloud Native) 直接打成邊緣運算 (Edge Computing) 的地端服務都有可能,也是過去曾經數次過度設計換來的經驗,在還沒實際使用者驗證需求之前,還有很多變數
這點經驗也許較適合套用在不確定性高的小公司和新產品上 (每間公司的做法不同也會影響開發方式的選擇)
CICD 自動化部署流程設計
從容器化、虛擬機、單體、微服務,這些取捨都會影響到最後的自動化部屬流程,也是目前的遺憾
無法享受成熟的 Docker 和各家 CICD 雲端服務
輾轉找到了 Ansible,一個透過主控端 SSH 連線客戶端的部署管理工具,花了些時間學習,體驗還算不錯 (官方文件不太友善,之後會另外把研究的經驗寫下來)
Ansible 可以有效管理服務安裝流程、控制環境變數、更新追加功能,但也衍生下面的開發環境選擇問題:這些部署流程該怎麼驗證是有效的?
本地開發 VS 雲端開發
大公司的工程師也許無法體會以下情境,通常接收到一個工作需求,我得從最開始的需求規格、架構設計、開發環境、工具、測試、部署、監控一手包辦,取捨之下才會有這個議題
要怎麼在時間內,同時完成這些事情?
最理想的情況是:
本地端有模擬的開發環境,做好足夠的驗證再部署到雲端
而我最後的選擇是:
直接在雲端開一台 VM,遠端連線同時進行開發和部署
等需求較收斂,才回過頭處理本地開發環境和部署問題,也讓我遇到了另一個單體式虛擬機的地雷
Apple silicon 的虛擬機相容性問題
目前 Ansible 在網路上常見的開發環境會搭配 vagrant + virtualbox/docker 使用,對我來說,一個好的開發體驗,只要能夠按照官方文件操作不要遇到錯誤,就能專注在開發上,但 vagrant + virtualbox 在 Macbook Pro M1 Pro 上會出現執行錯誤,我沒有打算多花時間去解決
透過社群討論找到另一個虛擬機工具 multipass ,按照官網說明一步步操作,成功建立起虛擬機,讓我在本機模擬部署流程和熟悉工具
以上是摸索的過程紀錄,提供參考
我整理了一份初 ansible playground,方便快速測試工具怎麼使用
https://github.com/jcyh0120/ansible-playground
整個專案使用的主要工具
- 雲端服務:Google Compute Engine
- 部署工具:Ansible
- 虛擬機:Multipass
我在小公司擔任後端工程師,以上經驗是摸石頭過河的 DevOps 心得,也許不是最好的 Best Practice,歡迎有興趣交流的人一起討論
Member discussion