5 min read

後端部署工具選擇心得

最近在架構一個後端 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,歡迎有興趣交流的人一起討論