K8S | 核心原理分析

2023-06-06 09:00:53

整體上理解流程和原理;

一、背景

基於分散式的架構中,需要管理的服務是非常多的,無論是服務的數量還是體系劃分;

從服務的能力上看,可以進行分層管控,只是其中有相當一部分服務層,改動更新的頻率很低,所以感知也不明顯;

就以自己當下參與研發的系統來說;

通過K8S進行管理的服務近百個,這中間有部分服務採用叢集模式,即便是這個規模的系統,也幾乎不可能依賴純人工運維的形式,自動化流程必不可少;

二、持續整合

此前圍繞該主題寫過一個完整的實踐案例,主要圍繞Jenkins、Docker、K8S等元件的使用層面,總結原始碼編譯、打包、映象構建、部署等自動化管理的流程;

Jenkins:是一個擴充套件性非常強的軟體,用於自動化各種任務,包括構建、測試和部署等;

Docker:作為開源的應用容器引擎,可以把應用程式和其相關依賴打包生成一個Image映象檔案,是一個標準的執行環境,提供可持續交付的能力;

Kubernetes:作為開源的容器編排引擎,用來對容器化應用進行自動化部署、 擴縮和管理;

三、K8S架構

1、核心元件

Control-Plane-Components:控制平面元件

對叢集做出全域性決策,例如:資源排程、檢測、事件響應,可以在叢集中的任何節點上執行;

  • api:開放K8S的API,元件之間通過API互動,相當於控制面的前端;
  • controllermanager:執行控制器程序,邏輯上是一個單獨的程序;
  • scheduler:監聽新建未指定執行節點的Pods,併為Pod選擇執行節點;
  • etcd:兼具一致性和高可用性的鍵值資料庫,作為儲存K8S資料的後臺庫;

Node:節點元件

該元件會在每個節點上執行,負責維護執行的Pod並提供Kubernetes執行環境;

  • kubelet:在每個節點上執行的代理,保證容器都執行在Pod中;
  • kube-proxy:每個節點上執行的網路代理, 維護節點上的網路規則;

Container-Runtime:容器執行時

負責執行容器的軟體,支援Docker、containerd、CRI-O等多個容器執行環境,以及任何實現Kubernetes-CRI容器執行環境介面;

2、分層結構

從整體的功能上來考慮,K8S叢集可以分為:使用者、控制平面、節點三個模組;

使用者側:不論是CLI命令列還是UI介面,會與控制面板的APIserver進行互動,APIserver再與其他元件互動,最終執行相應的操作命令;

控制平面:以前也稱為Master,核心元件包括APIserver、controller、scheduler、etcd,主要用來排程整個叢集,以及做出全域性決策;

節點:通過將容器放入在節點上執行的Pod中來執行工作負載,簡單的理解工作負載就是各種應用程式等,節點上的核心元件包括Pod、kubelet、Container-Runtime、kube-proxy等;

3、核心能力

站在研發的視角來看,K8S提供極其強大的應用服務管理能力;

3.1 發現與負載

服務Service可以將執行在一個或一組Pod上的網路應用程式公開為網路服務的方法,通常使用標籤對資源物件進行篩選過濾;

3.2 排程

排程器通過監測機制來發現叢集中新建立且尚未被排程到節點上的Pod,由於Pod中的容器和Pod本身可能有不同的資源要求,排程會將Pod放置到合適的節點上;

3.3 自動伸縮

K8S可以通過指標檢查工作負載的資源需求,例如CPU利用率、響應時長、記憶體利用率、或者其他,從而判斷是否需要執行伸縮,垂直維度可以是更多的資源分配,水平維度可以是更多的叢集部署;

K8S可以自動伸縮,也具備自動修復的能力,當節點故障或者應用服務異常時,會被檢查到,可能會進行節點遷移或者重啟;

四、應用案例

1、服務部署

在此前的實踐案例中,用CLI命令列和指令碼檔案的方式,完成的部署動作,而在整個流程中涉及叢集的多個元件共同作業,多次的通訊和排程;

kubectl create -f pod.yaml

2、互動流程

【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