透過K8S實踐微服務架構
前情提要
對目前企業來說,如果要達到服務上低偶和、靈活擴充、敏捷開發,都會採用微服務的開發架構,那今天要做的,是一個前後端分離的為服務架構。
K8s(Kubernetes)
K8s是一個容器管理引擎,它可移植、可擴展,只要透過使用者的配置來管理工作負載及各項服務,從早期的傳統部屬 →虛擬化部屬→到今天要說的容器部屬,而它的誕生,主要是為了解決”手動部屬多個容器到多台機器上監控與管理”,因此提供一個平台去做操作,而底層的部分也透過抽象化的方式讓使用者大致了解工作模式,但至於實際是怎麼運行的?這邊透過圖介紹一下。
Cluster
K8s以叢集(Cluster)作為核心概念,裡面有多個Node以及”Control Plane”進行轉發,簡單比喻來說,可以想像Cluster是一個工廠。
Node Components
Node主要負責提供維運及Pod運行所需要的環境,而一個Node可以是一台虛擬機或是實體機,全經由所在的Cluster進行配置,而Node裏頭主要分幾個部分。
Kubelet: Node的管理員,負責管理Node確保Pod的運行狀態及健康。
kube proxy: 負責網路代理,實現K8s當中Service的概念,其中LoadBalancer就是這邊實現的。
CRI(Container Runtime Interface): 負責Kubelet與Pod運行時的通信接口
Pod: 為最小的可部屬單位,負責下載容器並運行容器,Pod可以由一個或多個容器(Container)組成,好比說如果要在一個Pod去運行兩個服務(Redis跟Mysql),是可以做得到的,但為何不建議呢?
獨立運行環境
- 兩種服務通常有不同的資源需求(CPU、內存、儲存)以及運行特性。
- 分開部屬可以更靈活的應用分配資源,避免一個服務使用的資源過高影響到另一個服務。
彈性擴展
- Redis有高性能低延遲的特性,會需要進行水平擴展(Horizontal Pod Autoscaling, HPA)。
- Mysql會因為容量不足增加內存與儲存容量,則需要垂直擴展(Vertical Pod Autoscaling,VPA)。
最佳使用方法
- Kubernetes 的設計哲學是「每個 Pod 應該專注於一個任務」。
- 將 Redis 和 MySQL 分開放在單獨的 Pod 中符合微服務架構的理念。
Control Plane Components
kube-api-server: 作為內外接受介面,負責接受請求並觸發操作,可以說是Control Plance的前端。
etcd: K8s的儲存功能,是儲存Cluster的後臺數據庫,裡面包含設置及敏感資料。
kube-scheduler: 作為控制組建,主要負責調度服務,包括監視以及決定新的Pods到指定的Node上面運行。
kube-controller-manager: 透過多個控制器來調節系統狀態。
Node Controller: 負責在Node出現故障時進行通知與處理。
Job Controller: 監測一次性任務的Job對象,然後創建Pod來運行這些任務直到完成。
EndpointSlice Controller: 提供Service與Pod之間的連結。
ServiceAccount Controller: 為新的命名空間創建默認的ServiceAccount。
cloud-controller-manager: 連結cluster到特定的雲服務之上並嵌入特定的控制邏輯,如果部屬在本地了話,Cluter不包含此組件。
前置
- 在容器方面我們選擇我們的老朋友Docker來建置,之後到設定將Enable Kubernetes打勾,之後他就會下載需要啟動cluster(叢集)的相關Image。
- 跑完後可以看看左下角的K8s的Icon是不是亮綠燈。
- 下載符合個人作業系統的minikube,他可以更簡潔的使用K8s功能,好讓我們專注於學習部屬的知識。
前端
Vue + Vite + Pinia + TypeScript
後端
各項專案連結
這邊直接附上前後端專案的鏈結,有興趣的可以點開專案了解架構設計,部屬文件有額外的註解。
Frontend Service
Backend Service
Deploy
開啟Minikube Dashboard
1
$ minikube dashboard
之後啟動成功,就可以進入Dashboard查看所有服務的目前狀況、文件配置,或是直接在上面進行操作也行,相當好用。
Clone Deploy File
載下來後,在終端輸入下面的指令,他會依序建立起所有的服務。
1
$ kubectl apply -k kustomize
測試
當所有容器運行正常,我們可以直接expose一個對外IP去瀏覽前端頁面。
1
$ minikube service frontend-service -n todolist
之後會返回一個URL,就可以看到前端的畫面了。
結語
由於目前整套流程是設計給本地部屬,而K8s強大的還是有多家雲端服務的支援,就目前使用到的技術來說,真的只是冰山一角,如果往下窺探會發現有太多的東西要碰,但有了初步的認識後對於未來的學習會更有幫助,另外有整理一些常用的指令先方在這邊,之後來依序介紹提供的API有哪些。