Kubernetes-整體概述和架構(gòu)

1、Kubernetes是什么

Kubernetes是一個輕便的和可擴(kuò)展的開源平臺,用于管理容器化應(yīng)用和服務(wù)。通過Kubernetes能夠進(jìn)行應(yīng)用的自動化部署和擴(kuò)縮容。在Kubernetes中,會將組成應(yīng)用的容器組合成一個邏輯單元以更易管理和發(fā)現(xiàn)。Kubernetes積累了作為Google生產(chǎn)環(huán)境運(yùn)行工作負(fù)載15年的經(jīng)驗(yàn),并吸收了來自于社區(qū)的最佳想法和實(shí)踐。Kubernetes經(jīng)過這幾年的快速發(fā)展,形成了一個大的生態(tài)環(huán)境,Google在2014年將Kubernetes作為開源項(xiàng)目。Kubernetes的關(guān)鍵特性包括:

自動化裝箱:在不犧牲可用性的條件下,基于容器對資源的要求和約束自動部署容器。同時,為了提高利用率和節(jié)省更多資源,將關(guān)鍵和最佳工作量結(jié)合在一起。

自愈能力:當(dāng)容器失敗時,會對容器進(jìn)行重啟;當(dāng)所部署的Node節(jié)點(diǎn)有問題時,會對容器進(jìn)行重新部署和重新調(diào)度;當(dāng)容器未通過監(jiān)控檢查時,會關(guān)閉此容器;直到容器正常運(yùn)行時,才會對外提供服務(wù)。

水平擴(kuò)容:通過簡單的命令、用戶界面或基于CPU的使用情況,能夠?qū)?yīng)用進(jìn)行擴(kuò)容和縮容。

服務(wù)發(fā)現(xiàn)和負(fù)載均衡:開發(fā)者不需要使用額外的服務(wù)發(fā)現(xiàn)機(jī)制,就能夠基于Kubernetes進(jìn)行服務(wù)發(fā)現(xiàn)和負(fù)載均衡。

自動發(fā)布和回滾:Kubernetes能夠程序化的發(fā)布應(yīng)用和相關(guān)的配置。如果發(fā)布有問題,Kubernetes將能夠回歸發(fā)生的變更。

保密和配置管理:在不需要重新構(gòu)建鏡像的情況下,可以部署和更新保密和應(yīng)用配置。

存儲編排:自動掛接存儲系統(tǒng),這些存儲系統(tǒng)可以來自于本地、公共云提供商(例如:GCP和AWS)、網(wǎng)絡(luò)存儲(例如:NFS、iSCSI、Gluster、Ceph、Cinder和Floker等)。

2、Kubernetes的整體架構(gòu)

Kubernetes屬于主從分布式架構(gòu),主要由Master Node和Worker?Node組成,以及包括客戶端命令行工具kubectl和其它附加項(xiàng)。

Master Node:作為控制節(jié)點(diǎn),對集群進(jìn)行調(diào)度管理;Master Node由API Server、Scheduler、Cluster?State Store和Controller-Manger Server所組成;

Worker?Node:作為真正的工作節(jié)點(diǎn),運(yùn)行業(yè)務(wù)應(yīng)用的容器;Worker Node包含kubelet、kube proxy和Container Runtime;

kubectl:用于通過命令行與API Server進(jìn)行交互,而對Kubernetes進(jìn)行操作,實(shí)現(xiàn)在集群中進(jìn)行各種資源的增刪改查等操作;

Add-on:是對Kubernetes核心功能的擴(kuò)展,例如增加網(wǎng)絡(luò)和網(wǎng)絡(luò)策略等能力。

Kubernetes主要由以下幾個核心組件組成:

etcd保存了整個集群的狀態(tài);

apiserver提供了資源操作的唯一入口,并提供認(rèn)證、授權(quán)、訪問控制、API注冊和發(fā)現(xiàn)等機(jī)制;

controller manager負(fù)責(zé)維護(hù)集群的狀態(tài),比如故障檢測、自動擴(kuò)展、滾動更新等;

scheduler負(fù)責(zé)資源的調(diào)度,按照預(yù)定的調(diào)度策略將Pod調(diào)度到相應(yīng)的機(jī)器上;

kubelet負(fù)責(zé)維護(hù)容器的生命周期,同時也負(fù)責(zé)Volume(CVI)和網(wǎng)絡(luò)(CNI)的管理;

