整體上理解流程和原理;
基於分散式的架構中,需要管理的服務是非常多的,無論是服務的數量還是體系劃分;
從服務的能力上看,可以進行分層管控,只是其中有相當一部分服務層,改動更新的頻率很低,所以感知也不明顯;
就以自己當下參與研發的系統來說;
通過K8S進行管理的服務近百個,這中間有部分服務採用叢集模式,即便是這個規模的系統,也幾乎不可能依賴純人工運維的形式,自動化流程必不可少;
此前圍繞該主題寫過一個完整的實踐案例,主要圍繞Jenkins、Docker、K8S等元件的使用層面,總結原始碼編譯、打包、映象構建、部署等自動化管理的流程;
Jenkins:是一個擴充套件性非常強的軟體,用於自動化各種任務,包括構建、測試和部署等;
Docker:作為開源的應用容器引擎,可以把應用程式和其相關依賴打包生成一個Image映象檔案,是一個標準的執行環境,提供可持續交付的能力;
Kubernetes:作為開源的容器編排引擎,用來對容器化應用進行自動化部署、 擴縮和管理;
Control-Plane-Components:控制平面元件
對叢集做出全域性決策,例如:資源排程、檢測、事件響應,可以在叢集中的任何節點上執行;
Node:節點元件
該元件會在每個節點上執行,負責維護執行的Pod並提供Kubernetes執行環境;
Container-Runtime:容器執行時
負責執行容器的軟體,支援Docker、containerd、CRI-O等多個容器執行環境,以及任何實現Kubernetes-CRI容器執行環境介面;
從整體的功能上來考慮,K8S叢集可以分為:使用者、控制平面、節點三個模組;
使用者側:不論是CLI命令列還是UI介面,會與控制面板的APIserver進行互動,APIserver再與其他元件互動,最終執行相應的操作命令;
控制平面:以前也稱為Master,核心元件包括APIserver、controller、scheduler、etcd,主要用來排程整個叢集,以及做出全域性決策;
節點:通過將容器放入在節點上執行的Pod中來執行工作負載,簡單的理解工作負載就是各種應用程式等,節點上的核心元件包括Pod、kubelet、Container-Runtime、kube-proxy等;
站在研發的視角來看,K8S提供極其強大的應用服務管理能力;
服務Service可以將執行在一個或一組Pod上的網路應用程式公開為網路服務的方法,通常使用標籤對資源物件進行篩選過濾;
排程器通過監測機制來發現叢集中新建立且尚未被排程到節點上的Pod,由於Pod中的容器和Pod本身可能有不同的資源要求,排程會將Pod放置到合適的節點上;
K8S可以通過指標檢查工作負載的資源需求,例如CPU利用率、響應時長、記憶體利用率、或者其他,從而判斷是否需要執行伸縮,垂直維度可以是更多的資源分配,水平維度可以是更多的叢集部署;
K8S可以自動伸縮,也具備自動修復的能力,當節點故障或者應用服務異常時,會被檢查到,可能會進行節點遷移或者重啟;
在此前的實踐案例中,用CLI命令列和指令碼檔案的方式,完成的部署動作,而在整個流程中涉及叢集的多個元件共同作業,多次的通訊和排程;
kubectl create -f pod.yaml
【1】CLI命令列和UI介面,都是通過APIserver介面,與叢集內部元件互動,比如上述的Pod部署操作;
【2】在APIserver收到請求之後,會將序列化狀態的物件寫入到etcd中完成儲存操作;
【3】Scheduler排程器通過監測(Watch)機制來發現叢集中新建立且尚未被排程到節點上的Pod;
【4】在叢集中找到一個Pod的所有可排程節點,對這些可排程節點打分,選出其中得分最高的節點來執行Pod,然後排程器將這個排程決定通知給APIserver;
【5】APIserver完成資訊儲存後,然後通知相應節點的Kubelet;
【6】Kubelet是基於PodSpec來工作的,確保這些PodSpec中描述的容器處於執行狀態且執行狀況良好,每個PodSpec是一個描述Pod的YAML或JSON物件;
【7】Pod是可以在Kubernetes中建立和管理的、最小的可部署的計算單元,包括一個或多個容器;
檔案倉庫:
https://gitee.com/cicadasmile/butte-java-note
指令碼倉庫:
https://gitee.com/cicadasmile/butte-auto-parent