天天看點

松勤軟體測試:深入微服務架構 | 微服務與k8s架構解讀

作者:松勤小豬

微服務項目架構解讀

① 什麼是微服務?

微服務是指開發一個單個小型的但有業務功能的服務,每個服務都有自己的處理和輕量通訊機制,可以部署在單個或多個伺服器上。

微服務也指一種種松耦合的、有一定的有界上下文的面向服務架構。也就是說,如果每個服務都要同時修改,那麼它們就不是微服務,因為它們緊耦合在一起;如果你需要掌握一個服務太多的上下文場景使用條件,那麼它就是一個有上下文邊界的服務,這個定義來自DDD領域驅動設計。

它的主要特點是元件化、松耦合、自治、去中心化,展現在以下幾個方面:

  • 一組小的服務
  • 服務粒度要小,而每個服務是針對一個單一職責的業務能力的封裝,專注做好一件事情。
  • 獨立部署運作和擴充
  • 每個服務能夠獨立被部署并運作在一個程序内。這種運作和部署方式能夠賦予系統靈活的代碼組織方式和釋出節奏,使得快速傳遞和應對變化成為可能。
  • 獨立開發和演化
  • 技術選型靈活,不受遺留系統技術限制。合适的業務問題選擇合适的技術可以獨立演化。服務與服務之間采取與語言無關的API進行內建。相對單體架構,微服務架構是更面向業務創新的一種架構模式。
  • 獨立團隊和自治
  • 團隊對服務的整個生命周期負責,工作在獨立的上下文中,自己決策自己治理,而不需要統一的指揮中心。團隊和團隊之間通過松散的社群部落進行銜接。

我們可以看到整個微服務的思想就如我們現在面對資訊爆炸、知識爆炸是一樣的:通過解耦我們所做的事情,分而治之以減少不必要的損耗,使得整個複雜的系統群組織能夠快速的應對變化。

② 微服務的優點

  • 每個微服務都很小,這樣能聚焦一個指定的業務功能或業務需求。
  • 微服務能夠被小團隊單獨開發,這個小團隊是2到5人的開發人員組成。
  • 微服務是松耦合的,是有功能意義的服務,無論是在開發階段或部署階段都是獨立的。
  • 微服務能使用不同的語言開發。
  • 微服務允許容易且靈活的方式內建自動部署,通過持續內建工具,如Jenkins, bamboo 。
  • 一個團隊的新成員能夠更快投入生産。
  • 微服務易于被一個開發人員了解,修改和維護,這樣小團隊能夠更關注自己的工作成果。無需通過合作才能展現價值。
  • 微服務允許你利用融合最新技術。
  • 微服務隻是業務邏輯的代碼,不會和HTML,CSS 或其他界面元件混合。
  • 微服務能夠即時被要求擴充。
  • 微服務能部署中低端配置的伺服器上。
  • 易于和第三方內建。
  • 每個微服務都有自己的存儲能力,可以有自己的資料庫。也可以有統一資料庫。

k8s叢集架構解讀

① 什麼是kubernetes

Kubernetes(k8s)是Google開源的容器叢集管理系統(谷歌内部:Borg)。在Docker技術的基礎上,為容器化的應用提供部署運作、資源排程、服務發現和動态伸縮等一系列完整功能,提高了大規模容器叢集管理的便捷性。Kubernetes優勢:

  • 容器編排
  • 輕量級
  • 開源
  • 彈性伸縮
  • 負載均衡

② Kubernetes架構群組件

松勤軟體測試:深入微服務架構 | 微服務與k8s架構解讀

主從分布式架構,Master/Node

  • 服務分組,小叢集,多叢集
  • 服務分組,大叢集,單叢集

Kubernetes Master / Node : 如果大家對諸如hadoop這樣的分布式叢集有所了解,就會發現k8s的設計理念和其他分布式架構的非常類似的:Master節點負責接收使用者的指令、配置設定任務以及記錄各個node的情況;而node節點負責接收Master的指令,啟動相應的Pod(k8s的最小執行單元,是一個Container的集合)

安裝k8s時會指定Master和Node節點,部署好之後,我們通過k8s的api與Master節點進行互動。Master節點收到了我們的指令(比如新啟動一個Pod),會排程Node節點去完成它們。當然,其中底層的排程政策、具體的實作細節對于我們使用者來說都是隐蔽的,不需要我們去了解。

master工作流程圖

松勤軟體測試:深入微服務架構 | 微服務與k8s架構解讀

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叢集互動,讀取配置資訊。

具體的工作如下:

  1. 設定容器的環境變量、給容器綁定Volume、給容器綁定Port、根據指定的Pod運作一個單一容器、給指定的Pod建立network 容器。
  2. 同步Pod的狀态、同步Pod的狀态、從cAdvisor擷取container info、 pod info、 root info、 machine info。
  3. 在容器中運作指令、殺死容器、删除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           

繼續閱讀