微服務項目架構解讀
① 什麼是微服務?
微服務是指開發一個單個小型的但有業務功能的服務,每個服務都有自己的處理和輕量通訊機制,可以部署在單個或多個伺服器上。
微服務也指一種種松耦合的、有一定的有界上下文的面向服務架構。也就是說,如果每個服務都要同時修改,那麼它們就不是微服務,因為它們緊耦合在一起;如果你需要掌握一個服務太多的上下文場景使用條件,那麼它就是一個有上下文邊界的服務,這個定義來自DDD領域驅動設計。
它的主要特點是元件化、松耦合、自治、去中心化,展現在以下幾個方面:
- 一組小的服務
- 服務粒度要小,而每個服務是針對一個單一職責的業務能力的封裝,專注做好一件事情。
- 獨立部署運作和擴充
- 每個服務能夠獨立被部署并運作在一個程序内。這種運作和部署方式能夠賦予系統靈活的代碼組織方式和釋出節奏,使得快速傳遞和應對變化成為可能。
- 獨立開發和演化
- 技術選型靈活,不受遺留系統技術限制。合适的業務問題選擇合适的技術可以獨立演化。服務與服務之間采取與語言無關的API進行內建。相對單體架構,微服務架構是更面向業務創新的一種架構模式。
- 獨立團隊和自治
- 團隊對服務的整個生命周期負責,工作在獨立的上下文中,自己決策自己治理,而不需要統一的指揮中心。團隊和團隊之間通過松散的社群部落進行銜接。
我們可以看到整個微服務的思想就如我們現在面對資訊爆炸、知識爆炸是一樣的:通過解耦我們所做的事情,分而治之以減少不必要的損耗,使得整個複雜的系統群組織能夠快速的應對變化。
② 微服務的優點
- 每個微服務都很小,這樣能聚焦一個指定的業務功能或業務需求。
- 微服務能夠被小團隊單獨開發,這個小團隊是2到5人的開發人員組成。
- 微服務是松耦合的,是有功能意義的服務,無論是在開發階段或部署階段都是獨立的。
- 微服務能使用不同的語言開發。
- 微服務允許容易且靈活的方式內建自動部署,通過持續內建工具,如Jenkins, bamboo 。
- 一個團隊的新成員能夠更快投入生産。
- 微服務易于被一個開發人員了解,修改和維護,這樣小團隊能夠更關注自己的工作成果。無需通過合作才能展現價值。
- 微服務允許你利用融合最新技術。
- 微服務隻是業務邏輯的代碼,不會和HTML,CSS 或其他界面元件混合。
- 微服務能夠即時被要求擴充。
- 微服務能部署中低端配置的伺服器上。
- 易于和第三方內建。
- 每個微服務都有自己的存儲能力,可以有自己的資料庫。也可以有統一資料庫。
k8s叢集架構解讀
① 什麼是kubernetes
Kubernetes(k8s)是Google開源的容器叢集管理系統(谷歌内部:Borg)。在Docker技術的基礎上,為容器化的應用提供部署運作、資源排程、服務發現和動态伸縮等一系列完整功能,提高了大規模容器叢集管理的便捷性。Kubernetes優勢:
- 容器編排
- 輕量級
- 開源
- 彈性伸縮
- 負載均衡
② Kubernetes架構群組件
主從分布式架構,Master/Node
- 服務分組,小叢集,多叢集
- 服務分組,大叢集,單叢集
Kubernetes Master / Node : 如果大家對諸如hadoop這樣的分布式叢集有所了解,就會發現k8s的設計理念和其他分布式架構的非常類似的:Master節點負責接收使用者的指令、配置設定任務以及記錄各個node的情況;而node節點負責接收Master的指令,啟動相應的Pod(k8s的最小執行單元,是一個Container的集合)
安裝k8s時會指定Master和Node節點,部署好之後,我們通過k8s的api與Master節點進行互動。Master節點收到了我們的指令(比如新啟動一個Pod),會排程Node節點去完成它們。當然,其中底層的排程政策、具體的實作細節對于我們使用者來說都是隐蔽的,不需要我們去了解。
master工作流程圖
Kubecfg将特定的請求,比如建立Pod,發送給Kubernetes Client。
Kubernetes Client将請求發送給API server。
API Server根據請求的類型,比如建立Pod時storage類型是pods,然後依此選擇何種REST Storage API對請求作出處理。
REST Storage API對的請求作相應的處理。
将處理的結果存入高可用鍵值存儲系統Etcd中。
在API Server響應Kubecfg的請求後,Scheduler會根據Kubernetes Client擷取叢集中運作Pod及Minion/Node資訊。
依據從Kubernetes Client擷取的資訊,Scheduler将未分發的Pod分發到可用的Minion/Node節點上。
Kubernetes Node運作節點,運作管理業務容器,包含如下元件:
1.Kubelet負責管控容器,Kubelet會從Kubernetes API Server接收Pod的建立請求,啟動和停止容器,監控容器運作狀态并彙報給Kubernetes API Server。
2.Kubernetes Proxy負責為Pod建立代理服務,Kubernetes Proxy會從Kubernetes API Server擷取所有的Service資訊,并根據Service的資訊建立代理服務,實作Service到Pod的請求路由和轉發,進而實作Kubernetes層級的虛拟轉發網絡。
3.DockerNode上需要運作容器服務。
Kubelet[節點上的Pod管家]
負責Node節點上pod的建立、修改、監控、删除等全生命周期的管理 定時上報本Node的狀态資訊給API Server。
kubelet是Master API Server和Minion/Node之間的橋梁,接收Master API Server配置設定給它的commands和work,通過kube-apiserver間接與Etcd叢集互動,讀取配置資訊。
具體的工作如下:
- 設定容器的環境變量、給容器綁定Volume、給容器綁定Port、根據指定的Pod運作一個單一容器、給指定的Pod建立network 容器。
- 同步Pod的狀态、同步Pod的狀态、從cAdvisor擷取container info、 pod info、 root info、 machine info。
- 在容器中運作指令、殺死容器、删除Pod的所有容器。
③ k8s常用指令
建立資源:
kubectl create -f yaml檔案
檢視資源:
kubectl get <resource_type>
# 比如擷取K8s叢集下pod的資訊
kubectl get pod
# 更加詳細的資訊
kubectl get pod -o wide
#擷取pod更詳盡的狀态資訊
kubectl describe pod pod名稱
#檢視所有的nodes
kubectl get nodes
#檢視所有的namespace
kubectl get pod --all-namespaces
替換資源:
kubectl replace -f yaml檔案
删除資源:
kubectl delete -f yaml檔案
檢視日志:
kubectl logs pod名稱
#如果想動态檢視日志加-f