Container runtime負(fù)責(zé)鏡像管理以及Pod和容器的真正運(yùn)行(CRI);

kube-proxy負(fù)責(zé)為Service提供cluster內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡;

除了核心組件,還有一些推薦的Add-ons:

kube-dns負(fù)責(zé)為整個集群提供DNS服務(wù)

Ingress Controller為服務(wù)提供外網(wǎng)入口

Heapster提供資源監(jiān)控

Dashboard提供GUI

Federation提供跨可用區(qū)的集群

Fluentd-elasticsearch提供集群日志采集、存儲與查詢

2 Master Node(主節(jié)點(diǎn))

2.1 API Server(API服務(wù)器)

API Server主要用來處理REST的操作,確保它們生效,并執(zhí)行相關(guān)業(yè)務(wù)邏輯,以及更新etcd(或者其他存儲)中的相關(guān)對象。API Server是所有REST命令的入口,它的相關(guān)結(jié)果狀態(tài)將被保存在etcd(或其他存儲)中。API Server的基本功能包括:

REST語義,監(jiān)控,持久化和一致性保證,API 版本控制,放棄和生效

內(nèi)置準(zhǔn)入控制語義,同步準(zhǔn)入控制鉤子,以及異步資源初始化

API注冊和發(fā)現(xiàn)

另外,API Server也作為集群的網(wǎng)關(guān)。默認(rèn)情況,客戶端通過API Server對集群進(jìn)行訪問,客戶端需要通過認(rèn)證,并使用API Server作為訪問Node和Pod(以及service)的堡壘和代理/通道。

2.2 Cluster state store(集群狀態(tài)存儲)

Kubernetes默認(rèn)使用etcd作為集群整體存儲,當(dāng)然也可以使用其它的技術(shù)。etcd是一個簡單的、分布式的、一致的key-value存儲,主要被用來共享配置和服務(wù)發(fā)現(xiàn)。etcd提供了一個CRUD操作的REST API,以及提供了作為注冊的接口,以監(jiān)控指定的Node。集群的所有狀態(tài)都存儲在etcd實(shí)例中,并具有監(jiān)控的能力,因此當(dāng)etcd中的信息發(fā)生變化時,就能夠快速的通知集群中相關(guān)的組件。

2.3 Controller-Manager Server(控制管理服務(wù)器)

Controller-Manager Serve用于執(zhí)行大部分的集群層次的功能,它既執(zhí)行生命周期功能(例如:命名空間創(chuàng)建和生命周期、事件垃圾收集、已終止垃圾收集、級聯(lián)刪除垃圾收集、node垃圾收集),也執(zhí)行API業(yè)務(wù)邏輯(例如:pod的彈性擴(kuò)容)??刂乒芾硖峁┳杂芰?、擴(kuò)容、應(yīng)用生命周期管理、服務(wù)發(fā)現(xiàn)、路由、服務(wù)綁定和提供。Kubernetes默認(rèn)提供Replication Controller、Node Controller、Namespace Controller、Service Controller、Endpoints Controller、Persistent Controller、DaemonSet Controller等控制器。

2.4 Scheduler(調(diào)度器)

scheduler組件為容器自動選擇運(yùn)行的主機(jī)。依據(jù)請求資源的可用性,服務(wù)請求的質(zhì)量等約束條件,scheduler監(jiān)控未綁定的pod,并將其綁定至特定的node節(jié)點(diǎn)。Kubernetes也支持用戶自己提供的調(diào)度器,Scheduler負(fù)責(zé)根據(jù)調(diào)度策略自動將Pod部署到合適Node中,調(diào)度策略分為預(yù)選策略和優(yōu)選策略,Pod的整個調(diào)度過程分為兩步:

1)預(yù)選Node:遍歷集群中所有的Node,按照具體的預(yù)選策略篩選出符合要求的Node列表。如沒有Node符合預(yù)選策略規(guī)則,該P(yáng)od就會被掛起,直到集群中出現(xiàn)符合要求的Node。

2)優(yōu)選Node:預(yù)選Node列表的基礎(chǔ)上,按照優(yōu)選策略為待選的Node進(jìn)行打分和排序,從中獲取最優(yōu)Node。

3、Worker Node(從節(jié)點(diǎn))

3.1 Kubelet

