這篇文章主要介紹docker中19-k8s的示例分析,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
成都創(chuàng)新互聯(lián)主營冊亨網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都app軟件開發(fā),冊亨h5小程序設(shè)計(jì)搭建,冊亨網(wǎng)站營銷推廣歡迎冊亨等地區(qū)企業(yè)咨詢Docker的第一類編排工具:
1) docker compose(docker原生):只能對一個(gè)主機(jī)上的容器進(jìn)行編排,無法編排多個(gè)主機(jī)上的容器;
2) docker swarm(docker原生):可以對多個(gè)主機(jī)上的容器進(jìn)行編排。
3) docker machine(docker原生):可以將一個(gè)主機(jī)迅速初始化到docker swarm集群里。
以上三個(gè)稱為docker三劍客。
Docker的第二類編排工具:
mesos:它不是docker的編排工具,而是資源分配工具。所以mesos必須要依賴于容器編排框架marathon。
Docker的第三類編排工具:
kubernetes(簡稱k8s):這個(gè)容器編排工具占用了80%的市場份額。
有了容器和容器編排技術(shù),對持續(xù)集成(CI)、持續(xù)交付Delivery(CD)和持續(xù)部署Deployment(CD)的需求變?yōu)榭赡?,這也就是DevOps的理念。
注意:DevOps并不是一種技術(shù),而是一種運(yùn)動(dòng),一種文化。
k8s是2014年google對外開放的。
Borg是谷歌內(nèi)部非常棒的容器編排工具,k8s就是站在Borg基礎(chǔ)上開發(fā)出來的,所以k8s從一出世,就吸引了太多太多人的關(guān)注,直到今天為止,它也確實(shí)沒有辜負(fù)人們的期望。
2017年是容器技術(shù)最輝煌的一年,AWS、微軟的云技術(shù)、阿里云等云廠商開始對外宣布,他們支持k8s。
k8s的代碼托管在github之上:https://github.com/kubernetes/kubernetes/releases
k8s的特性:
1)可以自動(dòng)裝箱,即可以自動(dòng)完成容器的部署,而不影響可用性;
2)可以自我修復(fù),如果容器崩潰了,可以1s內(nèi)重新啟動(dòng),有了k8s后,我們不再關(guān)注個(gè)體,而是關(guān)注群體,有一個(gè)個(gè)體壞了,把它干掉,換一個(gè)新的就行了;
3)可以自動(dòng)實(shí)現(xiàn)水平擴(kuò)展,一個(gè)容器不夠,再啟動(dòng)一個(gè)就是了;
4)可以自動(dòng)實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)和負(fù)載均衡,也就是說可以自動(dòng)發(fā)現(xiàn)每個(gè)微服務(wù)之間的關(guān)系,同時(shí)也可以自動(dòng)對容器內(nèi)多個(gè)服務(wù)做負(fù)載均衡;
5) 可以實(shí)現(xiàn)自動(dòng)發(fā)布和回滾;
6) 可以實(shí)現(xiàn)密鑰和配置管理,也就是說每個(gè)容器不是加載容器內(nèi)的配置文件,而是加載遠(yuǎn)程服務(wù)器上(配置中心)的配置文件;
7)可以實(shí)現(xiàn)存儲(chǔ)編排;
8)可以實(shí)現(xiàn)任務(wù)的批量處理執(zhí)行。
k8s是一個(gè)有中心節(jié)點(diǎn)架構(gòu)的集群,由master節(jié)點(diǎn)(至少三個(gè))和nodes節(jié)點(diǎn)(運(yùn)行容器的節(jié)點(diǎn))組成??蛻舻膯?dòng)容器等請求會(huì)先發(fā)給master節(jié)點(diǎn),master節(jié)點(diǎn)有個(gè)調(diào)度器會(huì)分析node節(jié)點(diǎn)資源(cpu、內(nèi)存)的可用狀態(tài),找到最佳適配的node來啟動(dòng)用戶請求的容器。
master上的第一個(gè)組件叫調(diào)度器(Scheduler),它的工作原理有兩步:第一步調(diào)度器先做預(yù)選,即先評估到底有多少個(gè)node是符合容器需求的;第二步調(diào)度器再做優(yōu)選,即在符合的node中選擇一個(gè)最佳的node來運(yùn)行容器。
如果node宕機(jī)了,那么托管在node之上的所有容器也就不見了。此時(shí)k8s可以在其他節(jié)點(diǎn)上創(chuàng)建出來和宕機(jī)node上一模一樣的容器。
另外,master上還有一個(gè)組件叫控制器,它會(huì)不停的Loop,用來周期性監(jiān)控每個(gè)node的健康狀態(tài);控制器是有多個(gè)的(因?yàn)橛兄辽偃齻€(gè)master)。
再者,master上還有一個(gè)組件叫控制器管理器(Controller-Mnager),控制器管理器用來監(jiān)控著每個(gè)控制器的健康。
在k8s上運(yùn)行的最小單元不是容器,而是pod。pod可以理解為容器外殼,pod里面裝的就是放容器的。一個(gè)pod里面可以放多個(gè)容器,這些容器可以共享一個(gè)底層的網(wǎng)絡(luò)名稱空間、存儲(chǔ)卷,這樣一來,pod對外更像一個(gè)虛擬機(jī)。
一般說來,一個(gè)pod里只放一個(gè)容器;如果一個(gè)pod必須要放多個(gè)容器,那么里面有一個(gè)是主容器,其他都是輔助容器,輔助容器主要是為了輔助主容器的主程序的某些功能而設(shè)置的。
一個(gè)pod里面的所有容器只能運(yùn)行在一個(gè)node上的。
pod是k8s調(diào)用的原子單元,是個(gè)邏輯概念。
最終用戶無需再關(guān)注pod運(yùn)行在哪個(gè)node之上,這也就是云的概念,也就是把很多的node做為一個(gè)資源池,來進(jìn)行統(tǒng)一管理。
pod盡量由控制器管理,而不要手工管理。
pod可以分為兩類:
a)自主式pod:即自我管理的pod。我們創(chuàng)建Pod,首先交給Apiserver,然后調(diào)度器調(diào)度給指定的node節(jié)點(diǎn),。如果容器需要啟動(dòng),由node上kubelet組件來完成;如果node發(fā)生故障,那么pod也就消失了。
b)控制器管理的Pod(建議創(chuàng)建這種Pod):這種Pod是有生命周期的對象。由master上的調(diào)度器將pod調(diào)度至某node進(jìn)行運(yùn)行或者停止。pod控制器后很多種,最早的一種叫Replicaton Controller(副本控制器),意思是當(dāng)我們啟動(dòng)一個(gè)pod時(shí),如果這個(gè)pod不夠了,會(huì)再啟動(dòng)一個(gè),這叫副本。副本控制器就控制副本的數(shù)量,一旦副本少了,就會(huì)自動(dòng)再加一個(gè)。如果副本多于定義的個(gè)數(shù),會(huì)被停止。也就是副本必須精確符合人們定義的個(gè)數(shù)。副本個(gè)數(shù)至少要兩個(gè)。如果一個(gè)pod副本所在node宕機(jī)了,那么會(huì)向ApiServer重新請求,Apiserver借助調(diào)度器,到新節(jié)點(diǎn)創(chuàng)建一個(gè)新pod。滾動(dòng)更新:比如我有個(gè)1.0版本的鏡像,現(xiàn)在又有個(gè)1.1版本的鏡像,那么控制器管理的pod就會(huì)新啟動(dòng)一個(gè)1.1版本的Pod,然后刪除1.0版本的pod,這叫滾動(dòng)更新。同樣,k8s也支持回滾更新。到了k8s新版本,又出現(xiàn)了Replica Set(副本集控制器),但是該控制器并不直接使用,而是使用一個(gè)聲明更新的控制器Deployment,這個(gè)也是用的最多的。但是Deployment控制器只能管理那些無狀態(tài)的應(yīng)用。而有狀態(tài)的應(yīng)用是由Stateful Set控制器管理。對于Deployment控制器,它還支持二級控制器,叫HPA(horizontalPodAutoscaler),該控制器可以自動(dòng)水平擴(kuò)展pod,也就是當(dāng)一個(gè)pod壓力大時(shí),HPA控制器會(huì)自動(dòng)水平擴(kuò)展加幾個(gè)新的pod來分解壓力,具體加幾個(gè),HPA會(huì)根據(jù)當(dāng)前節(jié)點(diǎn)的cpu、內(nèi)存負(fù)荷來計(jì)算,一旦訪問量小了,HPA還會(huì)自動(dòng)減少pod個(gè)數(shù)。如果我們想在一個(gè)Node上只運(yùn)行一個(gè)副本,需要用DaemonSet控制器。如果需要運(yùn)行作業(yè)(如備份,清理數(shù)據(jù)等),需要conjob控制器。以上所講的都是pod的控制器,用來管理不同類型的pod。
為了實(shí)現(xiàn)給pod分組,可以給pod打上標(biāo)簽(Lablel),這樣就可以進(jìn)行分組了。
標(biāo)簽選擇器(Lablel Selector)組件:是一個(gè)根據(jù)標(biāo)簽來過濾符合要求的資源機(jī)制。
客戶端是通過service來找到pod的,service是通過pod的標(biāo)簽選擇器來找到pod的。service只是一個(gè)iptables方式的net地址轉(zhuǎn)換路由規(guī)則,不過到了k8s最新版本1.11,支持了ipvs方式的分發(fā)規(guī)則,支持各種調(diào)度算法,這也就實(shí)現(xiàn)了負(fù)載均衡。。裝完k8s后,就需要?jiǎng)?chuàng)建一個(gè)DNS pod,這是因?yàn)閟ervice的名字需要DNS服務(wù)器來進(jìn)行解析。這種pod是k8s的組成部分,被稱為k8s基礎(chǔ)架構(gòu)的pod,也被稱為k8s的附件,英文名叫AddOns。這種DNS是用來解析service名字的,而不是pod的,并且DNS名稱解析是K8s自動(dòng)維護(hù)的,不需要我們?nèi)斯じ深A(yù)。
一句話,service里面的地址存在iptables net或者ipvs里面,service是用來調(diào)度流量的,而不會(huì)啟動(dòng)或者停止容器的。
然而,pod的啟動(dòng)或者關(guān)閉、創(chuàng)建等是由控制器來做的,比如我們想創(chuàng)建一個(gè)nginx pod,就先創(chuàng)建一個(gè)Nginx控制器,nginx控制器自動(dòng)就會(huì)幫我們創(chuàng)建nginx pod;然后我們再創(chuàng)建一個(gè)nginx service,把nginx pod發(fā)布出去。
service有兩種類型,一種是調(diào)度流量僅供k8s內(nèi)部來使用,還有一種可以調(diào)度流量供k8s外部來使用。
上圖中,我們應(yīng)該明白了service是用來分發(fā)流量給pod的,控制器是用來創(chuàng)建、啟動(dòng)和停止pod的,標(biāo)簽選擇器是service用來根據(jù)標(biāo)簽來識(shí)別每個(gè)pod的。
在k8s運(yùn)行中,需要三種網(wǎng)絡(luò),第一種網(wǎng)絡(luò)是需要各pod在一個(gè)網(wǎng)絡(luò)中,而service在另外一個(gè)網(wǎng)絡(luò),即service的地址和pod的地址是不同網(wǎng)段的,pod的地址是配置在pod內(nèi)部的網(wǎng)絡(luò)名稱空間,是可以ping通的,但service的地址虛擬的,是假地址,只存在于iptables 或者ipvs里面。另外node又存在另外一個(gè)網(wǎng)絡(luò),這樣就有三種網(wǎng)絡(luò)。所以外部先到達(dá)node網(wǎng)絡(luò),然后再到service網(wǎng)絡(luò),最后才到pod網(wǎng)絡(luò)。
那么pod之間是怎么通信的呢。同一個(gè)pod內(nèi)的多個(gè)容器間通過lo進(jìn)行通信;各pod之間通過overlay network(疊加網(wǎng)絡(luò))進(jìn)行通信,即使pod之間跨主機(jī),通信也沒問題;pod與service之間通過網(wǎng)關(guān)(也就是docker 零橋的地址)進(jìn)行通信。
node上有個(gè)組件叫kube-proxy,它負(fù)責(zé)和ApiServer進(jìn)行通信,kube-proxy一旦發(fā)現(xiàn)service背后的pod地址發(fā)生變化,kube-proxy就會(huì)把pod地址反映到iptables 或者ipvs中。所以service的管理是靠kube-proxy來實(shí)現(xiàn)的。
在master(注意,master是有多個(gè)的)上的數(shù)據(jù)并不存在master本地,而是存在共享存儲(chǔ)DB中,這個(gè)共享DB叫etcd。etcd里面數(shù)據(jù)是以key-value形式存儲(chǔ)的,集群中所有狀態(tài)信息都在etcd中,所以ectd要做冗余,一般至少三個(gè)節(jié)點(diǎn)。etcd是通過https方式訪問的。etcd有一個(gè)端口是用來集群內(nèi)部通信,另外 一個(gè)端口用來對ApiServer通信。這樣一來,etcd內(nèi)部通訊需要點(diǎn)對點(diǎn)的專門證書,對ApiServer通信就要另外一套證書。另外,ApiServer向客戶端提供服務(wù),也需要另外一套證書。同樣,ApiServer和node上的kubelet組件和kube-proxy組件通信也需要CA證書。所以做K8s的部署,需要建立5個(gè)CA,這也是最難的。
下面我們把k8s歸類為以下三類節(jié)點(diǎn):master、node(上面有pod)和ectd(存儲(chǔ)集群狀態(tài)信息),它們彼此之間都是由http或https進(jìn)行通信的。我們知道網(wǎng)絡(luò)也分為:pod網(wǎng)絡(luò),service網(wǎng)絡(luò)和node網(wǎng)絡(luò)。所以我們要構(gòu)建出三類網(wǎng)絡(luò)來,但是K8s自己不提供這三類網(wǎng)絡(luò),而是要依賴于第三方插件CNI。
k8s通過CNI(容器網(wǎng)絡(luò)接口)插件體系接入網(wǎng)絡(luò)。目前常見的CNI插件是flannel。其實(shí)網(wǎng)絡(luò)只提供兩個(gè)功能,一個(gè)是給pod、service等提供ip地址的功能,另外還需要網(wǎng)絡(luò)能提供網(wǎng)絡(luò)測試的功能,來隔離不同Pod之間的通信。
flannel插件只支持網(wǎng)絡(luò)配置(供ip地址的功能),但不支持網(wǎng)絡(luò)策略。
CNI里面的插件calico可以同時(shí)支持網(wǎng)絡(luò)配置和網(wǎng)絡(luò)策略,但是calico的部署和使用非常難。
于是,又有了第三個(gè)CNI插件canel,它用flannel提供網(wǎng)絡(luò)配置,用calico提供網(wǎng)絡(luò)策略。這些插件可以作為k8s之上的守護(hù)進(jìn)程運(yùn)行,也可以在k8s里面的容器運(yùn)行。
名稱空間,可以實(shí)現(xiàn)不同類pod運(yùn)行在不同的名稱空間中。比如可以把名稱空間分為開發(fā)名稱空間、生產(chǎn)名稱空間等。這樣通過網(wǎng)絡(luò)策略來定義名稱空間之間、同一個(gè)名稱空間的pod之間的網(wǎng)絡(luò)行為。
本小節(jié)總結(jié):
1)master/node:
a)master上包含的組件:API Server,Scheduler(調(diào)度器),Controller-Manager(控制器管理器)
b)node上包含的組件:kubelet(用來和master通信的一個(gè)組件,并試圖啟動(dòng)本node上的容器等工作;另外啟動(dòng)容器是由容器引擎來操作的,最流行的容器引擎是docker)、docker引擎(也可以用其他容器引擎)、kube-proxy(負(fù)責(zé)和ApiServer進(jìn)行通信,kube-proxy一旦發(fā)現(xiàn)service背后的pod地址發(fā)生變化,kube-proxy就會(huì)把pod地址反映到iptables 或者ipvs中。所以service的管理是靠kube-proxy來實(shí)現(xiàn)的)
2)Pod:Lablel(標(biāo)簽,kv格式),Lablel Selector(標(biāo)簽選擇器)
以上是“docker中19-k8s的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!
網(wǎng)頁標(biāo)題:docker中19-k8s的示例分析-創(chuàng)新互聯(lián)
當(dāng)前URL:http://vcdvsql.cn/article48/pphhp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、企業(yè)網(wǎng)站制作、網(wǎng)站建設(shè)、ChatGPT、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容