一、 Kubernetes簡(jiǎn)介
Kubernetes是Google開(kāi)源的一個(gè)容器編排引擎,它支持自動(dòng)化部署、大規(guī)??缮炜s、應(yīng)用容器化管理。在生產(chǎn)環(huán)境中部署一個(gè)應(yīng)用程序時(shí),通常要部署該應(yīng)用的多個(gè)實(shí)例以便對(duì)應(yīng)用請(qǐng)求進(jìn)行負(fù)載均衡。kubernetes,簡(jiǎn)稱K8s,是用8代替8個(gè)字符“ubernete”而成的縮寫。
在Kubernetes中,我們可以創(chuàng)建多個(gè)容器,每個(gè)容器里面運(yùn)行一個(gè)應(yīng)用實(shí)例,然后通過(guò)內(nèi)置的負(fù)載均衡策略,實(shí)現(xiàn)對(duì)這一組應(yīng)用實(shí)例的管理、發(fā)現(xiàn)、訪問(wèn),而這些細(xì)節(jié)都不需要運(yùn)維人員去進(jìn)行復(fù)雜的手工配置和處理。
二、 Kubernetes功能模塊
2.1 Kubernetes Pod
Pod是Kubernetes中能夠創(chuàng)建和部署的最小單元,是Kubernetes集群中的一個(gè)應(yīng)用實(shí)例,總是部署在同一個(gè)節(jié)點(diǎn)Node上。Pod中包含了一個(gè)或多個(gè)容器,還包括了存儲(chǔ)、網(wǎng)絡(luò)等各個(gè)容器共享的資源。Pod支持多種容器環(huán)境,Docker則是最流行的容器環(huán)境。Pod內(nèi)的容器會(huì)一起啟動(dòng)、停止,每個(gè)Pod會(huì)有自己獨(dú)立的內(nèi)部動(dòng)態(tài)IP,在Pod新建或重啟時(shí)會(huì)重新分配新的IP。Pod會(huì)有自己的Label用來(lái)標(biāo)示Pod的服務(wù)內(nèi)容。Service會(huì)根據(jù)服務(wù)的Label來(lái)綁定Service與Pod之間的管理。Pod自身不具有高可用等特性,Pod一般不會(huì)直接使用,而是通過(guò)RC等方式進(jìn)行調(diào)度使用。如圖2-1所示的Pod1中有2個(gè)容器,其IP地址為10.10.10.1,Pod2中有3個(gè)容器,其IP地址為10.10.10.2,Pod3中有3個(gè)容器,其IP地址為10.10.10.3,Pod4中有4個(gè)容器,其IP地址為10.10.10.4。
圖 2-1 Pod
2.2 Kubernetes Label
Label是Kubernetes系統(tǒng)中另外一個(gè)核心概念,一個(gè)Label是一個(gè)key=value的鍵值對(duì),其中key與value由用戶自己指定。Label可以附加到各種資源對(duì)象上,例如Node、Pod、Service、RC等,一個(gè)資源對(duì)象可以定義任意數(shù)量的Label,同一個(gè)Label也可以被添加到任意數(shù)量的資源對(duì)象上去,Label通常在資源對(duì)象定義時(shí)確定,也可以在對(duì)象創(chuàng)建后動(dòng)態(tài)添加或者刪除。如圖2-2所示的Pod1的Label=service1,Pod2的Label=service2,Pod3的Label=service2,Pod4的Label=service3。
圖 2-2 Label
2.3 Kubernetes Service
Kubernetes中一個(gè)應(yīng)用服務(wù)會(huì)有一個(gè)或多個(gè)實(shí)例(Pod),每個(gè)實(shí)例(Pod)的IP地址由網(wǎng)絡(luò)插件動(dòng)態(tài)隨機(jī)分配。為屏蔽這些后端實(shí)例的動(dòng)態(tài)變化和對(duì)多實(shí)例的負(fù)載均衡,引入了Service這個(gè)資源對(duì)象,Service與其后端Pod副本集群之間則是通過(guò)Label Selector來(lái)實(shí)現(xiàn)"無(wú)縫對(duì)接"。用戶訪問(wèn)Pod的服務(wù)均需要通過(guò)Service進(jìn)行。每個(gè)Service會(huì)分配一個(gè)獨(dú)立的ClusterIP,并通過(guò)Selector的Label標(biāo)示來(lái)選擇相應(yīng)的Pod。如果有多個(gè)相同Label的Pod,Service服務(wù)會(huì)自動(dòng)在Pod之間Round-Robin。(負(fù)載均衡算法),ClusterIP隨著Service的生命周期產(chǎn)生銷毀,期間不會(huì)發(fā)生變化。如圖2-3所示,Service1對(duì)應(yīng)的pod為pod1,其Cluster IP地址為10.1.0.10,端口號(hào)為1000,Service2對(duì)應(yīng)的pod為pod2和pod3,其Cluster IP地址為10.1.0.11,端口號(hào)為4321,Service3對(duì)應(yīng)的pod為pod4,其Cluster IP地址為10.1.0.12,端口號(hào)為1234。
圖 2-3 Service
2.4 Kubernetes RC
Kubernetes RC是Pod的復(fù)制、管理、監(jiān)控工具,Pod自身不具有高可用的特性,而RC則提供了一系列的高可用特性。例如設(shè)定RC的replication數(shù)量為2,那么相同的Pod會(huì)被創(chuàng)建2次,例如Label=Service2的Pod,如果Pod2出現(xiàn)問(wèn)題而失效(例如物理機(jī)器down),那么RC會(huì)發(fā)現(xiàn)replication的數(shù)量變成了1,則會(huì)自動(dòng)的再創(chuàng)建一個(gè)Label=Service2的Pod,保證服務(wù)的可用性。RC是Kubernetes使用POD推薦的方法,即使只建立一個(gè)Pod,也要使用RC來(lái)創(chuàng)建,從而保證服務(wù)的可用性。如圖2-4所示,label=service2的pod有兩個(gè)副本。
圖 2-4 Replication Controller
2.5 etcd
etcd是一個(gè)分布式的Key/Value存儲(chǔ)系統(tǒng),數(shù)據(jù)寫入節(jié)點(diǎn)中后會(huì)自動(dòng)的同步到其他的節(jié)點(diǎn)之上。etcd通過(guò)raft算法自主進(jìn)行master選舉,當(dāng)master失效時(shí),會(huì)自動(dòng)重新選擇新的master節(jié)點(diǎn),從而保證etcd集群的高可用,如圖2-5所示,當(dāng)一個(gè)節(jié)點(diǎn)的數(shù)據(jù)更新時(shí)數(shù)據(jù)會(huì)同步到其他節(jié)點(diǎn)上
圖 2-5 etcd
三、 Kubernetes組件及架構(gòu)
一個(gè)K8S系統(tǒng),通常稱為一個(gè)K8S集群,這個(gè)集群主要包括兩個(gè)部分:一個(gè)Master節(jié)點(diǎn)(主節(jié)點(diǎn)):負(fù)責(zé)管理和控制,一群Node節(jié)點(diǎn)(計(jì)算節(jié)點(diǎn)):工作負(fù)載節(jié)點(diǎn),里面是具體的容器,如圖3-1所示是一個(gè)典型的K8S架構(gòu)。
圖 3-1 K8S架構(gòu)
3.1 Master節(jié)點(diǎn)
Master節(jié)點(diǎn)包括API Server、Scheduler、Controller manager、etcd等服務(wù)。Scheduler負(fù)責(zé)對(duì)集群內(nèi)部的Pod進(jìn)行調(diào)度,相當(dāng)于“調(diào)度室”。Controller manager負(fù)責(zé)集群的管理,相當(dāng)于“大總管”。API Server是整個(gè)系統(tǒng)的對(duì)外接口,供客戶端和其它組件互相通信,相當(dāng)于“營(yíng)業(yè)廳”。etcd負(fù)責(zé)集群的數(shù)據(jù)同步,相當(dāng)于存放數(shù)據(jù)的“倉(cāng)庫(kù)”,如圖3-2所示就是一個(gè)Master節(jié)點(diǎn)及其所包含的服務(wù)。
圖 3-2 Master節(jié)點(diǎn)
3.1.1 Controller manager
Controller Manager是各種controller的管理者,是集群內(nèi)部的管理控制中心,Controller Manager作為集群內(nèi)部的管理控制中心,負(fù)責(zé)集群內(nèi)的Node、Pod副本、服務(wù)端點(diǎn)(Endpoint)、命名空間(Namespace)、服務(wù)賬號(hào)(ServiceAccount)、資源定額(ResourceQuota)的管理,當(dāng)某個(gè)Node意外宕機(jī)時(shí),Controller Manager會(huì)及時(shí)發(fā)現(xiàn)并執(zhí)行自動(dòng)化修復(fù)流程,確保集群始終處于預(yù)期的工作狀態(tài)。
3.1.2 Scheduler
Scheduler只負(fù)責(zé)Pod調(diào)度,通過(guò)算法來(lái)計(jì)算pod和Node節(jié)點(diǎn)的對(duì)應(yīng)關(guān)系。在整個(gè)系統(tǒng)中起“承上啟下”作用,承上:負(fù)責(zé)接收Controller Manager創(chuàng)建的新的Pod,為其選擇一個(gè)合適的Node,啟下:Node上的kubelet接管Pod的生命周期。如圖3-3所示,Pod1、Pod2和Pod3對(duì)應(yīng)在Node1上,Pod3和Pod4對(duì)應(yīng)在Node2上。
圖 3-3 Scheduler
3.1.3 API Server
API server作為集群的核心,負(fù)責(zé)各個(gè)功能模塊之間的通信。集群中各個(gè)模塊通過(guò)API server將信息存入etcd,當(dāng)需要獲取和操作這些數(shù)據(jù)時(shí),則通過(guò)API server提供的REST接口來(lái)實(shí)現(xiàn),從而實(shí)現(xiàn)各模塊之間的信息交互。集群內(nèi)部各個(gè)模塊之間通信的樞紐:所有模塊之前并不會(huì)之間互相調(diào)用,而是通過(guò)和 API Server 打交道來(lái)完成自己那部分的工作,集群之間各個(gè)組件的通信關(guān)系如圖3-4所示。
圖 3-4 API Server
3.2 Node節(jié)點(diǎn)
Node是工作負(fù)載節(jié)點(diǎn),上面承載著容器,Node節(jié)點(diǎn)包括Pod、kubelet、kube-proxy。Pod是Kubernetes最基本的操作單元。一個(gè)Pod代表著集群中運(yùn)行的一個(gè)進(jìn)程,它內(nèi)部封裝了一個(gè)或多個(gè)緊密相關(guān)的容器。Kubelet主要負(fù)責(zé)監(jiān)視指派到它所在Node上的Pod,包括創(chuàng)建、修改、監(jiān)控、刪除等。Kube-proxy:對(duì)Node提供網(wǎng)絡(luò)代理和LB功能,配合Service提供網(wǎng)絡(luò)服務(wù)。如圖3-5所示為兩個(gè)Node節(jié)點(diǎn),Node1上面有Pod1、Pod2和Pod3,Node2上面有Pod4。
圖 3-5 Node節(jié)點(diǎn)
3.2.1 Kubelet
kubelet 是運(yùn)行在每個(gè)節(jié)點(diǎn)上的主要的“節(jié)點(diǎn)代理”,每個(gè)節(jié)點(diǎn)都會(huì)啟動(dòng) kubelet進(jìn)程,用來(lái)處理 Master 節(jié)點(diǎn)下發(fā)到本節(jié)點(diǎn)的任務(wù),管理Pod 和其中的容器。其功能主要為:1)Pod管理,獲取Pod的狀態(tài),運(yùn)行的容器數(shù)量,種類,副本數(shù)量,網(wǎng)絡(luò)配置等。2)容器監(jiān)控:定時(shí)匯報(bào)當(dāng)前節(jié)點(diǎn)的資源使用情況給API Server,讓Master節(jié)點(diǎn)知道整個(gè)集群所有節(jié)點(diǎn)的資源情況,以供調(diào)度時(shí)使用。3)容器健康狀態(tài)檢查:如果容器運(yùn)行出錯(cuò),就要根據(jù)設(shè)置的重啟策略進(jìn)行處理。4)鏡像和容器的清理工作:保證節(jié)點(diǎn)上鏡像不會(huì)占滿磁盤空間,退出的容器不會(huì)占用太多資源。如下圖所示,Node1和Node2上的Kubelet獲取了Pod狀態(tài)后,通過(guò)API Server將Pod狀態(tài)告知Master節(jié)點(diǎn)。如圖3-6所示為Kubelet服務(wù)。
圖 3-6 Kubelet
3.2.2 Kube-proxy
kube-proxy的這個(gè)組件運(yùn)行在每個(gè)node節(jié)點(diǎn)上。kube-proxy進(jìn)程其實(shí)就是一個(gè)智能的軟件負(fù)載均衡器,它會(huì)負(fù)責(zé)把對(duì)Service的請(qǐng)求轉(zhuǎn)發(fā)到后端的某個(gè)Pod實(shí)例上并在內(nèi)部實(shí)現(xiàn)服務(wù)的負(fù)載均衡與會(huì)話保持機(jī)制。它監(jiān)聽(tīng)API server中service和endpoint的變化情況,并通過(guò)iptables等來(lái)為服務(wù)配置負(fù)載均衡,是讓我們的服務(wù)在集群外可以被訪問(wèn)到的重要方式。Kube-proxy與service在集群中的工作原理如圖3-7所示。
圖3-7 Kube-proxy工作原理
四、 實(shí)驗(yàn)
根據(jù)上述所介紹的Kubernetes架構(gòu),我們直接通過(guò)在H3Cloud OS 3.0的實(shí)際環(huán)境來(lái)幫助我們更好的理解。
4.1 獲取集群節(jié)點(diǎn)信息
首先,我們搭建好了Kubernetes的集群環(huán)境,輸入命令檢查H3Cloud OS系統(tǒng)運(yùn)行狀態(tài),查看各節(jié)點(diǎn)狀態(tài)信息,命令為“/opt/bin/kubectl –s 127.0.0.1:8888 get node”,如圖4-1所示各節(jié)點(diǎn)都處于Ready狀態(tài)。
圖 4-1 節(jié)點(diǎn)狀態(tài)信息
4.2 獲取集群Pod信息
H3Cloud OS采用容器化架構(gòu),Pod的運(yùn)行狀態(tài)反應(yīng)了提供服務(wù)的容器的狀態(tài),Pod狀態(tài)運(yùn)行正常即表示相關(guān)服務(wù)正常。使用root用戶登錄Master節(jié)點(diǎn),執(zhí)行以下命令查看服務(wù)組件所在節(jié)點(diǎn),通過(guò)輸入命令:“/opt/bin/kubectl –s 127.0.0.1:8888 get pode -o wide”可以看到如圖4-2所示的Pod信息。NAME列顯示了各個(gè)Pod的名稱,READY列顯示了Pod的運(yùn)行個(gè)數(shù)和設(shè)定的副本數(shù),1/1中的前一個(gè)1表示當(dāng)前運(yùn)行了一個(gè)Pod,后一個(gè)1表示此Pod的設(shè)定副本數(shù)為1,STATUS列顯示了Pod的運(yùn)行狀態(tài),可以觀察到pod都是處于running狀態(tài)的,AGE列顯示了Pod的運(yùn)行時(shí)間,可以看到大部分的Pod的運(yùn)行時(shí)長(zhǎng)都在20小時(shí)以上,IP列顯示了Pod的IP地址,NODE列顯示了該服務(wù)組件所在節(jié)點(diǎn)的IP地址。
圖4-2 Pod信息
4.3 獲取集群Docker信息
查看H3Cloud OS云平臺(tái)使用容器進(jìn)程的運(yùn)行狀態(tài):輸入命令docker ps ,如圖4-3所示,輸出顯示的第一列為容器的UUID信息,第二列為容器使用的鏡像名稱,第三列為啟動(dòng)容器時(shí)運(yùn)行的命令,第四列為容器的創(chuàng)建時(shí)間,顯示格式為**時(shí)間之前創(chuàng)建,第五列為容器的運(yùn)行狀態(tài),第六列為容器的端口信息和使用的連接類型(tcp\udp)名稱,第七列為容器的名稱。
圖 4-3 Docker信息
通過(guò)使用命令:pod | grep glance可以只查看包含glance名稱的容器實(shí)例,如圖4-4所示。
圖 4-4 包含glance名稱的容器實(shí)例
進(jìn)入Glance容器實(shí)例中,使用命令:kubectl exec –it <pod名稱> bash;H3Cloud OS業(yè)務(wù)均有不同的容器提供,容器內(nèi)服務(wù)狀態(tài)異常會(huì)導(dǎo)致相關(guān)的功能異常。容器內(nèi)執(zhí)行命令:systemctl status <服務(wù)名稱>,結(jié)果如圖4-5所示。
圖 4-5 容器服務(wù)狀態(tài)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-801538.html
五、 總結(jié)
K8S是谷歌公司發(fā)明的容器集群的管理工具,它具有Pod,Label,Service,RC,etcd等高級(jí)功能。一個(gè)K8S集群通常是由一個(gè)Master節(jié)點(diǎn)和一群Node節(jié)點(diǎn)構(gòu)成,Master節(jié)點(diǎn)主要負(fù)責(zé)管理和控制整個(gè)集群,其組件主要包括Controller manager:是集群內(nèi)部的管理控制中心;Scheduler:負(fù)責(zé)Pod調(diào)度,通過(guò)算法來(lái)計(jì)算pod和Node節(jié)點(diǎn)的對(duì)應(yīng)關(guān)系;API Server:集群內(nèi)各個(gè)功能組件不能直接通信,需要通過(guò)API Server來(lái)實(shí)現(xiàn)通信。Node節(jié)點(diǎn)是工作負(fù)載節(jié)點(diǎn),上面承載著容器,主要包括Pod: Kubernetes中能夠創(chuàng)建和部署的最小單元,是Kubernetes集群中的一個(gè)應(yīng)用實(shí)例,里面是具體的容器;Kubelet:是運(yùn)行在每個(gè)節(jié)點(diǎn)上的主要的“節(jié)點(diǎn)代理”,每個(gè)節(jié)點(diǎn)都會(huì)啟動(dòng) kubelet進(jìn)程,用來(lái)處理 Master 節(jié)點(diǎn)下發(fā)到本節(jié)點(diǎn)的任務(wù);Kube-proxy:運(yùn)行在每個(gè)node節(jié)點(diǎn)上,是讓我們的服務(wù)在集群外可以被訪問(wèn)到的重要方式。在H3Cloud OS 3.0中也運(yùn)用了k8s這一重要技術(shù)來(lái)管理容器,在進(jìn)入到H3Cloud OS 3.0后臺(tái)時(shí)可以通過(guò)相關(guān)命令查看容器的信息和運(yùn)行狀態(tài)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-801538.html
到了這里,關(guān)于【k8s】Kubernetes技術(shù)和相關(guān)命令簡(jiǎn)介的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!