Kubelet是Kubernetes中最主要的控制器,它是Pod和Node API的主要實(shí)現(xiàn)者,Kubelet負(fù)責(zé)驅(qū)動容器執(zhí)行層。在Kubernetes中,應(yīng)用容器彼此是隔離的,并且與運(yùn)行其的主機(jī)也是隔離的,這是對應(yīng)用進(jìn)行獨(dú)立解耦管理的關(guān)鍵點(diǎn)。

在Kubernets中,Pod作為基本的執(zhí)行單元,它可以擁有多個容器和存儲數(shù)據(jù)卷,能夠方便在每個容器中打包一個單一的應(yīng)用,從而解耦了應(yīng)用構(gòu)建時和部署時的所關(guān)心的事項(xiàng),已經(jīng)能夠方便在物理機(jī)/虛擬機(jī)之間進(jìn)行遷移。API準(zhǔn)入控制可以拒絕或者Pod,或者為Pod添加額外的調(diào)度約束,但是Kubelet才是Pod是否能夠運(yùn)行在特定Node上的最終裁決者,而不是scheduler或者DaemonSet。kubelet默認(rèn)情況使用cAdvisor進(jìn)行資源監(jiān)控。負(fù)責(zé)管理Pod、容器、鏡像、數(shù)據(jù)卷等,實(shí)現(xiàn)集群對節(jié)點(diǎn)的管理,并將容器的運(yùn)行狀態(tài)匯報(bào)給Kubernetes API Server。

3.2 Container Runtime(容器運(yùn)行時)

每一個Node都會運(yùn)行一個Container Runtime,其負(fù)責(zé)下載鏡像和運(yùn)行容器。Kubernetes本身并不停容器運(yùn)行時環(huán)境,但提供了接口,可以插入所選擇的容器運(yùn)行時環(huán)境。kubelet使用Unix socket之上的gRPC框架與容器運(yùn)行時進(jìn)行通信,kubelet作為客戶端,而CRI shim作為服務(wù)器。

protocol buffers API提供兩個gRPC服務(wù),ImageService和RuntimeService。ImageService提供拉取、查看、和移除鏡像的RPC。RuntimeSerivce則提供管理Pods和容器生命周期管理的RPC,以及與容器進(jìn)行交互(exec/attach/port-forward)。容器運(yùn)行時能夠同時管理鏡像和容器(例如:Docker和Rkt),并且可以通過同一個套接字提供這兩種服務(wù)。在Kubelet中,這個套接字通過–container-runtime-endpoint–image-service-endpoint字段進(jìn)行設(shè)置。Kubernetes CRI支持的容器運(yùn)行時包括docker、rkt、cri-o、frankti、kata-containers和clear-containers等。

3.3 kube proxy

基于一種公共訪問策略(例如:負(fù)載均衡),服務(wù)提供了一種訪問一群pod的途徑。此方式通過創(chuàng)建一個虛擬的IP來實(shí)現(xiàn),客戶端能夠訪問此IP,并能夠?qū)⒎?wù)透明的代理至Pod。每一個Node都會運(yùn)行一個kube-proxy,kube proxy通過iptables規(guī)則引導(dǎo)訪問至服務(wù)IP,并將重定向至正確的后端應(yīng)用,通過這種方式kube-proxy提供了一個高可用的負(fù)載均衡解決方案。服務(wù)發(fā)現(xiàn)主要通過DNS實(shí)現(xiàn)。

在Kubernetes中,kube proxy負(fù)責(zé)為Pod創(chuàng)建代理服務(wù);引到訪問至服務(wù);并實(shí)現(xiàn)服務(wù)到Pod的路由和轉(zhuǎn)發(fā),以及通過應(yīng)用的負(fù)載均衡。

3、kubectl

kubectl是Kubernetes集群的命令行接口。運(yùn)行kubectl命令的語法如下所示:

$ kubectl?[command]?[TYPE]?[NAME]?[flags]

這里的command,TYPE、NAME和flags為:

comand:指定要對資源執(zhí)行的操作,例如create、get、describe和delete

TYPE:指定資源類型,資源類型是大小學(xué)敏感的,開發(fā)者能夠以單數(shù)、復(fù)數(shù)和縮略的形式。例如:

$ kubectlgetpod pod1

$ kubectlgetpods pod1

$ kubectlgetpo pod1

NAME:指定資源的名稱,名稱也大小寫敏感的。如果省略名稱,則會顯示所有的資源,例如:

