午夜精品人妻久久久-成年美女很黄的网站-在线看片免费人成视久网app-国产精品美女无遮挡一区二区-91精品国产综合久久久久-国产的免费视频又猛又爽又刺激-在线看片免费人成视久网app-久久香蕉国产精品视频-av一区二区三区高清

五 Docker與k8s的恩怨情仇:Kubernetes的創(chuàng)新

上節(jié)中我們提到了社區(qū)生態(tài)的發(fā)展使得得到了良性的發(fā)展和傳播 。比起相對(duì)封閉的社區(qū)開放的CNCF社區(qū)獲得了更大成功,但僅僅是社區(qū)的活力對(duì)比還不足以讓這么快地?cái)∠玛噥恚涓驹蚴堑膶?duì)容器編排技術(shù)的理解比起更勝一籌 。這種優(yōu)勢(shì)幾乎是壓倒性的降維打擊,毫無還手之力 。
接下來便為大家介紹在這場(chǎng)容器大戰(zhàn)之中,如何占據(jù)優(yōu)勢(shì)地位 。
容器編排
所謂容器編排,其實(shí)就是處理容器和容器之間的關(guān)系docker可以圖形化嗎,在一個(gè)分布式的大型系統(tǒng)里,不可能是以多個(gè)單一個(gè)體存在的,它們可能是一個(gè)與多個(gè),一群與一群這樣相互交織著 。
的容器編排功能
構(gòu)建的是以容器為最核心的PaaS生態(tài) , 包括以 為主的簡單容器關(guān)系編排,以及以 Swarm為主的線上運(yùn)維平臺(tái) 。用戶可以通過 處理自己集群中容器之間的關(guān)系,并且通過 Swarm管理運(yùn)維自己的集群,可以看到這一切其實(shí)就是當(dāng)初Cloud 的PaaS功能 , 所主打的就是和容器的無縫集成 。
做到的是為多個(gè)有交互關(guān)系建立一種“連接”,把它們?nèi)烤帉懺谝粋€(gè)-.yaml文件中,然后統(tǒng)一發(fā)布(我后面說到的組里的ELK功能就是這樣做的),這樣做也有優(yōu)點(diǎn) , 就是對(duì)于簡單的幾個(gè)容器之間的交互來說非常便利 。但是對(duì)于大型的集群來說卻有些杯水車薪,并且這種每出現(xiàn)一種新需求就需要單獨(dú)做一項(xiàng)新功能的開發(fā)模式,將使后期代碼維護(hù)變得十分困難 。
如果要和對(duì)抗 , 肯定不能僅僅只做容器管理這種本身就已經(jīng)支持的功能了,這樣的話別說分庭抗禮,可能連的基本用戶都吸引不到 。因此在設(shè)計(jì)之初,就確定了不以為核心依賴的設(shè)計(jì)理念 。在中,僅是容器運(yùn)行時(shí)實(shí)現(xiàn)的一個(gè)可選項(xiàng),用戶可以依據(jù)自己的喜好任意調(diào)換自己需要的容器內(nèi)容且為這些容器都提供了接口 。此外,準(zhǔn)確地抓住了容器的一個(gè)致命性的弱點(diǎn)進(jìn)行了自身創(chuàng)新 。
接下來就讓我們一起來了解,這個(gè)給造成降維打擊的內(nèi)容究竟是什么?
的容器編排功能
與這種站在容器視角上只能處理容器之間的關(guān)系所不同 , 所做的是從軟件工程的設(shè)計(jì)理念出發(fā),將關(guān)系進(jìn)行了不同類的劃分 , 定義了緊密關(guān)系(Pod之間)和交互關(guān)系(之間)的概念,然后再對(duì)不同的關(guān)系進(jìn)行特定的編排實(shí)現(xiàn) 。
乍一聽你可能是一頭霧水 。這里舉個(gè)不太實(shí)際但是一看就懂的例子:如果把容器之間的關(guān)系比作人之間的關(guān)系,能處理的是僅僅是站在單一個(gè)體的角度上 , 處理人與人之間的人際關(guān)系;而確是上帝 , 站在上帝視角不僅能處理人與人之間的人際關(guān)系,還能處理狗與狗之間的狗際關(guān)系,最主要的是能處理人與狗之間的交往關(guān)系 。
而實(shí)現(xiàn)上述緊密關(guān)系的原理,就是創(chuàng)新的Pod 。
【五 Docker與k8s的恩怨情仇:Kubernetes的創(chuàng)新】Pod是所創(chuàng)新的一個(gè)概念 , 其原型是Borg中的Alloc,是運(yùn)行應(yīng)用的最小執(zhí)行單元,由一個(gè)或者多個(gè)緊密協(xié)作的容器組合而成 , 其出現(xiàn)的原因是針對(duì)容器的一個(gè)致命性弱點(diǎn)——單一進(jìn)程這問題的擴(kuò)展 , 讓容器有了進(jìn)程組的概念 。通過第一節(jié),我們知道了容器的本質(zhì)是一個(gè)進(jìn)程,其本身就是超級(jí)進(jìn)程,其他進(jìn)程都必須是它的子進(jìn)程 , 因此在容器中 , 沒有進(jìn)程組的概念,而在日常的程序運(yùn)行中,進(jìn)程組是常常配合使用的 。
使用Pod處理緊密關(guān)系
為了給大家介紹Pod處理緊密關(guān)系的原理,這里舉一個(gè)進(jìn)程組的例子:
Linux中有一個(gè)負(fù)責(zé)操作系統(tǒng)日志處理的程序是由三個(gè)模塊組成,分別是:模塊、模塊以及自己的main函數(shù)主進(jìn)程 。這三個(gè)進(jìn)程組一定要運(yùn)行在同一臺(tái)機(jī)器上,否則它們之間的基于的通信和文件的交換都會(huì)出現(xiàn)問題 。
而上述的這個(gè)問題docker可以圖形化嗎,如果出現(xiàn)在中,就不得不使用三個(gè)不同的容器分別描述了,并且用戶還得自己模擬處理它們?nèi)齻€(gè)之間的通信關(guān)系,這種復(fù)雜度可能比使用容器運(yùn)維都高的多 。并且對(duì)于這個(gè)問題的運(yùn)維 ,  Swarm也有自己本身的問題 。以上述的例子為基礎(chǔ),如果三個(gè)模塊分別都需要1GB的內(nèi)存運(yùn)行,如果 Swarm運(yùn)行的集群中有兩個(gè)node , node-1剩余2.5GB,node-2剩余3GB 。這種情況下分別使用 run 模塊運(yùn)行上述三個(gè)容器 , 基于Swarm的=main約束,他們?nèi)齻€(gè)都必須要調(diào)度到同一臺(tái)機(jī)器上,但是Swarm卻很有可能先分配兩個(gè)去node-1,然后剩余的一個(gè)由于還剩0.5GB不滿足調(diào)度而使這次調(diào)度失敗 。這種典型的成組調(diào)度(gang )沒有被妥善處理的例子在 Swarm中經(jīng)常存在 。
基于上述的需求,有了Pod這個(gè)概念來處理這種緊密關(guān)系 。在一個(gè)Pod中的容器共享相同的和,因此它們之間并不存在邊界和隔離環(huán)境,它們可以共享同一個(gè)網(wǎng)絡(luò)IP,使用相同的處理數(shù)據(jù)等等 。其中的原理就是在多個(gè)容器之間創(chuàng)建其共享資源的鏈接 。但是為了解決到底是A共享B,還是B共享A , 以及A和B誰先啟動(dòng)這種拓?fù)湫缘膯栴},一個(gè)Pod其實(shí)是由一個(gè)Infra容器聯(lián)合AB兩個(gè)容器共同組成的,其中Infra容器是第一個(gè)啟動(dòng)的:
Infra容器是一個(gè)用匯編語言編寫的、主進(jìn)程是一個(gè)永遠(yuǎn)處于“暫?!睜顟B(tài)的容器,其僅占用極少的資源,解壓之后也僅有100KB左右 。
實(shí)例演示在中的Pod
介紹了一通,接下來我們?cè)趯?shí)例中為大家演示Pod長什么樣子 。
我們?cè)谌我庖粋€(gè)裝有的集群中通過以下的yaml文件和shell命令運(yùn)行處一個(gè)Pod,這個(gè)YAML文件具體是什么意思暫時(shí)不用理會(huì),之后我會(huì)對(duì)這個(gè)YAML做一說明,我們目前只需要明白:中的所有資源都可以通過以下這種YAML文件或者json文件描述的,現(xiàn)在我們只需要知道這是一個(gè)運(yùn)行著和nginx的Pod即可:
創(chuàng)建這個(gè)hello-pod.yaml文件之后運(yùn)行以下命令:
通過上述命令,我們就成功創(chuàng)建了一個(gè)pod,我們可以從執(zhí)行結(jié)果看到infra容器的主進(jìn)程成為了此Pod的PID==1的超級(jí)進(jìn)程,說明了Pod是組合而成的:
至此,我們應(yīng)該要理解Pod是的最小調(diào)度單位這個(gè)概念了,并且也應(yīng)該把Pod作為一個(gè)整體而不是多個(gè)容器的集合來看待 。
我們?cè)倏纯疵枋鲞@個(gè)Pod的文件類型YAML 。
YAML的語法定義:
YAML是一種專門編寫配置文件的語言,其簡潔且強(qiáng)大,在描述配置文件方面遠(yuǎn)勝于JSON,因此在很多新興的項(xiàng)目比如和 等都通過YAML來作為配置文件的描述語言 。與HTML相同,YAML也是一個(gè)英文的縮寫:YAML Ain't,聰明的同學(xué)已經(jīng)看出來了 , 這是一個(gè)遞歸寫法,突出了滿滿的程序員氣息 。其語法有如下特征:
明確了以上概念,我們把YAML改寫成一個(gè)JSON,看看這之間的區(qū)別:
這兩種寫法在中是等效的,上述的JSON可以正常運(yùn)行,但是還是更推薦使用YAML 。從上面的對(duì)比中我們也能發(fā)現(xiàn),在之前的使用中一直很好用的JSON現(xiàn)在也略顯笨拙,需要些大量的字符串標(biāo)志 。
看完語法,我們?cè)賮碚f說上述YAML中的各個(gè)節(jié)點(diǎn)在所表示的意思 。中的有一種類似于Java語法萬物皆對(duì)象的概念,所有內(nèi)部的資源,包括服務(wù)器node、服務(wù)以及運(yùn)行組Pod在中皆是以對(duì)象的形式存儲(chǔ)的,其所有對(duì)象都由一下固定的部分組成:
所有的對(duì)象基本都滿足以上的格式 , 因此最開始Pod的YAML文件的意思是“使用v1穩(wěn)定版本的API信息,類型是Pod,名稱是hello-pod,具體實(shí)現(xiàn)是開啟,有兩個(gè)容器 。
知道了YAML的概念,讓我們?cè)诨貧w主題 。為了解決容器單一進(jìn)程問題,只創(chuàng)建Pod的原因之一是通過Pod實(shí)現(xiàn)了自己的容器設(shè)計(jì)模式 , 而則為編寫了最適合的容器設(shè)計(jì)模式 。
舉個(gè)最常用的例子:
Java項(xiàng)目并不能像.Net Core項(xiàng)目那樣編譯完成后直接自宿主運(yùn)行,必須要把編譯生成的war包拷貝到服務(wù)宿主程序比如的運(yùn)行目錄下才可以正常使用 。但是在實(shí)際情況中越大的公司分工越明確,很大概率負(fù)責(zé)Java項(xiàng)目開發(fā)和服務(wù)宿主程序開發(fā)的團(tuán)隊(duì)并不是同一團(tuán)隊(duì) 。
為了讓上述情況中的兩個(gè)團(tuán)隊(duì)可以各自獨(dú)立開發(fā)并且還可以緊密合作,我們可以使用Pod解決這個(gè)問題 。
下面這個(gè)yaml文件就定義了一個(gè)滿足上述需求的Pod:
在這個(gè)yaml文件中,我們定義了一個(gè)java程序和程序的容器,并且對(duì)這兩個(gè)容器之間的容器進(jìn)行了一次掛載操作:將java程序的/app路徑以及程序的/root/-/同時(shí)掛載到了-這個(gè)掛載卷上,并且最后定了這個(gè)掛載卷就是一個(gè)內(nèi)存數(shù)據(jù)卷 。并且定義了java程序所在的容器是一個(gè),說明此容器是在容器之前啟動(dòng)的,并且啟動(dòng)之后執(zhí)行了一個(gè)cp的命令 。
在上述Pod描述了這樣一個(gè)場(chǎng)景:程序運(yùn)行開始運(yùn)行時(shí),Java容器啟動(dòng),把自己的war包.war拷貝到了自己的/app目錄下;之后容器啟動(dòng) , 執(zhí)行啟動(dòng)腳本,執(zhí)行的war包從自己的/root/-/路徑下獲得 。
可以看到通過上述的配置描述,我們既沒有改動(dòng)Java程序 , 也沒有改動(dòng)程序,卻讓它們完美地配合工作了,完成了解耦操作 。這個(gè)例子就是容器設(shè)計(jì)模式中的模式,還有很多設(shè)計(jì)模式,感興趣的同學(xué)可以去進(jìn)一步自行學(xué)習(xí) 。
總結(jié)
以上介紹的就是為了解決緊密關(guān)系而抽象出來的概念Pod的基礎(chǔ)內(nèi)容了 , 需要注意的是,Pod提供的只是一種編排的思想 , 而不是具體的技術(shù)方案 , 在我們使用的框架中 , Pod只不過是以作為載體實(shí)現(xiàn)了而已,如果你使用的底層容器是虛擬機(jī),比如,那這個(gè)Pod創(chuàng)建時(shí)就根本不需要Infra ,因?yàn)樘摂M機(jī)天生就支持多進(jìn)程協(xié)同 。
在說完了Pod的基礎(chǔ)的內(nèi)容 , 在下一節(jié)中我們將會(huì)為大家介紹在接下來的容器編排戰(zhàn)爭之中 , 又是如何脫穎而出 。
請(qǐng)敬請(qǐng)期待下文哦~求,不迷路!
本文到此結(jié)束 , 希望對(duì)大家有所幫助 。