1、Kubernetes是什么
Kubernetes是一個輕便的和可擴展的開源平臺裳扯,用于管理容器化應用和服務夺克。通過Kubernetes能夠進行應用的自動化部署和擴縮容。在Kubernetes中嚎朽,會將組成應用的容器組合成一個邏輯單元以更易管理和發(fā)現(xiàn)。Kubernetes積累了作為Google生產(chǎn)環(huán)境運行工作負載15年的經(jīng)驗柬帕,并吸收了來自于社區(qū)的最佳想法和實踐哟忍。Kubernetes經(jīng)過這幾年的快速發(fā)展,形成了一個大的生態(tài)環(huán)境陷寝,Google在2014年將Kubernetes作為開源項目锅很。Kubernetes的關鍵特性包括:
自動化裝箱:在不犧牲可用性的條件下,基于容器對資源的要求和約束自動部署容器凤跑。同時爆安,為了提高利用率和節(jié)省更多資源,將關鍵和最佳工作量結(jié)合在一起仔引。
自愈能力:當容器失敗時扔仓,會對容器進行重啟;當所部署的Node節(jié)點有問題時咖耘,會對容器進行重新部署和重新調(diào)度翘簇;當容器未通過監(jiān)控檢查時,會關閉此容器儿倒;直到容器正常運行時版保,才會對外提供服務。
水平擴容:通過簡單的命令夫否、用戶界面或基于CPU的使用情況彻犁,能夠?qū)眠M行擴容和縮容。
服務發(fā)現(xiàn)和負載均衡:開發(fā)者不需要使用額外的服務發(fā)現(xiàn)機制凰慈,就能夠基于Kubernetes進行服務發(fā)現(xiàn)和負載均衡汞幢。
自動發(fā)布和回滾:Kubernetes能夠程序化的發(fā)布應用和相關的配置。如果發(fā)布有問題溉瓶,Kubernetes將能夠回歸發(fā)生的變更急鳄。
保密和配置管理:在不需要重新構建鏡像的情況下谤民,可以部署和更新保密和應用配置。
存儲編排:自動掛接存儲系統(tǒng)疾宏,這些存儲系統(tǒng)可以來自于本地张足、公共云提供商(例如:GCP和AWS)、網(wǎng)絡存儲(例如:NFS坎藐、iSCSI为牍、Gluster、Ceph岩馍、Cinder和Floker等)碉咆。
Kubernetes屬于主從分布式架構蛀恩,主要由Master Node和Worker?Node組成疫铜,以及包括客戶端命令行工具kubectl和其它附加項。
Master Node:作為控制節(jié)點双谆,對集群進行調(diào)度管理壳咕;Master Node由API Server、Scheduler顽馋、Cluster?State Store和Controller-Manger Server所組成谓厘;
Worker?Node:作為真正的工作節(jié)點,運行業(yè)務應用的容器寸谜;Worker Node包含kubelet竟稳、kube proxy和Container Runtime;
kubectl:用于通過命令行與API Server進行交互熊痴,而對Kubernetes進行操作他爸,實現(xiàn)在集群中進行各種資源的增刪改查等操作;
Add-on:是對Kubernetes核心功能的擴展愁拭,例如增加網(wǎng)絡和網(wǎng)絡策略等能力讲逛。
Kubernetes主要由以下幾個核心組件組成:
etcd保存了整個集群的狀態(tài);
apiserver提供了資源操作的唯一入口岭埠,并提供認證盏混、授權、訪問控制惜论、API注冊和發(fā)現(xiàn)等機制许赃;
controller manager負責維護集群的狀態(tài),比如故障檢測馆类、自動擴展混聊、滾動更新等;
scheduler負責資源的調(diào)度乾巧,按照預定的調(diào)度策略將Pod調(diào)度到相應的機器上句喜;
kubelet負責維護容器的生命周期预愤,同時也負責Volume(CVI)和網(wǎng)絡(CNI)的管理;
Container runtime負責鏡像管理以及Pod和容器的真正運行(CRI)咳胃;
kube-proxy負責為Service提供cluster內(nèi)部的服務發(fā)現(xiàn)和負載均衡植康;
除了核心組件,還有一些推薦的Add-ons:
kube-dns負責為整個集群提供DNS服務
Ingress Controller為服務提供外網(wǎng)入口
Heapster提供資源監(jiān)控
Dashboard提供GUI
Federation提供跨可用區(qū)的集群
Fluentd-elasticsearch提供集群日志采集展懈、存儲與查詢
API Server主要用來處理REST的操作销睁,確保它們生效,并執(zhí)行相關業(yè)務邏輯存崖,以及更新etcd(或者其他存儲)中的相關對象冻记。API Server是所有REST命令的入口,它的相關結(jié)果狀態(tài)將被保存在etcd(或其他存儲)中来惧。API Server的基本功能包括:
REST語義冗栗,監(jiān)控,持久化和一致性保證供搀,API 版本控制贞瞒,放棄和生效
內(nèi)置準入控制語義,同步準入控制鉤子趁曼,以及異步資源初始化
API注冊和發(fā)現(xiàn)
另外,API Server也作為集群的網(wǎng)關棕洋。默認情況挡闰,客戶端通過API Server對集群進行訪問,客戶端需要通過認證掰盘,并使用API Server作為訪問Node和Pod(以及service)的堡壘和代理/通道摄悯。
2.2 Cluster state store(集群狀態(tài)存儲)
Kubernetes默認使用etcd作為集群整體存儲,當然也可以使用其它的技術愧捕。etcd是一個簡單的奢驯、分布式的、一致的key-value存儲次绘,主要被用來共享配置和服務發(fā)現(xiàn)瘪阁。etcd提供了一個CRUD操作的REST API,以及提供了作為注冊的接口邮偎,以監(jiān)控指定的Node管跺。集群的所有狀態(tài)都存儲在etcd實例中,并具有監(jiān)控的能力禾进,因此當etcd中的信息發(fā)生變化時豁跑,就能夠快速的通知集群中相關的組件。
2.3 Controller-Manager Server(控制管理服務器)
Controller-Manager Serve用于執(zhí)行大部分的集群層次的功能泻云,它既執(zhí)行生命周期功能(例如:命名空間創(chuàng)建和生命周期艇拍、事件垃圾收集狐蜕、已終止垃圾收集、級聯(lián)刪除垃圾收集卸夕、node垃圾收集)层释,也執(zhí)行API業(yè)務邏輯(例如:pod的彈性擴容)〗慷撸控制管理提供自愈能力湃累、擴容、應用生命周期管理碍讨、服務發(fā)現(xiàn)治力、路由、服務綁定和提供勃黍。Kubernetes默認提供Replication Controller宵统、Node Controller、Namespace Controller覆获、Service Controller马澈、Endpoints Controller、Persistent Controller弄息、DaemonSet Controller等控制器痊班。
scheduler組件為容器自動選擇運行的主機。依據(jù)請求資源的可用性摹量,服務請求的質(zhì)量等約束條件涤伐,scheduler監(jiān)控未綁定的pod,并將其綁定至特定的node節(jié)點缨称。Kubernetes也支持用戶自己提供的調(diào)度器凝果,Scheduler負責根據(jù)調(diào)度策略自動將Pod部署到合適Node中,調(diào)度策略分為預選策略和優(yōu)選策略睦尽,Pod的整個調(diào)度過程分為兩步:
1)預選Node:遍歷集群中所有的Node器净,按照具體的預選策略篩選出符合要求的Node列表。如沒有Node符合預選策略規(guī)則当凡,該Pod就會被掛起山害,直到集群中出現(xiàn)符合要求的Node。
2)優(yōu)選Node:預選Node列表的基礎上沿量,按照優(yōu)選策略為待選的Node進行打分和排序粗恢,從中獲取最優(yōu)Node。
Kubelet是Kubernetes中最主要的控制器眷射,它是Pod和Node API的主要實現(xiàn)者,Kubelet負責驅(qū)動容器執(zhí)行層。在Kubernetes中妖碉,應用容器彼此是隔離的涌庭,并且與運行其的主機也是隔離的,這是對應用進行獨立解耦管理的關鍵點欧宜。
在Kubernets中坐榆,Pod作為基本的執(zhí)行單元,它可以擁有多個容器和存儲數(shù)據(jù)卷冗茸,能夠方便在每個容器中打包一個單一的應用席镀,從而解耦了應用構建時和部署時的所關心的事項,已經(jīng)能夠方便在物理機/虛擬機之間進行遷移夏漱。API準入控制可以拒絕或者Pod豪诲,或者為Pod添加額外的調(diào)度約束,但是Kubelet才是Pod是否能夠運行在特定Node上的最終裁決者挂绰,而不是scheduler或者DaemonSet屎篱。kubelet默認情況使用cAdvisor進行資源監(jiān)控。負責管理Pod葵蒂、容器交播、鏡像、數(shù)據(jù)卷等践付,實現(xiàn)集群對節(jié)點的管理秦士,并將容器的運行狀態(tài)匯報給Kubernetes API Server。
每一個Node都會運行一個Container Runtime永高,其負責下載鏡像和運行容器伍宦。Kubernetes本身并不停容器運行時環(huán)境,但提供了接口乏梁,可以插入所選擇的容器運行時環(huán)境。kubelet使用Unix socket之上的gRPC框架與容器運行時進行通信关贵,kubelet作為客戶端遇骑,而CRI shim作為服務器。
protocol buffers API提供兩個gRPC服務揖曾,ImageService和RuntimeService落萎。ImageService提供拉取、查看炭剪、和移除鏡像的RPC练链。RuntimeSerivce則提供管理Pods和容器生命周期管理的RPC,以及與容器進行交互(exec/attach/port-forward)奴拦。容器運行時能夠同時管理鏡像和容器(例如:Docker和Rkt)媒鼓,并且可以通過同一個套接字提供這兩種服務。在Kubelet中,這個套接字通過–container-runtime-endpoint和–image-service-endpoint字段進行設置绿鸣。Kubernetes CRI支持的容器運行時包括docker疚沐、rkt、cri-o潮模、frankti亮蛔、kata-containers和clear-containers等。
基于一種公共訪問策略(例如:負載均衡)擎厢,服務提供了一種訪問一群pod的途徑究流。此方式通過創(chuàng)建一個虛擬的IP來實現(xiàn),客戶端能夠訪問此IP动遭,并能夠?qū)⒎胀该鞯拇碇罰od芬探。每一個Node都會運行一個kube-proxy,kube proxy通過iptables規(guī)則引導訪問至服務IP沽损,并將重定向至正確的后端應用灯节,通過這種方式kube-proxy提供了一個高可用的負載均衡解決方案。服務發(fā)現(xiàn)主要通過DNS實現(xiàn)绵估。
在Kubernetes中炎疆,kube proxy負責為Pod創(chuàng)建代理服務;引到訪問至服務国裳;并實現(xiàn)服務到Pod的路由和轉(zhuǎn)發(fā)形入,以及通過應用的負載均衡。
kubectl是Kubernetes集群的命令行接口亿遂。運行kubectl命令的語法如下所示:
$ kubectl?[command]?[TYPE]?[NAME]?[flags]
這里的command,TYPE渺杉、NAME和flags為:
comand:指定要對資源執(zhí)行的操作蛇数,例如create、get是越、describe和delete
TYPE:指定資源類型耳舅,資源類型是大小學敏感的,開發(fā)者能夠以單數(shù)倚评、復數(shù)和縮略的形式浦徊。例如:
$ kubectlgetpod pod1
$ kubectlgetpods pod1
$ kubectlgetpo pod1
NAME:指定資源的名稱,名稱也大小寫敏感的天梧。如果省略名稱盔性,則會顯示所有的資源,例如:
$kubectlgetpods
flags:指定可選的參數(shù)呢岗。例如冕香,可以使用-s或者–server參數(shù)指定Kubernetes API server的地址和端口蛹尝。
另外,可以通過運行kubectl help命令獲取更多的信息暂筝。
在Kunbernetes中可以以附加項的方式擴展Kubernetes的功能箩言,目前主要有網(wǎng)絡、服務發(fā)現(xiàn)和可視化這三大類的附加項焕襟,下面是可用的一些附加項:
ACI?通過與Cisco ACI集成的容器網(wǎng)絡和網(wǎng)絡安全陨收。
Calico?是一個安全的3層網(wǎng)絡和網(wǎng)絡策略提供者。
Canal?聯(lián)合Fannel和Calico鸵赖,通過網(wǎng)絡和網(wǎng)絡側(cè)务漩。
Cilium?是一個3層網(wǎng)絡和網(wǎng)絡側(cè)插件,它能夠透明的加強HTTP/API/L7 策略它褪。其即支持路由饵骨,也支持overlay/encapsultion模式。
Flannel?是一個overlay的網(wǎng)絡提供者茫打。
CoreDNS?是一個靈活的居触,可擴展的DNS服務器,它能夠作為Pod集群內(nèi)的DNS進行安裝老赤。
Ingress 提供基于Http協(xié)議的路由轉(zhuǎn)發(fā)機制轮洋。
Dashboard?是Kubernetes的web用戶界面。
Kubernetes設計理念和功能其實就是一個類似Linux的分層架構抬旺,如下圖所示
核心層:Kubernetes最核心的功能弊予,對外提供API構建高層的應用,對內(nèi)提供插件式應用執(zhí)行環(huán)境
應用層:部署(無狀態(tài)應用开财、有狀態(tài)應用汉柒、批處理任務、集群應用等)和路由(服務發(fā)現(xiàn)责鳍、DNS解析等)
管理層:系統(tǒng)度量(如基礎設施碾褂、容器和網(wǎng)絡的度量),自動化(如自動擴展历葛、動態(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應用巍杈、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集成進入GA階段》地址:https://www.sohu.com/a/233247128_198222