$kubectlgetpods

flags:指定可選的參數(shù)。例如,可以使用-s或者–server參數(shù)指定Kubernetes API server的地址和端口。

另外,可以通過運(yùn)行kubectl help命令獲取更多的信息。

4 附加項(xiàng)和其他依賴

在Kunbernetes中可以以附加項(xiàng)的方式擴(kuò)展Kubernetes的功能,目前主要有網(wǎng)絡(luò)、服務(wù)發(fā)現(xiàn)和可視化這三大類的附加項(xiàng),下面是可用的一些附加項(xiàng):

4.4.1 網(wǎng)絡(luò)和網(wǎng)絡(luò)策略

ACI?通過與Cisco ACI集成的容器網(wǎng)絡(luò)和網(wǎng)絡(luò)安全。

Calico?是一個安全的3層網(wǎng)絡(luò)和網(wǎng)絡(luò)策略提供者。

Canal?聯(lián)合Fannel和Calico,通過網(wǎng)絡(luò)和網(wǎng)絡(luò)側(cè)。

Cilium?是一個3層網(wǎng)絡(luò)和網(wǎng)絡(luò)側(cè)插件,它能夠透明的加強(qiáng)HTTP/API/L7 策略。其即支持路由,也支持overlay/encapsultion模式。

Flannel?是一個overlay的網(wǎng)絡(luò)提供者。

4.4.2 服務(wù)發(fā)現(xiàn)

CoreDNS?是一個靈活的,可擴(kuò)展的DNS服務(wù)器,它能夠作為Pod集群內(nèi)的DNS進(jìn)行安裝。

Ingress 提供基于Http協(xié)議的路由轉(zhuǎn)發(fā)機(jī)制。

4.4.3 可視化&控制

Dashboard?是Kubernetes的web用戶界面。

分層架構(gòu)

Kubernetes設(shè)計(jì)理念和功能其實(shí)就是一個類似Linux的分層架構(gòu),如下圖所示

核心層:Kubernetes最核心的功能,對外提供API構(gòu)建高層的應(yīng)用,對內(nèi)提供插件式應(yīng)用執(zhí)行環(huán)境

應(yīng)用層:部署(無狀態(tài)應(yīng)用、有狀態(tài)應(yīng)用、批處理任務(wù)、集群應(yīng)用等)和路由(服務(wù)發(fā)現(xiàn)、DNS解析等)

管理層:系統(tǒng)度量(如基礎(chǔ)設(shè)施、容器和網(wǎng)絡(luò)的度量),自動化(如自動擴(kuò)展、動態(tài)Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)

接口層:kubectl命令行工具、客戶端SDK以及集群聯(lián)邦

生態(tài)系統(tǒng):在接口層之上的龐大容器集群管理調(diào)度的生態(tài)系統(tǒng),可以劃分為兩個范疇

Kubernetes外部:日志、監(jiān)控、配置管理、CI、CD、Workflow、FaaS、OTS應(yīng)用、ChatOps等

Kubernetes內(nèi)部:CRI、CNI、CVI、鏡像倉庫、Cloud Provider、集群自身的配置和管理等

參考資料

《kubenetes Design and Architecture》地址:https://github.com/kubernetes/community/blob/master/contributors/design-proposals/architecture/architecture.md

《Overview of kubectl》地址:https://kubernetes.io/docs/reference/kubectl/overview/

《Installing Add-ons》地址:https://kubernetes.io/docs/concepts/cluster-administration/addons/

《Introducing Container Runtime Interface (CRI) in Kubernetes》地址:https://kubernetes.io/blog/2016/12/container-runtime-interface-cri-in-kubernetes/

《Alternative Container Runtimes in Kubernetes》地址:https://www.infoq.com/news/2017/04/alternative-kubernetes-runtimes

《Kubernetes CRI and Minikube》地址:https://sreeninet.wordpress.com/2017/02/11/kubernetes-cri-and-minikube/

《CRI: the Container Runtime Interface》地址:https://github.com/kubernetes/community/blob/master/contributors/devel/container-runtime-interface.md

《Frakti》地址:https://github.com/kubernetes/frakti

《docker、oci、runc以及kubernetes梳理》地址:https://www.cnblogs.com/xuxinkun/p/8036832.html

《Kubernetes Containerd集成進(jìn)入GA階段》地址:https://www.sohu.com/a/233247128_198222

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容