掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
作者:不焦躁的程序員 2023-09-05 23:38:36
云計算 Kubernetes有哪些核心部件,架構圖和流程圖又是怎樣的,kubectl和kubelet經(jīng)常分不清,聲明式API和命令式API又有什么區(qū)別,本文一一詳說。

成都創(chuàng)新互聯(lián)主營大寧網(wǎng)站建設的網(wǎng)絡公司,主營網(wǎng)站建設方案,成都App定制開發(fā),大寧h5重慶小程序開發(fā)搭建,大寧網(wǎng)站營銷推廣歡迎大寧等地區(qū)企業(yè)咨詢
Kubernetes有哪些核心部件,架構圖和流程圖又是怎樣的,kubectl和kubelet經(jīng)常分不清,聲明式API和命令式API又有什么區(qū)別,本文一一詳說。
Kubernetes 是一個容器編排平臺,它使用共享網(wǎng)絡將多個主機(物理服務器或虛擬機)構建成集群。分為 Master Node(主節(jié)點)和Worker Node(工作節(jié)點),Master負責管理整個集群,Worker 負責接收請求并以Pod(容器集合)形式運行工作負載。下圖為Kubernetes 集群工作模式示意圖。
Master是集群的網(wǎng)關和中樞,負責為客戶端提供API接口調用、確保各資源對象不斷地接近用戶期望的狀態(tài)、并以最優(yōu)的方式調度Pod到指定Node,以及編排其他組件之間的通信等任務,它是客戶端訪問集群的唯一入口。生產(chǎn)環(huán)境通常部署多個Master,為了冗余和負載均衡。
Worker Node負責接收來自 Master 下發(fā)的指令并相應創(chuàng)建或銷毀Pod 對象,以及路由、流量轉發(fā)等任務。在生產(chǎn)環(huán)境中,隨著微服務的增多或者業(yè)務應用的擴容,Worker會隨之增多。
概括來說,Kubernetes將所有工作節(jié)點的資源(CPU、磁盤、內存、網(wǎng)絡等)集合在一起形成了一臺更加強大的“服務器”,通過Master上的API接口暴露集群的計算和存儲接口,再由 Master通過調度算法將客戶端請求的工作負載指派至特定的Node上,并且Master 會自動處理因Worker Node的添加、故障、或移除等變動對 Pod 的影響。
Kubernetes是構建在底層主機集群之上的“云原生應用操作系統(tǒng)”,而容器是運行在其上的進程。
Kubernetes 中每個對象都使用 “名稱”作為其唯一標識符,出于名稱的隔離和復用、資源隔離的目的,使用“Namespace” 作為作用域。
在開發(fā)云原生應用時,主要使用聲明式API,這種方式簡單易用,程序員朋友可以更好地集中精力開發(fā)業(yè)務。
在運行應用時,用戶只需要通過 API聲明業(yè)務應用的最終狀態(tài)(例如為 Nginx 應用運行 6個實例等),Kubernetes 便能完成后續(xù)的所有任務,包括應用本身的運行實例數(shù)量、路由策略、訪問策略以及存儲等。
以下為某個聲明式y(tǒng)aml的示例,Kubernetes 也支持使用命令行工具 kubectl 提交請求。
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: test
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
Kubernetes 屬于Server-Client架構,Master Node主要由API Server(kube-apiserver)、 Controller-Manager(Kube-controller-manager)和 Scheduler(kube-scheduler)這3個組件,以及一個用于存儲集群狀態(tài)的 etcd 存儲服務組成,它們構成整個集群的控制平面;
而Worker Node則主要包含 kubelet、kube-proxy及容器運行時(以前Docker是常用的實現(xiàn))3個組件,它們承載運行各類應用容器。各組件如下圖所示:
Master是集群的大腦,它維護了Kubernetes 的所有對象記錄,負責管理對象狀態(tài)、并響應集群中各種資源對象的管理操作,以及確保各資源對象的 實際狀態(tài) 與 所需狀態(tài) 相匹配??刂破矫娓鹘M件及其主要功能如下:
API Server 是Kubernetes 控制平面的前端,支持不同類型應用的生命周期編排,包括部署、縮放和滾動更新等。它還是整個集群的網(wǎng)關接口,用于接收、校驗以及響應所有的REST請求,并將結果狀態(tài)存儲到(etcd)中。
Kubernetes集群的所有狀態(tài)信息都需要存儲于etcd 中。etcd 是分布式鍵值存儲,可用于服務發(fā)現(xiàn)、共享配置以及一致性保障 (如數(shù)據(jù)庫主節(jié)點選擇、分布式等)。
etcd還為其存儲的數(shù)據(jù)提供了監(jiān)聽 (warch)機制,用于監(jiān)聽和推送變更。API Server是Kubernetes集群中唯一能夠與etcd通信的組件,它封裝了這種監(jiān)聽機制,并借此同其他各組件高效協(xié)同。這一點類似于多個應用服務器借助zookeeper協(xié)同。
控制器負責實現(xiàn)客戶端通過 API Server 提交的請求,它驅動API 對象的當前狀態(tài)逼近期望狀態(tài)。Kubernetes 提供了驅動 Node、Pod 、 Server、Endpoint、ServiceAccount 和 Token 等數(shù)十種類型對象的控制器。
Kubernetes 系統(tǒng)上的調度是指為 API Server 接收到的每一個Pod 創(chuàng)建請求,并在集群中為其匹配出一個最佳工作節(jié)點。kube-scheduler 是默認調度器程序,它調度時的考量因素包括:硬件、軟件與策略約束、親和與反親和、污點等特征。
Worker Node 組件是集群的體力勞動者,為了保證有足夠的資源運行成百上千個容器化應用,一個集群通常會有多個 Worker Node 。每個Node 會定期向 Master 報告自身的狀態(tài)變動,并接受 Master 的管理。
kubelet 是 Kubernetes 中最重要的組件之一,是運行于每個 Node之上的“節(jié)點代理”服務,負責接收并執(zhí)行 Master 發(fā)來的指令,以及管理當前 Node 上 Pod 對象的容器等任務。它支持從 API Server 接收 Pod 資源定義,并通過 容器運行時 去創(chuàng)建、啟動和監(jiān)視容器。
kubelet 會持續(xù)監(jiān)視當前節(jié)點上各Pod 的健康狀態(tài),并在任何 Pod 出現(xiàn)問題時將其重建。同時也會及時跟Master通信,將自身情況上報于Master。
Pod 是一組容器集合,真正負責運行容器的是底層的 容器運行時 。kubelet 通過 CRI(容器運行時接口)可支持多種類型的 OCI 容器運行時,例如 docker、containerd、CRI-O、runC、Kata等。
kube-proxy 是需要運行于集群中每個節(jié)點之上的服務進程,它把 API Server 上的Service 資源對象轉換為當前節(jié)點上的 iptables 或(與)ipvs 規(guī)則,這些規(guī)則 能夠將那些 發(fā)往Service 對象 ClusterIP 的流量 分發(fā)至它后端的 Pod 端點之上。
kube-proxy是 Kubernetes的核心網(wǎng)絡組件,它本質上更像是Pod 的代理及負載均衡器,負責確保集群中 Node、Service 和Pod 對象之間的通信。
如上圖所示:
常用的核心擴展部件包括如下幾個:
網(wǎng)絡插件是必要部件,常用的有Flannel、Calico等。我主要使用Calico ,云廠商一般是結合VPC有自己的一套實現(xiàn)。
Kubernetes使用DNS應用程序實現(xiàn)名稱解析和服務發(fā)現(xiàn)功能,它自1.11 版本起默認使用 CoreDNS。之前的版本中用到的是kube-dns。
一套WebUI,用于可視化 Kubernetes集群。Dashboard可用于獲取集群中資源對象的詳細信息,例如集群中的 Node、Namespace、 Volume、ClusterRole 和Job 等,也可以創(chuàng)建或者修改這些資源對象。
監(jiān)控系統(tǒng)是分布式應用的重要基礎設施,Kubernetes常用的指標監(jiān)控部件有Metrics-Server、Prometheus 等。
日志系統(tǒng)是構建可觀測分布式應用的基礎設施,有助于幫助開發(fā)人員發(fā)現(xiàn)和定位問題。Kubernetes 常用的日志系統(tǒng)是由ElasticSearch、Fluentd 和 Kibana(EFK) 組合提供的解決方案,或者使用ELK等方案。
Ingress資源是 Kubernetes 將集群外部 HTTP流量引入到集群內部的資源類型,它僅用于控制流量的規(guī)則和配置的集合,它不能進行“流量穿透”,要通過Ingress控制器發(fā)揮作用。常用的Ingress控制器有Nginx等。
在以上這些附件中,CoreDNS、監(jiān)控系統(tǒng)、日志系統(tǒng)和 Ingress 控制器,這種基礎支撐類服務一般安裝在集群內部。而Dashboard是提高用戶效率和體驗的可視化工具,一般在集群外部獨立安裝。
一個注重結果,一個注重過程。
聲明式(declarative)編程:著重于最終結果,如何達成結果則要依賴于給定語言的基礎組件能力,程序員只需要指定做什么而非如何去做;聲明式編程常用于數(shù)據(jù)庫和配置管理軟件中,關系型數(shù)據(jù)庫的SQL語言便是最典型的代表之一。
命令式(imperative)編程:稱為過程式編程更合適,它需要由程序員指定做事情的具體步驟,更注重如何達成結果的過程。
初學者經(jīng)常分不清kubectl和kubelet的區(qū)別,通過上文可以知道:
kubectl是一個Kubernetes輕量級的客戶端,用于調用Api-Server的接口,一般安裝在Master節(jié)點。
kubelet是安裝在每個Node節(jié)點上的代理,用于與Master高效通信,以及完成Master下發(fā)的任務、以及上報任務和自身的情況。

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流