鐘成:華為CCE容器引擎實(shí)踐
2016年5月28日,華為開發(fā)者匯南京站在安德門黑馬路演中心圓滿落幕。本次沙龍議題增加到六個(gè),時(shí)間安排上也從之前的半天擴(kuò)展到全天。講師有來(lái)自華為、蘇寧、途牛的多位好手,議題涵蓋”通訊即服務(wù)“、”內(nèi)源開發(fā)“、”探索性測(cè)試“、”容器技術(shù)”、“電商平臺(tái)遷移”、“訂單架構(gòu)優(yōu)化”。
來(lái)自華為CCE容器云資深工程師鐘成給大家?guī)?lái)的是《華為CCE容器引擎實(shí)踐》。隨著業(yè)界正在從IaaS向PaaS不斷發(fā)展。Docker這類容器成為當(dāng)下炙手可熱的云技術(shù)。鐘成的演講基本穿越了整個(gè)容器技術(shù)的生命周期,臺(tái)下很多同樣在使用容器技術(shù)的參會(huì)者抓緊機(jī)會(huì)和他進(jìn)行了溝通,比如Docker的安全、Docker網(wǎng)絡(luò)的控制和性能優(yōu)化等等。
現(xiàn)場(chǎng)實(shí)錄:
今天也是非常感謝林宇強(qiáng),感謝南京的各位開發(fā)者。我前期也來(lái)過(guò)一次南京,也比較早了,那時(shí)候來(lái)了一天,稍微逛了逛就回去了,沒(méi)有特別深入的跟南京這邊的程序員、開發(fā)成員有接觸。這次也是借著這個(gè)機(jī)會(huì),很高興來(lái)到這邊,覺(jué)得這里還是非常有活力的。我平時(shí)是在杭州那邊,我本人也是杭州人,我們部門大部分的開發(fā)人員也都是在杭州這邊,我也算是比較剛好,順便。
今天我的議題主要想講一下關(guān)于容器,企業(yè)云CCE容器實(shí)踐。這個(gè)膠片我做了有一段時(shí)間了,今天這個(gè)氛圍也很好,剛好人也不是特別多,也不是幾千人,我們可以多交流一下。過(guò)程中有什么問(wèn)題可以隨時(shí)打斷我,隨時(shí)問(wèn)我。這也是比較新的領(lǐng)域,目前比較熱門的領(lǐng)域。
首先我想問(wèn)一下大家,大家在自己的生產(chǎn)實(shí)踐過(guò)程當(dāng)中,有用過(guò)容器或者用過(guò)docker的嗎?有五六個(gè)人,我大概知道了,所以這個(gè)還是屬于比較早期的東西。我們就開始吧。
這是我今天的目錄,容器部署,容器服務(wù),和CCE做的一些事情。
我們部門是屬于華為的中央軟件院的數(shù)據(jù)開發(fā)的,是屬于PaaS開發(fā)的。我先介紹一下背景,整一個(gè)云服務(wù)的背景。在現(xiàn)在這個(gè)時(shí)代Iaas服務(wù),云計(jì)算云服務(wù),一提到這三個(gè)字大家想到的第一個(gè),國(guó)外的就是亞馬遜,就是AWS,國(guó)內(nèi)就是阿里云,阿里云現(xiàn)在在國(guó)內(nèi)也做的非常好,也有很多的用戶,一百多萬(wàn)的用戶,也有很多的盈利。云計(jì)算這個(gè)東西現(xiàn)在在國(guó)外已經(jīng)非常流行了,很多大的公司自己不會(huì)從中搭建一個(gè)數(shù)據(jù)中心,大家選擇使用已經(jīng)成熟的云平臺(tái)。比如像(03:02),拍攝《紙牌屋》的這家公司,它原本是做一個(gè)錄像帶租賃方,現(xiàn)在開始做網(wǎng)上的視頻服務(wù)。他自己是沒(méi)有云數(shù)據(jù)中心的,他把他自己所有的業(yè)務(wù)都運(yùn)行在亞馬遜的AWS上面。這么做有什么好處呢,他可以省去自己建造這些基礎(chǔ)設(shè)施的時(shí)間和精力,因?yàn)殡S著現(xiàn)代計(jì)算機(jī)領(lǐng)域的發(fā)展,分工非常的細(xì),你從中搞一個(gè)數(shù)據(jù)中心是非常耗時(shí)間,非常耗人力,而且也非常得不償失的,你可能要花很多時(shí)間做這個(gè)事。如果你已經(jīng)有一個(gè)成熟的云平臺(tái),一些做具體業(yè)務(wù)的公司,完全可以把我的產(chǎn)品,把我的業(yè)務(wù)直接寫一些應(yīng)用程序,部署到這些云上。這是目前國(guó)外的情況。
右邊這個(gè)是一幅國(guó)外的咨詢公司,叫(04:02),對(duì)現(xiàn)代云計(jì)算成熟度的一個(gè)評(píng)估。這里有兩個(gè)維度,橫坐標(biāo)是所謂的產(chǎn)品層,(04:21),這套東西從概念商來(lái)說(shuō),從思想體系來(lái)說(shuō)是否足夠支撐。縱坐標(biāo)是指我產(chǎn)品的成熟度,比如我做出來(lái)的東西是否達(dá)到了我預(yù)期的想法。大家可以看到遙遙領(lǐng)先的是AWS和微軟的azure這兩個(gè)云。目前云計(jì)算一種通用的模式是,所謂的IaaS,這里有一幅圖,大家可以看到,傳統(tǒng)的IT就是全段式的,我這個(gè)軟件開發(fā)者要操心很多事情,從底層的存儲(chǔ)、服務(wù)器、虛擬化、操作系統(tǒng)、中間件,一直到這個(gè)系統(tǒng)的運(yùn)行。IaaS對(duì)于我的開發(fā)者來(lái)說(shuō),我只要操心上面的操作系統(tǒng)以上的東西,操作系統(tǒng)以下的東西我全部都交給云服務(wù)商。他給你提供一個(gè)虛擬機(jī),你在上面可以裝自己想要的操作系統(tǒng),可以運(yùn)行你自己的程序。至于里面的硬件怎么樣,它是什么機(jī)器,用了什么網(wǎng)絡(luò),用了什么存儲(chǔ),你不用操心,你只要在網(wǎng)上點(diǎn)擊一下,就可以用了。
下面的兩幅圖是PaaS和SaaS,這是當(dāng)時(shí)的一個(gè)圖。這個(gè)圖是IaaS提出之后大家對(duì)這個(gè)的劃分,后來(lái)發(fā)現(xiàn)這個(gè)劃分并不是完全的準(zhǔn)確。
隨著技術(shù)的發(fā)展,新出了一些技術(shù),就是docker技術(shù),不知道大家對(duì)這個(gè)了不了解,簡(jiǎn)單的給大家介紹一下??傮w來(lái)講它是操作系統(tǒng)內(nèi)賦的一些能力,它跟傳統(tǒng)虛擬機(jī)的技術(shù)是有區(qū)別的。傳統(tǒng)的虛擬機(jī)是在物理機(jī)上先布一個(gè)操作系統(tǒng),這個(gè)操作系統(tǒng)上面我布一個(gè)(06:22),上面再布一個(gè)(06:24%。也就是說(shuō)我底層可以是一個(gè)非常小的內(nèi)核,可能就是幾十兆的操作系統(tǒng),上層可以布上一個(gè)(06:31),這個(gè)就是傳統(tǒng)的虛擬機(jī)技術(shù)。就是我在操作系統(tǒng)上再做一個(gè)操作系統(tǒng)。容器技術(shù)就是打破了原先的方式,它是在底層的機(jī)器上,我去啟動(dòng)一個(gè)容器的引擎,上面運(yùn)行一個(gè)進(jìn)程。這個(gè)容器本質(zhì)上來(lái)說(shuō)是我底層操作系統(tǒng)的一個(gè)進(jìn)程,它并不是一個(gè)完整的操作系統(tǒng)。但是對(duì)于我里面的應(yīng)用來(lái)說(shuō),我看到的是一個(gè)完整的操作系統(tǒng)。這是什么概念呢,我底層可以是一個(gè)(07:06),上層應(yīng)用程序,我這個(gè)AHDP是一個(gè)JAVA的操作程序,我看到的是一個(gè)(07:16)的系統(tǒng)。APPA可能是一個(gè)得邊的操作系統(tǒng)。我從應(yīng)用程序來(lái)看,看到下面這個(gè)操作系統(tǒng)跟底層操作系統(tǒng)不一樣。但是從操作系統(tǒng)往上看,又是一個(gè)進(jìn)程。
容器是怎么做到這一點(diǎn)的呢,是融合了幾項(xiàng)以前就已經(jīng)有的技術(shù),它把linux本身內(nèi)核帶有的技術(shù),還有(07:46)的技術(shù),包括最早的(07:49),都是這個(gè)原形。我這個(gè)進(jìn)程跑起來(lái)的時(shí)候,我掛在的文件系統(tǒng)并不是這個(gè)宿主機(jī)的這個(gè)文件系統(tǒng)。我掛一個(gè)特殊的文件系統(tǒng),這個(gè)文件系統(tǒng)里面看到的文件都是我自己這個(gè)操作系統(tǒng)的。這個(gè)東西有什么好處呢,從這個(gè)圖象能夠看得出來(lái),首先減少了虛擬化的層次。傳統(tǒng)的虛擬化在操作系統(tǒng)上再跑一個(gè)操作系統(tǒng),中間可能會(huì)要損失掉30%到40%的性能。不管是我的CPU性能也好,還是RO性能也好,都是有損失的。使用了容器以后,可以說(shuō)我的性能幾乎是沒(méi)有損失的。就跟我運(yùn)行一個(gè)普通的程序是一樣的,這是它的第一個(gè)優(yōu)勢(shì)。這還是運(yùn)行時(shí)期。第二個(gè)優(yōu)勢(shì)就是啟動(dòng)速度,我啟動(dòng)一個(gè)虛擬機(jī),大家在云平臺(tái)上啟動(dòng)過(guò)的就知道,你創(chuàng)造一個(gè)虛擬機(jī),到虛擬機(jī)真正出來(lái),可能要耗十幾分鐘。容器是可以達(dá)到兩級(jí)啟動(dòng),可以跟啟動(dòng)一個(gè)進(jìn)程一樣快。自從docker公司或者容器技術(shù)在這兩年慢慢的推廣開來(lái)之后,越來(lái)越多的公司開始投資這個(gè)技術(shù),加入這個(gè)技術(shù),希望把這個(gè)技術(shù)提升到自己整個(gè)的應(yīng)用系統(tǒng)里面去。這是對(duì)容器技術(shù)的描述,大家有興趣的話可以看一下,容器技術(shù)也不僅僅是docker一種,因?yàn)樗玫牡讓幽芰κ且粯拥摹?/p>
回頭我可以再講一講,這個(gè)容器技術(shù)有這么多優(yōu)點(diǎn),它有什么缺點(diǎn)呢,其實(shí)容器技術(shù)是有很大缺點(diǎn)或者問(wèn)題的。其實(shí)也很簡(jiǎn)單,我上面運(yùn)行的應(yīng)用程序本身是一個(gè)進(jìn)程,也就是說(shuō)我上面的APP用的是底層的內(nèi)核。我只可能在linux的操作系統(tǒng)上運(yùn)行一個(gè)linux的容器,我不可能在linux上運(yùn)行windows的容器,這就是一個(gè)非常大的問(wèn)題。當(dāng)然對(duì)于很多場(chǎng)景是沒(méi)有問(wèn)題的,但是這也是一個(gè)潛在的問(wèn)題,你不可能在一個(gè)windows的機(jī)器上運(yùn)行l(wèi)inux的容器,你也不可能在linux的系統(tǒng)上運(yùn)行windows的容器。這是目前的限制之一。還有一個(gè)一致,我系統(tǒng)的隔離性有一定的安全隱患,傳統(tǒng)的虛擬機(jī),我上面的應(yīng)用程序跟下面的(10:40)的核心是通行的,你可以認(rèn)為是一個(gè)沙箱,就算我的黑客再厲害,能夠突破的也只有上面操作系統(tǒng)的權(quán)限,不可能突破下面操作系統(tǒng)的權(quán)限。假定A應(yīng)用是A用戶的,B應(yīng)用是B用戶的,我黑客再厲害,只能打破A應(yīng)用的底層,沒(méi)有辦法穿透到B應(yīng)用的里面來(lái)。在這里就有問(wèn)題,如果有非常厲害的黑客,能夠黑進(jìn)我底層的內(nèi)核,就可以攻擊B的應(yīng)用程序。所以這是容器技術(shù)的一個(gè)軟肋。不過(guò)我們后面有各種方式和方法規(guī)避這個(gè)問(wèn)題,可以對(duì)它一系列的改進(jìn)。
這是容器技術(shù)的一個(gè)簡(jiǎn)史,一開始容器技術(shù)是一個(gè)所謂的資源隔離,傾向于虛擬機(jī)。一開始大家看到規(guī)格跟(11:44)開始做的,他們?cè)趦?nèi)核上實(shí)現(xiàn)一些機(jī)制,可以把進(jìn)程資源隔離開來(lái)。我可以限定某一個(gè)進(jìn)程只用10%的CPU,10%的內(nèi)存,另外一個(gè)進(jìn)程使用其他的一些東西。到了階段二,2013年之后,docker公司出現(xiàn),他們提供了一套比較完整的容器的打包發(fā)布,到啟動(dòng)的過(guò)程。大家有興趣的話可以自己去試一下,它的好處是可以解決你的很多運(yùn)維問(wèn)題,你的應(yīng)用程序的問(wèn)題?,F(xiàn)在很多公司或者組織已經(jīng)在docker推了這些鏡像,你以前跑一個(gè)(12:31),要先去下一個(gè)JAVA,再下一個(gè)(12:36),把這個(gè)東西配起來(lái),可能要花個(gè)半天時(shí)間。你現(xiàn)在裝了docker之后,可以在幾分鐘之后,或者直接一條(12:46)命令就可以把別人整個(gè)打包好的程序運(yùn)營(yíng)起來(lái)。這就是容器技術(shù)帶來(lái)的生產(chǎn)力上的提升,你可以減少很多軟件的安裝,你的配置,你的運(yùn)維方面的工作。可以通過(guò)一條命令,就把它執(zhí)行起來(lái)。
隨著技術(shù)的發(fā)展,越來(lái)越多的公司在往這方面投資,他們成立了一個(gè)技術(shù)組織,技術(shù)協(xié)議。他們希望這個(gè)技術(shù)成為一種業(yè)界通用的標(biāo)準(zhǔn),而不是成為某家公司所壟斷的技術(shù)。像Windows一樣,雖然它做的很好,你無(wú)法在業(yè)界各個(gè)公司使用它,這是非??上У摹HA為也是這個(gè)組織的成員之一。
剛才我講了很多容器的好處,可以輕松的管理應(yīng)用程序,可以輕松的啟動(dòng)這個(gè)東西。是否有了容器之后,就可以解決我們很多運(yùn)維的問(wèn)題,開發(fā)的問(wèn)題,測(cè)試的問(wèn)題。對(duì)于現(xiàn)在的情況而言還是相差很多的,我們現(xiàn)在容器的技術(shù)專注于單機(jī)的容器的啟動(dòng)和停止壽命周期管理,你可以運(yùn)行一些簡(jiǎn)單的應(yīng)用,但是對(duì)于一個(gè)大規(guī)模的集群,比如說(shuō)我一個(gè)公司在計(jì)算里面有20臺(tái)機(jī)器,或者說(shuō)有20個(gè)虛擬機(jī),或者你在IaaS的云上有20個(gè)虛擬機(jī),你去管理這些東西要耗費(fèi)很多的精力。你要一臺(tái)一臺(tái)的對(duì)它進(jìn)行部署,進(jìn)行安裝,進(jìn)行升級(jí)。每次有新的應(yīng)用程序發(fā)布的時(shí)候,我要挑幾臺(tái)進(jìn)行更新,其實(shí)也是非常麻煩的一件事情。對(duì)于一個(gè)大規(guī)模的機(jī)器集群來(lái)說(shuō),全生命周期的操作,可以說(shuō)整個(gè)業(yè)界還沒(méi)有一個(gè)非常好的解決方案,只能說(shuō)有很多正在做的解決方案。這就是我們部門正在做的一個(gè)事情,希望能夠解決這個(gè)問(wèn)題。
這是對(duì)我們部門工作的介紹,這些講的具體的事情,我們部門想做的一件事情是什么呢,降低大家大規(guī)模使用容器集群的成本。你可以在三四行的命令之上,就可以發(fā)布一個(gè)復(fù)雜的系統(tǒng),我可以把一個(gè)大規(guī)模的網(wǎng)站系統(tǒng),或者說(shuō)一個(gè)業(yè)務(wù)系統(tǒng),中間有三四個(gè)服務(wù)器,我可以通過(guò)簡(jiǎn)單的一些操作,對(duì)它進(jìn)行一個(gè)管理,降低我在這方面運(yùn)維的成本,包括監(jiān)控,包括運(yùn)維,包括開發(fā)。最好我代碼開發(fā)完了之后,希望直接進(jìn)行測(cè)試,這個(gè)也是容器的一個(gè)優(yōu)勢(shì)。在傳統(tǒng)的計(jì)算機(jī)行業(yè)里面有一個(gè)非常大的痛點(diǎn),有一個(gè)場(chǎng)景。開發(fā)人員開發(fā)出來(lái)一個(gè)程序,好好的,應(yīng)用起來(lái)沒(méi)有問(wèn)題。但是用戶一用發(fā)現(xiàn)出現(xiàn)問(wèn)題了,開發(fā)人員、應(yīng)用成員和用戶人員吵起來(lái)了。開發(fā)人員說(shuō)在我的環(huán)境里面一點(diǎn)問(wèn)題都沒(méi)有,前面啟動(dòng)起來(lái)就可以了。但是用戶不這么想,用戶說(shuō)在我的環(huán)境就是不行。這就是因?yàn)樗麄儍烧呤褂玫牡讓硬僮飨到y(tǒng),包括里面的一些中間件,包括里面的一些數(shù)據(jù)庫(kù),配置上有一些微妙的差別。你通過(guò)容器之后,在發(fā)布的時(shí)候并不僅僅是發(fā)布一個(gè)程序,是把所有的二進(jìn)制程序,包括依賴的這些包。像(16:56),把這些東西統(tǒng)一的打成一個(gè)鏡像,統(tǒng)一的發(fā)布運(yùn)行。這樣可以達(dá)到一個(gè)什么效果呢?我開發(fā)人員啟動(dòng)的這么一個(gè)東西,跟我最后在線上、生產(chǎn)上直接運(yùn)行的東西是完全一樣的,從運(yùn)行的角度來(lái)講是沒(méi)有任何區(qū)別的。這樣就可以解決困擾我們很久的開發(fā)跟測(cè)試,跟生產(chǎn)軟件不一致的情況。這也是我們要做的工作之一。
如果像docker公司,或者是容器技術(shù),他們已經(jīng)完成了一個(gè)集裝箱的工作,他們已經(jīng)把容器的標(biāo)準(zhǔn)給定下來(lái)了。我們現(xiàn)在已經(jīng)有一個(gè)容器了,后面我們要做的就是通過(guò)這個(gè)集裝箱建設(shè)一套完整的碼頭。這里包括了很多基礎(chǔ)設(shè)施,包括碼頭上的貨艙,包括碼頭上的起重機(jī),可以用來(lái)調(diào)這個(gè)集裝箱,包括各種各樣后面的卡車運(yùn)輸設(shè)備,這些其實(shí)是一個(gè)完整的生態(tài)系統(tǒng),我們是希望建立這套物流體系。建完這套體系之后,作為用戶來(lái)講,他想運(yùn)貨物很簡(jiǎn)單,只要跟這個(gè)物流公司說(shuō)一下,我要發(fā)一個(gè)集裝箱的貨物到美國(guó)去,我就不需要自己去租船了,不需要自己搬貨卸貨,所有的過(guò)程都是標(biāo)準(zhǔn)的,這是我們部門想做的事情,這是一個(gè)比喻。
為了完成我前面講的類似于像碼頭或者是像團(tuán)隊(duì)的工作,我們要做什么樣的工作呢。如果想做到這一點(diǎn),我們?cè)诖笠?guī)模程序上要做什么呢。你想知道未來(lái),首先得回顧歷史。我一直認(rèn)為軟件開發(fā)是一個(gè)管理復(fù)雜性的工作,作為開發(fā)人員也好,作為測(cè)試也好,其實(shí)你的本質(zhì)是要管理復(fù)雜性。什么是管理復(fù)雜度的最好的方式呢,就是進(jìn)行合理的抽象。操作系統(tǒng)其實(shí)就是一個(gè)非常標(biāo)準(zhǔn)、非常好的例子。這兩幅圖是我從國(guó)外的一本書《深入理解計(jì)算機(jī)系統(tǒng)》里面截下來(lái)的,操作系統(tǒng)給我們的開發(fā)者提供一個(gè)比較好的抽象,因?yàn)槲覀兊挠布?,我們的?jì)算機(jī)底層是有處理器,有內(nèi)存,有IO設(shè)備,包括硬盤組成的。但是作為我們應(yīng)用程序開發(fā)者不需要關(guān)心這個(gè)東西,我只要通過(guò)操作系統(tǒng)就可以抹平這個(gè)差距。操作系統(tǒng)提供什么抽象呢,它提供一個(gè)文件的抽象,通過(guò)文件我們操作硬盤上的這些存儲(chǔ),通過(guò)這個(gè)(20:14)可以操作我的內(nèi)存,通過(guò)進(jìn)程可以操作這三個(gè)所有的資源。你一旦通過(guò)操作系統(tǒng)提供這些API之后,比如說(shuō)你在windows上面開發(fā)了一個(gè)程序,或者java的程序,或者C程序,你完全可以到linux上面去?;蛘吣阍仍贗BM上面開發(fā)的一個(gè)軟件,完全可以在惠普的機(jī)器上使用。因?yàn)椴僮飨到y(tǒng)已經(jīng)幫你抹平了底層的差距,你不用關(guān)心這些硬件驅(qū)動(dòng),也不用關(guān)心里面具體用了哪個(gè)牌子的CPU,用了哪個(gè)牌子的內(nèi)存,用了那個(gè)牌子的硬盤,這些你都不用關(guān)心。
如果我們想把這個(gè)步驟往外推的話,想推到集群上面去,我們的愿景是想把整一個(gè)數(shù)據(jù)中心的集群也抽象成一個(gè)任何一個(gè)開發(fā)者都能夠輕易使用的設(shè)施,這是我們部門想做的一個(gè)事情,就是隔離的進(jìn)行抽象。我們部門目前使用的這個(gè)項(xiàng)目叫做Kubernetes,它是希臘語(yǔ)里面的舵,大海航行靠舵手。這個(gè)項(xiàng)目是一個(gè)谷歌的項(xiàng)目,是完全開源的,大家可以在gethop上找到它,入門看起來(lái)稍微有點(diǎn)復(fù)雜,但是后面你會(huì)發(fā)現(xiàn)它提供的這些抽象,對(duì)于管理大規(guī)模的集群是非常有效的。左邊這幅圖是它的技術(shù)架構(gòu),我首先有一個(gè)中心節(jié)點(diǎn),用來(lái)管理下面的所有機(jī)器。在這些機(jī)器上面我會(huì)運(yùn)行一個(gè)一個(gè)的容器,這些容器都是我可以通過(guò)Replication Controdler這個(gè)復(fù)制控制器分發(fā)下去,我創(chuàng)建的時(shí)候可以指定在我下面的數(shù)據(jù)中心上面,這里有四臺(tái)機(jī)器,我可以指定,比如說(shuō)這兩個(gè)紅的是一組,我要啟動(dòng)這兩個(gè)容器實(shí)例。啟動(dòng)這個(gè)實(shí)例之后,在這個(gè)數(shù)據(jù)中心一直跑著這樣的實(shí)例。假定我這臺(tái)機(jī)器掛掉了,因?yàn)槲业呐渲靡呀?jīng)配好了,就會(huì)在另外一個(gè)機(jī)器上再啟動(dòng)一個(gè)容器實(shí)例。這樣就保證了我在的數(shù)據(jù)中心當(dāng)中隨時(shí)都有兩個(gè)應(yīng)用程序,兩個(gè)容器的實(shí)例在工作。你就不用費(fèi)心管理上面一些硬件的問(wèn)題,如果這個(gè)硬件壞了,我可以后面慢慢的通過(guò)別的方式把它修復(fù)起來(lái),但是在這個(gè)過(guò)程當(dāng)中我的業(yè)務(wù)是沒(méi)有停頓的,比如它帶有一種自我修復(fù)的能力。
如果在這個(gè)數(shù)據(jù)中心中可以運(yùn)行的這些容器實(shí)例之后,后面要解決的問(wèn)題是什么呢,當(dāng)你把這個(gè)程序下發(fā)到這個(gè)數(shù)據(jù)中心的時(shí)候,就帶來(lái)一個(gè)問(wèn)題,我怎么知道我的應(yīng)用程序跑在哪臺(tái)機(jī)器上的呢。等到我做了這個(gè)系統(tǒng)之后,我突然發(fā)現(xiàn)對(duì)這個(gè)東西失去控制力了,根本不知道跑在什么地方。我下面怎么運(yùn)維它呢,怎么向外面提供服務(wù)呢。為了彌補(bǔ)這個(gè)問(wèn)題,Kubernetes采用了另外一種抽象,就是server這種抽象,它是一種服務(wù)發(fā)現(xiàn)的機(jī)制。它自動(dòng)的會(huì)在內(nèi)部維護(hù)這些容器實(shí)例的位置,當(dāng)你外部有一個(gè)業(yè)務(wù)流量進(jìn)來(lái)的時(shí)候,這個(gè)紅色的業(yè)務(wù)流量,假定這是一個(gè)網(wǎng)站,當(dāng)我有用戶請(qǐng)求的時(shí)候,進(jìn)來(lái)我會(huì)均勻的把這兩個(gè)流量負(fù)載均衡到這兩個(gè)容器當(dāng)中去。如果這個(gè)容器死了,在后面這臺(tái)機(jī)器啟動(dòng)之后,這里會(huì)自動(dòng)的把流量轉(zhuǎn)到這里去,這就是所謂的server的概念。只要我這個(gè)數(shù)據(jù)中心里面這兩個(gè)實(shí)例一直存在,我這個(gè)servers路由體系可以自動(dòng)的把這個(gè)業(yè)務(wù)流量轉(zhuǎn)到這個(gè)里面去,可以持續(xù)不斷的對(duì)外提供服務(wù),這就是Kubernetes帶來(lái)的主要的抽象。它的思路就是我底層的硬件是不可靠的,我是通過(guò)軟件的可靠性,來(lái)解決這個(gè)硬件的可靠性。我沒(méi)有說(shuō)把底層的機(jī)器做成一個(gè)非常強(qiáng)大的機(jī)器,就像IBM的(25:02),死了一個(gè)我還有備份,不是這樣的。我隨時(shí)都有這個(gè)機(jī)器,隨時(shí)可以死,沒(méi)有關(guān)系,但是我的軟件可以跟上來(lái)。
提問(wèn):?jiǎn)栆粋€(gè)問(wèn)題,那兩個(gè)pood之間是兩個(gè)對(duì)等的,怎么保證數(shù)據(jù)同步呢?
嘉賓:這里另外少畫了一幅,我外面會(huì)有一個(gè)云存儲(chǔ),這個(gè)我沒(méi)畫。你外在掛載了這個(gè)存儲(chǔ)實(shí)例之后,這兩個(gè)東西操作的數(shù)據(jù)其實(shí)就是同一個(gè)數(shù)據(jù),你這兩個(gè)pood本身是無(wú)狀態(tài)的,有狀態(tài)的是放在分布式存儲(chǔ)上面了。我不知道這樣講是不是比較清楚。
這是Kubernetes做的一些事情,好處前面我也講了,可以做一些細(xì)節(jié)。這是細(xì)節(jié)的一個(gè)協(xié)會(huì),這么好的東西我們也可能一家公司專有,華為也參加進(jìn)去了。
這是我們?nèi)A為內(nèi)部正在做的一個(gè)公有云的東西,叫CCE,就是提供容器集群服務(wù)的,目前還比較粗糙,我們大概6月底會(huì)發(fā)布一個(gè)正式版,進(jìn)行公測(cè),到時(shí)候大家可以看一下,這也算做一個(gè)廣告。這是我們做的寫工作,工具調(diào)優(yōu),圖形化編排,我們都跳過(guò)。這是我們對(duì)開源社區(qū)的貢獻(xiàn),華為目前在開源社區(qū),在國(guó)內(nèi)是排名第一的,對(duì)這個(gè)社區(qū)也提交了一些關(guān)鍵性的貢獻(xiàn),包括容器的調(diào)度,華為也是比較積極的參與開源。
這些業(yè)務(wù)上的東西先跳過(guò)吧。這是谷歌的一個(gè)架構(gòu),我覺(jué)得后面我們服務(wù)端的這些軟件慢慢的就會(huì)往這個(gè)方向遷移,底層的基礎(chǔ)設(shè)施就會(huì)慢慢的往這端走。底層我跑的是容器集群,剛才你看到的,包括像這些分布式存儲(chǔ),本身也是一個(gè)集群,內(nèi)部保證它的數(shù)據(jù)的一致性。最上面的才是業(yè)務(wù),和現(xiàn)在這種單臺(tái)機(jī)器割裂的方式有本身的區(qū)別。這些我們就先跳過(guò)吧。
這是二維碼,大家有興趣可以掃一下,時(shí)間不多,進(jìn)入到交流環(huán)節(jié)。
提問(wèn):我想問(wèn)一下docker這塊,包括后面集群這塊,有一些網(wǎng)絡(luò)上的問(wèn)題,因?yàn)閐ocker對(duì)于網(wǎng)絡(luò)這塊隔離群是有一定欠缺的。
嘉賓:對(duì)。
提問(wèn):我們用了什么樣的處理方式?
嘉賓:(28:37)可以說(shuō)是docker本身的一個(gè)實(shí)現(xiàn)。網(wǎng)絡(luò)這塊也是很多人會(huì)問(wèn)的,兄弟肯定是個(gè)專家,至少對(duì)這個(gè)方面有了解。目前我們?cè)诠性瞥S玫氖?28:52),我在原先的S網(wǎng)絡(luò)上再搭一層網(wǎng)絡(luò)。它的好處就是它有一層網(wǎng)絡(luò),你可以控制它,壞處就是它的性能會(huì)有一些損耗。我們后面的考慮有幾種方案,一種方案是我們直接使用底層S提供的網(wǎng)絡(luò),就是我們用(29:13),采用(29:15)進(jìn)行子網(wǎng)劃分,用(29:19)因?yàn)樽泳W(wǎng)通訊,這是我們后面的一種方式。
提問(wèn):現(xiàn)在你們docker這塊是部署在公有云上面的,是嗎?
嘉賓:對(duì)。
提問(wèn):而你們是用公有云的網(wǎng)絡(luò)去解決這個(gè)問(wèn)題。
嘉賓:目前還不是,但是后面會(huì)往這個(gè)方向延伸,我們沒(méi)有必要自己再搭建一套網(wǎng)絡(luò)的基礎(chǔ)設(shè)施,像PC這種東西,做起來(lái)很麻煩。我們可能會(huì)考慮跟(29:50)進(jìn)行結(jié)合,就是附用它里面的主機(jī)。如果是私有云的話,后面我們可能會(huì)自己?jiǎn)⒁粋€(gè)項(xiàng)目,直接把它拿過(guò)來(lái)用??赡軇兊舻讓覵層,直接運(yùn)行在物理機(jī)上面,但是上面的那層網(wǎng)絡(luò)還是用S層的那套網(wǎng)絡(luò),(30:10)這個(gè)東西來(lái)做,大致方向是這樣的。
提問(wèn):謝謝。
提問(wèn):你剛才講了容器,我想問(wèn)一下這個(gè)容器如果推廣應(yīng)用起來(lái),和我們目前有的雙機(jī),兩臺(tái)機(jī)子同時(shí)工作,一臺(tái)機(jī)子壞了,另一個(gè)機(jī)子工作。這個(gè)容器跟雙機(jī)有什么區(qū)別,各有哪些優(yōu)點(diǎn)和缺點(diǎn)。這是第一個(gè)問(wèn)題。第二個(gè)我們現(xiàn)在說(shuō)在異地建(30:52)機(jī)房,同樣的一套系統(tǒng)。包括現(xiàn)在講云技術(shù),公有云、私有云,目前這種情況和以往的從兩臺(tái)服務(wù)器上,這是一方面,異地(31:09)這種方式,從安全性上,從優(yōu)缺點(diǎn)上能不能幫我們介紹一下。
嘉賓:傳統(tǒng)的雙機(jī)是比較依賴于底層硬件的方式,你有兩臺(tái)機(jī)器,但是如果你兩臺(tái)機(jī)器恰好在這個(gè)機(jī)架上面,這個(gè)機(jī)架全部都掉電的話,你的系統(tǒng)還是會(huì)掛掉。而且你前面可能會(huì)用F5,或者用負(fù)載均衡設(shè)備。容器是一個(gè)集群的概念,我在這個(gè)系統(tǒng)上面并不是一臺(tái)機(jī)器上布了一個(gè)應(yīng)用,我可能一臺(tái)機(jī)器上布了五六個(gè)應(yīng)用,我又在另外一臺(tái)機(jī)器上布了五六個(gè)應(yīng)用。我這個(gè)應(yīng)用可以有很多個(gè)副本,可以超過(guò)兩個(gè),可以有七八個(gè)副本,分布在數(shù)據(jù)中心的七八臺(tái)機(jī)器上面,而且我可以通過(guò)調(diào)度的方式把它調(diào)度到不同的可用域上面。假定這個(gè)機(jī)架掛掉了,兩個(gè)容器掛了,但是另外那個(gè)機(jī)架上的三個(gè)容器還可以繼續(xù)工作,這是它提供的一個(gè)優(yōu)勢(shì)。
你要說(shuō)劣勢(shì),這是你在軟件上面,在你的軟件配置,軟件前期的規(guī)劃要花一些時(shí)間,你前期要定義好這個(gè)策略。不像雙十一,我任何應(yīng)用都可以一模一樣的搞兩份,這個(gè)還是有些區(qū)別的。就是開發(fā)人員肯定要感知這個(gè)數(shù)據(jù)中心本身的結(jié)構(gòu),這個(gè)我認(rèn)為這是一個(gè)區(qū)別。
提問(wèn):剛才那個(gè)同事已經(jīng)說(shuō)了,docker我們也用過(guò),主要問(wèn)題就是網(wǎng)絡(luò)問(wèn)題。因?yàn)橹v的都是高可用的方面,真正一個(gè)互聯(lián)網(wǎng)公司主要是提供一個(gè)持續(xù)的、穩(wěn)定的服務(wù)。網(wǎng)絡(luò)上docker在這方面劃分的時(shí)候有一些丟包,有網(wǎng)絡(luò)上的問(wèn)題,我們?cè)谔摂M機(jī)上也有問(wèn)題。我想了解一下你們?cè)谡嬲闆r,私有云、公有云平臺(tái)上,我真正的測(cè)試,一個(gè)虛擬機(jī)上具體要掛多少docker,或者能夠承載多大能力劃分的,怎么控制這個(gè)處理的問(wèn)題。剛才你可能講了一些思維方案,但是我知道你應(yīng)該有一些數(shù)據(jù)的支撐,你是怎么做的,我想了解一下。
嘉賓:目前是這樣的,其實(shí)容器有多種網(wǎng)絡(luò)模式,我們?cè)诓煌瑘?chǎng)景下用的模式不一樣。容器有多個(gè)維度,一個(gè)是打包可以運(yùn)行這個(gè)維度,還有是可以隔離網(wǎng)絡(luò)的維度。比如在我們公司內(nèi)部的(34:05)IT這個(gè)系統(tǒng)里面,一開始前面這個(gè)階段我們直接采用主機(jī)的網(wǎng)絡(luò),我們算是規(guī)避了這個(gè)問(wèn)題。
提問(wèn):進(jìn)行一個(gè)大規(guī)模的使用。
嘉賓:這是一個(gè)場(chǎng)景,他們?cè)鹊木W(wǎng)絡(luò)和他們的服務(wù)發(fā)現(xiàn)是依賴于物理機(jī)的,我們也沒(méi)有改它。但是在公有云這邊采用那種(34:35)的方式。根據(jù)我們現(xiàn)在的測(cè)試來(lái)說(shuō),基本它的性能比真實(shí)物理機(jī)的性能有一定損失的,可能損失在20%到30%左右,是這么一個(gè)情況。
提問(wèn):物理機(jī)真正達(dá)到多少個(gè)docker。
嘉賓:物理機(jī)上的話。
提問(wèn):跟它的配置有關(guān)。
嘉賓:對(duì),我們內(nèi)部做過(guò)測(cè)試,我自己主要做容器集群的性能。如果我們先不考慮應(yīng)用程序本身的資源消耗,我只談這個(gè)系統(tǒng)本身能力的話,一個(gè)節(jié)點(diǎn)上我可以啟動(dòng)40個(gè)容器是沒(méi)有問(wèn)題的,從管理面這個(gè)角度來(lái)講,我整個(gè)管理的操作都是沒(méi)有問(wèn)題的。數(shù)據(jù)面上,以前他們采用的是一個(gè)用戶態(tài)的流量,(35:35),現(xiàn)在我們已經(jīng)改成(35:36)了,在linux用(35:38)機(jī)器做網(wǎng)絡(luò)的轉(zhuǎn)發(fā)。這樣就把數(shù)據(jù)面的性能又提升了一些。但是這個(gè)問(wèn)題你要說(shuō)完全達(dá)到物理機(jī)非常非常高效的程度,我覺(jué)得是有一定困難的,這也是一個(gè)折中,我畢竟有部署上的靈活性。你可以通過(guò)布多個(gè)點(diǎn),來(lái)抵消這個(gè)問(wèn)題,這是我的一個(gè)理解。
提問(wèn):我之前沒(méi)有用過(guò)docker,但是我有兩個(gè)問(wèn)題想請(qǐng)教一下。第一個(gè)docker我比較關(guān)注雙機(jī)熱備的情況,比如我在你這個(gè)docker上運(yùn)行多個(gè)實(shí)例的話,這兩個(gè)實(shí)例必須是無(wú)狀態(tài)實(shí)例,對(duì)吧?
嘉賓:目前的方式,在集群里面你希望它無(wú)狀態(tài)遷移的話,A機(jī)器遷到B機(jī)器是有一定的要求,目前的狀態(tài)還沒(méi)有完全支持純有狀態(tài)的這種。但我們現(xiàn)在在開發(fā)一個(gè)特性,這有一個(gè)彌補(bǔ),一個(gè)是我把所有的狀態(tài)數(shù)據(jù)都遷到遠(yuǎn)程的硬盤上面去,就是云硬盤,這是一種方式。還有一種方式我去掛載一個(gè)硬盤,如果這個(gè)系統(tǒng)有問(wèn)題的話,我會(huì)試圖在本地進(jìn)行重啟。當(dāng)我這個(gè)硬盤或者這個(gè)東西壞了之后,我可以在本地進(jìn)行(37:33),在本機(jī)上重新啟動(dòng),這是另外一種規(guī)避的方式。
提問(wèn):如果我們現(xiàn)在在docker發(fā)布自己應(yīng)用的話,最好把所有的這個(gè)實(shí)例的運(yùn)行狀態(tài),在內(nèi)存當(dāng)中不要保存更多的信息,全部寫入存儲(chǔ)系統(tǒng),對(duì)吧,才能做到版本的切換。
嘉賓:對(duì),如果你對(duì)那個(gè)切換要求很高的話。不是說(shuō)你本地不能緩存數(shù)據(jù),這個(gè)緩存不是那種,你只是一個(gè)本地化。
提問(wèn):我就關(guān)注這個(gè),這個(gè)Catch的話,一旦你限級(jí)的話,Catch里面的數(shù)據(jù)都丟了。
嘉賓:對(duì)。
提問(wèn):也就是說(shuō)我們必須對(duì)存儲(chǔ)的運(yùn)行狀態(tài)全部同步的實(shí)時(shí)的寫入到文件系統(tǒng)當(dāng)中。
嘉賓:或者是遠(yuǎn)程的存儲(chǔ),我有一個(gè)Redis的集群,我可以把數(shù)據(jù)寫到Redis集群里面去。這其實(shí)是比較適合于大規(guī)模的互聯(lián)網(wǎng)的應(yīng)用,因?yàn)樗菑墓雀璩鰜?lái)的,谷歌從設(shè)計(jì)他們分布式系統(tǒng)的時(shí)候,本身這個(gè)程序就沒(méi)有狀態(tài),這是他們的一個(gè)設(shè)計(jì)。但我們還是希望做這個(gè)有狀態(tài)的應(yīng)用,這個(gè)待會(huì)下去可以討論,我們現(xiàn)在有好幾個(gè)方案可以解決這個(gè)問(wèn)題,這也是我們今年做的大的方向。
主持人:謝謝,再次謝謝講師。
(結(jié)束)















 
 
 











 
 
 
 