自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

K8s和云原生愛(ài)橫情仇

云計(jì)算 云原生
Johnny Boursiquot: 大家好,歡迎收聽(tīng) Go Time。這是一個(gè)多元化的討論節(jié)目,邀請(qǐng)?zhí)貏e嘉賓一起探討 Go 語(yǔ)言及其相關(guān)領(lǐng)域的各種話題,包括云基礎(chǔ)設(shè)施、分布式系統(tǒng)、微服務(wù)、無(wú)服務(wù)器架構(gòu),今天特別要討論的是非常流行且開(kāi)源的容器編排平臺(tái) Kubernetes。

Johnny[2] 和 Mat[3] 與 Kris Nova[4] 和 Joe Beda[5] 一起探討了 Kubernetes 和云原生。他們討論了 Kubernetes 推動(dòng)的“云原生”應(yīng)用的興起、使用 Kubernetes 的合適場(chǎng)合、運(yùn)行如此大型的開(kāi)源項(xiàng)目所面臨的挑戰(zhàn)、Kubernetes 的可擴(kuò)展性以及 Kubernetes 如何融入更大的云原生世界。

過(guò)程中為符合中文慣用表達(dá)有適當(dāng)刪改, 版權(quán)歸原作者所有.

圖片圖片

Johnny Boursiquot: 大家好,歡迎收聽(tīng) Go Time。這是一個(gè)多元化的討論節(jié)目,邀請(qǐng)?zhí)貏e嘉賓一起探討 Go 語(yǔ)言及其相關(guān)領(lǐng)域的各種話題,包括云基礎(chǔ)設(shè)施、分布式系統(tǒng)、微服務(wù)、無(wú)服務(wù)器架構(gòu),今天特別要討論的是非常流行且開(kāi)源的容器編排平臺(tái) Kubernetes。

我是 Johnny Boursiquot,今天和我一起的嘉賓陣容非常強(qiáng)大,正如 Mat Ryer 常說(shuō)的那樣。今天我們請(qǐng)到了 Mat 本人,還有另外兩位對(duì) Kubernetes 非常了解的嘉賓。請(qǐng)歡迎 Joe Beda,前 Heptio(譯者注: 現(xiàn)已被VMware收購(gòu)) 的 CTO,現(xiàn)在是 VMware 的一員;以及 Kris Nova,一位杰出的作者,同時(shí)也是 Kubernetes 的全能專家。大家好!

Joe Beda: 大家好,大家好!

Kris Nova: 嗨!

Johnny Boursiquot: 大家好!

Mat Ryer: 很高興今天能請(qǐng)到你們上節(jié)目。這將是一次非常有趣的討論……我知道很多聽(tīng)眾對(duì) Kubernetes 很了解,或者至少我認(rèn)為他們很了解 Kubernetes,但我想我們還是需要先統(tǒng)一一下基本概念。這是我們節(jié)目中經(jīng)常做的事情---讓那些剛接觸 Go 的人、剛加入社區(qū)的人和那些已經(jīng)深入了解 Kubernetes 背后有大量 Go 代碼的人都能有所收獲。

讓我們從基本問(wèn)題開(kāi)始,先弄清楚什么是容器編排,Kubernetes 在這個(gè)體系中扮演什么角色。

Joe Beda: Nova,你想先來(lái)解釋一下,還是我先來(lái)做一個(gè)簡(jiǎn)短的 "什么是 Kubernetes" 五分鐘快速介紹?

Kris Nova: 我想聽(tīng)你先做五分鐘的 Kubernetes 介紹,然后我可以再補(bǔ)充。

Joe Beda: 好的,你可以指出我哪里講錯(cuò)了。

Kris Nova: [笑]

Joe Beda: 假設(shè)大家對(duì)容器有一定的基礎(chǔ)了解---為了統(tǒng)一認(rèn)識(shí),容器的基本概念是將一個(gè)程序及其所有依賴項(xiàng)打包成一個(gè)東西,并使你可以在不同的機(jī)器上以可預(yù)測(cè)的方式運(yùn)行它。所以這實(shí)際上是關(guān)于程序的可移植性。我認(rèn)為 Go 語(yǔ)言開(kāi)發(fā)者已經(jīng)很幸運(yùn)了,因?yàn)?Go 是靜態(tài)鏈接的,你可以把一個(gè) Go 二進(jìn)制文件拿到任何地方運(yùn)行……但如果你試試用 Ruby 應(yīng)用、PHP 應(yīng)用、Python 應(yīng)用或 Node.js 應(yīng)用來(lái)做這件事,就會(huì)發(fā)現(xiàn)并不是所有的東西都像 Go 一樣自包含。因此,將這些東西打包成容器是一個(gè)很好的選擇。 (譯者注: "Go 是靜態(tài)鏈接"這種說(shuō)法實(shí)際是不準(zhǔn)確的)

顯然,Docker 讓容器變得非常易用且易于訪問(wèn),但最早的 Docker 只在單機(jī)上運(yùn)行,而我們?cè)?Google 構(gòu)建類似系統(tǒng)的經(jīng)驗(yàn)表明,當(dāng)你開(kāi)始考慮跨多臺(tái)機(jī)器的容器可移植性時(shí),事情變得更有趣。

因此,Kubernetes 的作用就是,你告訴它你想運(yùn)行什么---"我想運(yùn)行這個(gè)容器鏡像的十個(gè)副本",鏡像就是那個(gè)東西---然后它決定在何處運(yùn)行這些東西,并確保它們一直在運(yùn)行。

然后你會(huì)遇到一系列其他問(wèn)題---網(wǎng)絡(luò)應(yīng)該如何配置,存儲(chǔ)應(yīng)該如何處理,容器如何互相發(fā)現(xiàn),如何管理指向這些容器的負(fù)載均衡器等。所以,Kubernetes 解決了分配程序到計(jì)算機(jī)后衍生出的許多問(wèn)題。

從編排的角度來(lái)看,這就是 Kubernetes 的作用。與此同時(shí),我們實(shí)際上構(gòu)建了一個(gè)通用的分布式系統(tǒng)內(nèi)核,不僅可以描述如何運(yùn)行容器,還可以描述你想運(yùn)行哪些容器,如何升級(jí)它們,而且我們還使其具有可擴(kuò)展性,這也是目前 Kubernetes 生態(tài)系統(tǒng)中許多有趣的地方。

Kris Nova: 對(duì),然后我想補(bǔ)充一下---你說(shuō)得非常棒,一如既往……我唯一想強(qiáng)調(diào)的是,在過(guò)去四五年中,我們構(gòu)建 API 的重要性。正如你所說(shuō),Joe,它有點(diǎn)像分布式系統(tǒng)的內(nèi)核,但真正的價(jià)值在于我們終于能夠在整個(gè)行業(yè)中標(biāo)準(zhǔn)化。我們第一次看到大家聚集在一起,以相同的方式定義他們的應(yīng)用程序、網(wǎng)絡(luò)和存儲(chǔ)……這是云原生生態(tài)系統(tǒng)中一個(gè)非常強(qiáng)大的原語(yǔ)。

Johnny Boursiquot: 對(duì),關(guān)于這個(gè)云原生術(shù)語(yǔ)……

Joe Beda: 如果你愿意,我可以為你定義一下……

Johnny Boursiquot: 請(qǐng)說(shuō)。

Joe Beda: 好的,我想很多人都會(huì)對(duì)云原生的定義有所不同……Nova 也寫(xiě)了一本關(guān)于這個(gè)的書(shū),她可能是專家,但既然現(xiàn)在是我在說(shuō)話,我就先講完……[笑] 抱歉,Nova。 在我看來(lái),云的本質(zhì)就是運(yùn)行在別人的基礎(chǔ)設(shè)施上;它是 API 驅(qū)動(dòng)的,自助服務(wù)的,并且具有彈性。因此,從開(kāi)發(fā)者的角度來(lái)看,云通常意味著不需要與銷售人員溝通的一種服務(wù)。你可以直接使用信用卡進(jìn)行操作并開(kāi)始使用。這非常強(qiáng)大。

我認(rèn)為你還可以將這種 API 驅(qū)動(dòng)的自助服務(wù)應(yīng)用到企業(yè)內(nèi)部,雖然可能是另一個(gè)部門(mén)在提供服務(wù)……但如果做得好,應(yīng)用開(kāi)發(fā)者仍然擁有自助的體驗(yàn)。對(duì)我來(lái)說(shuō),云原生是指工具、文化和流程,用來(lái)充分利用這種能力。

如何真正利用這種 API 驅(qū)動(dòng)的自助服務(wù),并將其反饋到軟件構(gòu)建的過(guò)程中。你是如何定義的,Nova?

Kris Nova: 再次強(qiáng)調(diào),你又搶了我所有的好句子。你對(duì)云的定義確實(shí)很好,作為一種一等原語(yǔ)。不過(guò)當(dāng)我想到云原生時(shí),我認(rèn)為云是一回事,但原生(native)是另一回事,而這往往被忽視了……也就是在第一天,當(dāng)你走到白板前,打開(kāi)終端,或者在你寫(xiě)代碼的地方,設(shè)計(jì)系統(tǒng)的地方---在第一天就考慮到它是在云上運(yùn)行的。所以現(xiàn)在我們看到很多應(yīng)用程序的遷移,或者將現(xiàn)有的遺留應(yīng)用程序移到云上……在我看來(lái),這只是將遺留系統(tǒng)移到云上運(yùn)行,并不是真正的云原生應(yīng)用程序。云原生是從一開(kāi)始就以云為中心來(lái)設(shè)計(jì)應(yīng)用程序。

Mat Ryer: 那么這個(gè)項(xiàng)目是如何開(kāi)始的呢?Joe,它是從你在 Google 的工作中產(chǎn)生的嗎?然后這個(gè)開(kāi)源項(xiàng)目就由此衍生出來(lái)了嗎?

Joe Beda: 我最初啟動(dòng)了 Google Compute Engine,這是一個(gè)在 Google 上運(yùn)行虛擬機(jī)的奇怪項(xiàng)目,因?yàn)閹缀鯖](méi)有人使用虛擬機(jī)……而這個(gè)項(xiàng)目的作用其實(shí)是建立 GCP 的基礎(chǔ)設(shè)施云。你看看任何主要的云平臺(tái),虛擬機(jī)都是其基礎(chǔ)服務(wù)之一,其他所有東西都是基于它構(gòu)建的。

在 Google 內(nèi)部,幾乎沒(méi)人用虛擬機(jī),因?yàn)樗麄兪褂昧艘粋€(gè)叫做 Borg 的系統(tǒng)。它有點(diǎn)像 Kubernetes;容器的概念,打包成鏡像的方式---這些東西都有些不同……但總體的理念是一樣的:你描述你的程序,然后有一個(gè)系統(tǒng)來(lái)調(diào)度和運(yùn)行它。這個(gè)理念在 Google 內(nèi)部已經(jīng)驗(yàn)證了十年。因此,我們了解了這種方式對(duì)開(kāi)發(fā)者的好處以及它所能帶來(lái)的效率。

所以我們當(dāng)時(shí)的處境是這樣的---我們有幾件事想通過(guò) Kubernetes 來(lái)做。首先是改變游戲規(guī)則,因?yàn)槲覀冊(cè)谂c其他云平臺(tái)競(jìng)爭(zhēng)。像 Amazon 這樣的公司已經(jīng)占據(jù)了市場(chǎng)的主導(dǎo)地位,因此我們可以直接在虛擬機(jī)方面與它們競(jìng)爭(zhēng),或者我們可以嘗試讓開(kāi)發(fā)者以不同的方式編寫(xiě)程序,以充分發(fā)揮 Google 云的優(yōu)勢(shì)。

其次,我們希望將內(nèi)部員工開(kāi)發(fā)與外部客戶開(kāi)發(fā)的方式逐漸統(tǒng)一起來(lái),這樣內(nèi)部員工使用的系統(tǒng)體驗(yàn)會(huì)與外部客戶的體驗(yàn)更接近(如果不是完全相同的話)。

我們也知道,如果沒(méi)有開(kāi)源,這些東西就不會(huì)產(chǎn)生影響。從一開(kāi)始我們就認(rèn)為開(kāi)源是絕對(duì)必要的,并且我們真正承諾要做到開(kāi)放---從第一天起,我們就說(shuō)“你可以在 Amazon 上運(yùn)行這個(gè)”,這讓很多人感到驚訝……我們還做了其他一些事情,比如引入了很多來(lái)自 Red Hat 的優(yōu)秀人才。Red Hat 是我們?cè)缙诘囊粋€(gè)重要合作伙伴,幫助擴(kuò)展了 Kubernetes 的應(yīng)用場(chǎng)景和思維方式……所以這就是事情的開(kāi)始。

Mat Ryer: 這是一個(gè)非常有趣的故事。這個(gè)問(wèn)題本身也非常有趣……我以前是 App Engine 的用戶,雖然從外面看不太清楚內(nèi)部是如何運(yùn)作的,但我現(xiàn)在能看到使用 App Engine 與之前的差異,我只能想象在底層發(fā)生了什么變化……估計(jì)和 Kubernetes 和容器有關(guān)。因?yàn)閺?App Engine 的角度來(lái)看,部署現(xiàn)在感覺(jué)更加自然。是這樣的嗎?這個(gè)項(xiàng)目發(fā)生了類似的事情嗎?

Joe Beda: 我認(rèn)為 App Engine 本身也經(jīng)歷了演變,我不想替那個(gè)團(tuán)隊(duì)發(fā)言……但 GCE 和 App Engine 之間總是有點(diǎn)緊張關(guān)系,我認(rèn)為這種緊張關(guān)系也適用于 Kubernetes 和 App Engine。

上周我在 SpringOne[6] 平臺(tái)會(huì)議上做了一個(gè)演講(譯者注: 是VMWare組織的一個(gè)Spring開(kāi)發(fā)者、應(yīng)用程序架構(gòu)師的社區(qū)Conf),我談到了一點(diǎn)關(guān)于基礎(chǔ)設(shè)施即服務(wù)(IaaS)和平臺(tái)即服務(wù)(PaaS)之間的哲學(xué)差異。基礎(chǔ)設(shè)施即服務(wù)基本上是一組構(gòu)建塊,是一組樂(lè)高積木,可以用來(lái)構(gòu)建各種不同的東西。這不僅適用于虛擬機(jī),我認(rèn)為 Kubernetes 也仍然屬于這種工具箱級(jí)別的東西……而平臺(tái)即服務(wù)則更像是一個(gè)框架,其中有一些推薦的模式,如果你不遵循這些模式,那么使用起來(lái)就會(huì)更加困難,甚至無(wú)法完成你想做的事情。雖然這種方式通常效率很高,但有時(shí)也會(huì)帶來(lái)限制。

我認(rèn)為我們期待的是進(jìn)入一個(gè)兩者之間的界限不那么明顯的世界,這兩種解決問(wèn)題的方式可以更好地結(jié)合起來(lái)。

Johnny Boursiquot: 在我腦海中,我試圖想象在組織中,誰(shuí)的角色會(huì)負(fù)責(zé)這個(gè)問(wèn)題?基本上,我應(yīng)該把 Kubernetes 看作是一個(gè)用于部署應(yīng)用程序的工具,還是一個(gè)用于構(gòu)建部署平臺(tái)的工具?它是一個(gè)平臺(tái)構(gòu)建器,還是一個(gè)實(shí)際的平臺(tái)?

Joe Beda: 我認(rèn)為---我也很想聽(tīng)聽(tīng) Nova 的看法……但我認(rèn)為目前 Kubernetes 大致有三類用戶。我們發(fā)現(xiàn)有平臺(tái)團(tuán)隊(duì),我認(rèn)為最具前瞻性的組織會(huì)將平臺(tái)視為一種內(nèi)部產(chǎn)品。如何提供一個(gè)平臺(tái),讓他們能夠擴(kuò)展,向內(nèi)部團(tuán)隊(duì)提供更多的服務(wù)選項(xiàng),并在某種程度上提供類似于云的體驗(yàn),但在更大的組織限制范圍內(nèi)。這是在企業(yè)中我們常??吹降那闆r。

然后是應(yīng)用程序運(yùn)營(yíng)者和開(kāi)發(fā)者,應(yīng)用程序運(yùn)營(yíng)者在 Kubernetes 之上運(yùn)行應(yīng)用……有時(shí)人們也會(huì)同時(shí)扮演這兩種角色,就像 DevOps 的方式一樣。

我還認(rèn)為,平臺(tái)運(yùn)營(yíng)者通常會(huì)選擇使用 Kubernetes 的原始形式,但他們也會(huì)利用擴(kuò)展性和其他系統(tǒng),構(gòu)建出一種推薦的使用 Kubernetes 的方式,這樣會(huì)更容易使用……隨著時(shí)間的推移,這種推薦的體驗(yàn)會(huì)越來(lái)越像 PaaS,開(kāi)發(fā)者可以直接上手,完成工作;運(yùn)維的角色會(huì)減少很多繁瑣的工作,開(kāi)發(fā)者的體驗(yàn)會(huì)更像“我寫(xiě)代碼,我發(fā)布,它就能運(yùn)行”的方式。

Kris Nova: 補(bǔ)充一下---我們?cè)凇对圃A(chǔ)設(shè)施》這本書(shū)中也談到了這個(gè)問(wèn)題---我認(rèn)為還有第四類角色。我認(rèn)為書(shū)中提到的“基礎(chǔ)設(shè)施工程師”就是這個(gè)角色。實(shí)際上,這些人就像 Joe 和我一樣,負(fù)責(zé)在幕后編寫(xiě)管理基礎(chǔ)設(shè)施的軟件。這些人是 Kubernetes 的貢獻(xiàn)者,編寫(xiě)operator軟件的人,編寫(xiě)準(zhǔn)入控制器實(shí)現(xiàn)的人……我認(rèn)為這是一個(gè)非常新的工程角色,直到我們開(kāi)始擁有一個(gè) Joe 喜歡稱為“平臺(tái)之平臺(tái)”的東西之前,我們還沒(méi)有看到過(guò)這種角色。

Johnny Boursiquot: 順著這個(gè)思路---這讓我想起了我之前在 Twitter 上看到的一些內(nèi)容---這些角色對(duì)經(jīng)驗(yàn)的要求非常高,因此很難讓一個(gè)初級(jí)開(kāi)發(fā)者加入這些團(tuán)隊(duì)并有效地做出貢獻(xiàn)。進(jìn)入這些角色的門(mén)檻是否太高了?我看到很多招聘廣告,要求非常多,“你需要這個(gè)經(jīng)驗(yàn),你需要那個(gè)經(jīng)驗(yàn)……”從我的角度來(lái)看,似乎進(jìn)入這些角色的門(mén)檻非常高……從你的經(jīng)驗(yàn)來(lái)看,這是事實(shí)嗎?

Kris Nova: 我的看法是,這取決于你的團(tuán)隊(duì)有多成熟。如果我們已經(jīng)有基礎(chǔ)設(shè)施工程師和平臺(tái)團(tuán)隊(duì)到位,并且已經(jīng)有系統(tǒng)可以構(gòu)建應(yīng)用程序鏡像并推送到生產(chǎn)環(huán)境,那么進(jìn)入的門(mén)檻會(huì)比較低。這只需要你選擇一種你擅長(zhǎng)的語(yǔ)言編寫(xiě)應(yīng)用程序,然后讓現(xiàn)有系統(tǒng)處理剩下的事情。

但是,建立這些系統(tǒng)是一個(gè)完全不同的故事,這就是我們看到的高進(jìn)入門(mén)檻的地方,尤其是當(dāng)人們必須回答“我們?nèi)绾伍_(kāi)始為構(gòu)建流水線的各個(gè)階段以及推送到生產(chǎn)環(huán)境實(shí)施解決方案?”時(shí)。

Joe Beda: 是的,這里的確有很多東西需要學(xué)習(xí)。如果我們把 Kubernetes 稱為一個(gè)分布式系統(tǒng)內(nèi)核,那么那些擴(kuò)展它的人、深入研究它的人---在某種程度上,他們就是內(nèi)核工程師。而要成為一個(gè) Linux 內(nèi)核的專家,深入了解 Linux 內(nèi)核的方方面面并不容易,對(duì)吧?

我的一個(gè)觀察是,雖然這些東西是新的,但如果我們看看 AWS,它的服務(wù)菜單也不容易理解。需要掌握的內(nèi)容很多,要真正熟練使用 AWS 需要花費(fèi)幾個(gè)月的時(shí)間。這也是他們推出 Lightsail 的原因。(譯者注: AWS推出的一項(xiàng)基于云端的輕量級(jí)計(jì)算服務(wù),旨在使用戶能夠輕松快速地建立虛擬專用服務(wù)器(VPS),提供簡(jiǎn)便、經(jīng)濟(jì)實(shí)惠的云計(jì)算解決方案)  我認(rèn)為,對(duì)于任何高級(jí)云系統(tǒng)來(lái)說(shuō),都會(huì)有這樣一條學(xué)習(xí)曲線。

我還認(rèn)為,我們看到的現(xiàn)象是,學(xué)習(xí) Linux 的曲線也是如此,但它已經(jīng)成為了行業(yè)中的一種共享知識(shí),大家一起學(xué)習(xí),隨著時(shí)間的推移,它逐漸成為了行業(yè)中的背景噪聲。我認(rèn)為云計(jì)算也是如此,熟悉 Amazon (的云服務(wù)) 某種程度上也已經(jīng)幾乎成為了默認(rèn)要求,成為了背景噪聲……我認(rèn)為如果 Kubernetes 繼續(xù)保持它的增長(zhǎng)軌跡,并成為一種更普遍的底層技術(shù),那么熟悉或至少具備 Kubernetes 的工作知識(shí)將成為我們行業(yè)中默認(rèn)的技能之一。

Mat Ryer:  說(shuō)到開(kāi)源團(tuán)隊(duì),這個(gè)項(xiàng)目最初是如何開(kāi)始的?我想它和大多數(shù)項(xiàng)目一樣,應(yīng)該有一個(gè)較小的范圍吧?我不確定。它是如何演變的?有什么驚喜,或者你看到的有趣的事情是什么?

Kris Nova: 對(duì)我來(lái)說(shuō),最有趣的事情之一就是讓 Kubernetes 運(yùn)行起來(lái)……Joe 寫(xiě)了一本關(guān)于這個(gè)的書(shū)。但我注意到,無(wú)論是在開(kāi)源社區(qū)還是在商業(yè)企業(yè)中,從零開(kāi)始運(yùn)行 Kubernetes 對(duì)很多人來(lái)說(shuō)一直是一個(gè)難點(diǎn)(譯者注: 結(jié)合語(yǔ)境,把a(bǔ) high point of friction翻譯為 “難點(diǎn)”)。回頭看,這也是我最初被 Kubernetes 吸引的原因之一,我對(duì)我們已經(jīng)走了這么遠(yuǎn)感到驚訝,但我們?cè)谶@方面仍然沒(méi)有一個(gè)非常好的解決方案。

我認(rèn)為我們正在取得進(jìn)展,比如 Cluster API 項(xiàng)目[7]Kubeadm 工具[8],但即便如此,我認(rèn)為關(guān)于如何從零開(kāi)始運(yùn)行 Kubernetes,至今仍有很多問(wèn)題需要解答。

Joe Beda: 是的,我覺(jué)得這也是我最驚訝的地方。早期在 Kubernetes 項(xiàng)目中,我寫(xiě)了很多 Bash 腳本,用于在 GCP 和其他環(huán)境中部署 Kubernetes---這些腳本并沒(méi)有很好地適應(yīng)時(shí)間的變化……[笑] 我甚至寫(xiě)了一種方法來(lái)在 Bash 中導(dǎo)出堆棧跟蹤;對(duì)此我既感到害怕又有點(diǎn)自豪。所以我們并沒(méi)有真正重視集群本身的生命周期管理,包括運(yùn)行它的環(huán)境類型、如何構(gòu)建能夠跨所有這些環(huán)境擴(kuò)展的部署系統(tǒng)……因?yàn)樵谥饕墓苍铺峁┥躺蠁?dòng)一個(gè)集群,和在裸機(jī)上,或者用樹(shù)莓派啟動(dòng)集群,是完全不同的體驗(yàn)。

我認(rèn)為 Kubernetes 的一個(gè)優(yōu)勢(shì)在于它的可擴(kuò)展性---從零售商在每個(gè)商店中使用它, 像 Chick-fil-A 就是一個(gè)例子(譯者注: Chick-fil-A是一家總部位于美國(guó)喬治亞州的美式連鎖快餐店,以雞肉三明治為主要特色),他們用 Kubernetes 來(lái)管理店內(nèi)系統(tǒng),比如售貨點(diǎn)系統(tǒng)、數(shù)字標(biāo)牌等),到像 CERN(譯者注: 歐洲核子研究組織) 的粒子加速器這樣的大型設(shè)施,他們基本上是用它來(lái)做數(shù)據(jù)分析。所以這種可擴(kuò)展性非常強(qiáng)大,但這也意味著你在管理生命周期時(shí)會(huì)遇到不同的挑戰(zhàn),而我們?cè)陧?xiàng)目早期顯然低估了這種復(fù)雜性。

Johnny Boursiquot: 在行業(yè)會(huì)議上,你可能聽(tīng)到有人說(shuō)“我們要用 Kubernetes 來(lái)實(shí)現(xiàn)跨云部署。這將成為我們?cè)谒性浦系幕A(chǔ),這樣我們就有自由在不同云之間切換,甚至同時(shí)使用多個(gè)云。”你認(rèn)為這是明智之舉嗎?企業(yè)和開(kāi)發(fā)團(tuán)隊(duì)?wèi)?yīng)該在這一高層構(gòu)建,而不充分利用任何一個(gè)云的特定優(yōu)勢(shì)嗎?

Joe Beda: 我的看法是,對(duì)于很多公司來(lái)說(shuō),多云戰(zhàn)略是有意義的。首先,如果你是一家初創(chuàng)公司,你的首要任務(wù)是證明自己對(duì)世界有價(jià)值,而不是破產(chǎn)---無(wú)論如何,盡一切辦法證明你的價(jià)值主張是正確的。但是對(duì)于更成熟的公司來(lái)說(shuō),這更多的是風(fēng)險(xiǎn)管理問(wèn)題。這些公司認(rèn)為依賴單一供應(yīng)商有風(fēng)險(xiǎn),如果有辦法降低這種風(fēng)險(xiǎn),那就值得嘗試,而 Kubernetes 是實(shí)現(xiàn)這一目標(biāo)的技術(shù)之一。

另外,它還能很好地分離操作角色。你可以有專門(mén)的團(tuán)隊(duì)來(lái)管理 Kubernetes,無(wú)論是在 X、Y 或 Z 基礎(chǔ)設(shè)施上運(yùn)行 Kubernetes,還是使用某些服務(wù)來(lái)處理其中的一部分工作。最終你會(huì)在應(yīng)用層面上獲得一定的通用性。

當(dāng)然,我們可能無(wú)法屏蔽底層平臺(tái)的每一個(gè)細(xì)節(jié),有時(shí)你需要利用底層平臺(tái)的一些特定特性。但如果我們可以減少那些不必要的差異,就能讓?xiě)?yīng)用團(tuán)隊(duì)的技能更具可移植性,甚至讓?xiě)?yīng)用程序本身更加可移植。

另外,我們看到的一點(diǎn)是,這種做法可以在企業(yè)和其供應(yīng)商之間形成杠桿作用。比如你是亞馬遜的一個(gè)大客戶,正在談?wù)劭邸璠笑] 如果你完全依賴某些原生服務(wù),你的議價(jià)能力就會(huì)減弱,除非你有可信的“遷移”威脅。也就是說(shuō),你可以對(duì)他們說(shuō):“我們可以在兩個(gè)月內(nèi)從基礎(chǔ)設(shè)施 A 遷移到 B?!?這時(shí),你和供應(yīng)商之間的談判就會(huì)更加平衡。

Kris Nova: 接著 Joe 剛才的話題,我覺(jué)得在跨云定義應(yīng)用、網(wǎng)絡(luò)、存儲(chǔ)等抽象層次時(shí),我們經(jīng)歷了一段非常有趣的思維過(guò)程。例如,當(dāng)我們?cè)谠O(shè)計(jì) Cluster API 時(shí),無(wú)論你多么通用化,總會(huì)遇到某些特定于云的配置。因此,這是一項(xiàng)艱巨的任務(wù),首先要搞清楚哪些是通用部分,然后盡量減少為特定云設(shè)計(jì)的配置量。

如果你看看我們?cè)?Cluster API 中如何使用 provider config,你會(huì)發(fā)現(xiàn)我們開(kāi)始為特定云的部分進(jìn)行版本管理,同時(shí)仍然保持一個(gè)通用的配置超集。這是基于我們?cè)谠O(shè)計(jì) Kops[9](譯者注: Kops(Kubernetes Operations)是一個(gè)用于管理和部署 Kubernetes 集群的工具。它主要用于在云環(huán)境中(如 AWS、GCE 和其他云提供商)創(chuàng)建、管理和維護(hù) Kubernetes 集群) 和 Kubicorn[10] (譯者注: Kubicorn 是一個(gè)用于管理和部署 Kubernetes 集群的開(kāi)源工具。它的目標(biāo)是提供一種簡(jiǎn)單而靈活的方式來(lái)創(chuàng)建和管理 Kubernetes 集群,特別是在云環(huán)境中. 項(xiàng)目幾乎不維護(hù)了)時(shí)學(xué)到的經(jīng)驗(yàn)教訓(xùn),我們?cè)噲D讓它盡可能通用……但最終我們發(fā)現(xiàn)無(wú)法完全做到通用化。

因此,如果你有機(jī)會(huì)讀我的書(shū),我們會(huì)談到如何有效地使用軟件來(lái)管理 Kubernetes 集群的生命周期。而 Kubernetes 最根本的原則之一就是聲明式的本質(zhì)。換句話說(shuō),你定義了目標(biāo)或期望的狀態(tài),然后我們會(huì)隨著時(shí)間推移去協(xié)調(diào)那個(gè)狀態(tài)。Cluster API 只是在遵循這個(gè)原理,并將其應(yīng)用到基礎(chǔ)設(shè)施管理上。

你首先聲明 Kubernetes 集群的樣子,然后我們會(huì)去協(xié)調(diào)并使其成真。這在管理集群生命周期時(shí)很有幫助,因?yàn)槿绻覀兿雽?duì)集群進(jìn)行變更、擴(kuò)展、升級(jí)或進(jìn)行某種方式的調(diào)整,我們都在遵循相同的聲明式原則,背后會(huì)有某種機(jī)制自動(dòng)執(zhí)行這些操作。

Joe Beda: 我會(huì)這么說(shuō):我們基本上是在用 Kubernetes 已經(jīng)在大規(guī)模環(huán)境中驗(yàn)證過(guò)的模式來(lái)管理 Kubernetes 本身。

Johnny Boursiquot: 這很有道理。

Mat Ryer: 聽(tīng)起來(lái)像《盜夢(mèng)空間》啊。 [笑]

Joe Beda: 是的,Cluster API 項(xiàng)目的標(biāo)志是一堆疊起來(lái)的海龜,因?yàn)檫@就是“海龜疊疊樂(lè)”的概念。(譯者注: 一款流行的益智類游戲,通常以小海龜為主題, 游戲的主要目標(biāo)是通過(guò)疊放海龜來(lái)形成穩(wěn)定的結(jié)構(gòu),玩家需要運(yùn)用一定的策略和技巧來(lái)完成任務(wù))

Mat Ryer: 哈哈,沒(méi)錯(cuò)。

Johnny Boursiquot: [笑] 真有趣。我們來(lái)自 GoTime FM Slack 頻道的一個(gè)問(wèn)題……對(duì)于正在收聽(tīng)的朋友們---是的,我們錄制時(shí)會(huì)實(shí)時(shí)接受問(wèn)題,這是你們的機(jī)會(huì)。有人在頻道里問(wèn)道:“Kubicorn 還活著嗎?還是已經(jīng)被 Kubeadm 和 Kops 取代了?”

Kris Nova: 這是一個(gè)好問(wèn)題。我知道有些人---包括我自己---時(shí)不時(shí)還會(huì)用 Kubicorn。我認(rèn)為它從未打算成為可用于企業(yè)級(jí)規(guī)模管理 Kubernetes 集群的生產(chǎn)就緒工具。我覺(jué)得它是一次很好的思維練習(xí),可能我從中獲得的最大價(jià)值是它是第一個(gè)基于 Kubeadm 構(gòu)建的開(kāi)源 Kubernetes 管理工具……而這一點(diǎn)至今依然存在。如果你看看 Kubicorn 的工作原理,它現(xiàn)在相對(duì)靜態(tài),因?yàn)槲覀兛梢栽谶\(yùn)行時(shí)直接使用由上游推送的最新 Kubeadm 版本。所以我認(rèn)為,Kubicorn 只是一個(gè)自動(dòng)化使用 Kubeadm 而不是管理集群的工具。

通過(guò) Kubicorn、Kops 和 Kubeadm,我們學(xué)到了很多東西,而 Cluster API 是將這些經(jīng)驗(yàn)教訓(xùn)整合起來(lái)的很好的體現(xiàn)。所以,雖然它不再有所增長(zhǎng),但我不會(huì)說(shuō)它已經(jīng)完全消亡了。

Mat Ryer: 有趣的是,我注意到我們已經(jīng)提到了幾次這個(gè)主題---我對(duì)此非常感興趣,就是這些理念和項(xiàng)目必須不斷演進(jìn)。你談到了低估了向不同目標(biāo)部署的復(fù)雜性,而這是一個(gè)很好的例子。如果在一開(kāi)始就認(rèn)識(shí)到這些復(fù)雜性,可能你根本不會(huì)開(kāi)始這些項(xiàng)目,然而這些項(xiàng)目最終卻變得如此龐大、強(qiáng)大且功能齊全。所以這個(gè)理念是說(shuō),你不能在真空中設(shè)計(jì)這些東西。你必須先構(gòu)建它,讓它被使用,進(jìn)入現(xiàn)實(shí)世界,軟件才能變得更好、更成熟。你同意這一點(diǎn)嗎?

Joe Beda: 是的,我覺(jué)得---有幾點(diǎn)要說(shuō)……我認(rèn)為我們?cè)陂_(kāi)始時(shí)確實(shí)對(duì) Kubernetes 的增長(zhǎng)方向有一個(gè)相對(duì)清晰的愿景,這是基于我們?cè)?Borg 上的經(jīng)驗(yàn)。但確實(shí)有些地方我們一開(kāi)始簡(jiǎn)化了,只為了啟動(dòng)項(xiàng)目。你需要先開(kāi)始做這些事情。

隨著項(xiàng)目的成長(zhǎng),我們也擴(kuò)展了范圍。大約三、三年半前,我們意識(shí)到,隨著 Kubernetes 添加的功能越來(lái)越多……首先,我們無(wú)法跟上所有人的想法;其次,我們可能會(huì)犯錯(cuò),因此我們需要一種實(shí)驗(yàn)機(jī)制。所以我們開(kāi)始在 Kubernetes 中創(chuàng)建可擴(kuò)展性機(jī)制,我覺(jué)得這真的將 Kubernetes 從一個(gè)僅用于容器編排的工具,轉(zhuǎn)變?yōu)檎嬲?code style="background-color: rgb(231, 243, 237); padding: 1px 3px; border-radius: 4px; overflow-wrap: break-word; text-indent: 0px; display: inline-block;">---當(dāng)我們從技術(shù)上談?wù)撈脚_(tái)時(shí),它確實(shí)是平臺(tái)的基礎(chǔ)。通過(guò)這樣做,它讓我們能夠保持 Kubernetes 的范圍適當(dāng)。

Kubernetes 生態(tài)系統(tǒng)中的很多事情并不屬于 Kubernetes 項(xiàng)目本身,我認(rèn)為這是其成功的一個(gè)重要部分---能夠讓一個(gè)繁榮的生態(tài)系統(tǒng)蓬勃發(fā)展,在 Kubernetes 之上做有趣的事情,而不需要與核心 Kubernetes 開(kāi)發(fā)者打交道。這極大地推動(dòng)了項(xiàng)目和整個(gè)生態(tài)系統(tǒng)的發(fā)展。現(xiàn)在所有關(guān)于如何在 Kubernetes 之上部署應(yīng)用程序并提供分布式管理的討論,正是圍繞這一點(diǎn)展開(kāi)的。

Mat Ryer: 你剛才談到這個(gè)問(wèn)題---那么 Kubernetes 是如何實(shí)現(xiàn)可擴(kuò)展的?有哪些擴(kuò)展方式呢?

Joe Beda:  Kubernetes 有一堆內(nèi)置對(duì)象,你可以向它發(fā)出請(qǐng)求。例如,你可以說(shuō)“我想要一個(gè) pod”,它本質(zhì)上是一個(gè)容器組,Kubernetes 會(huì)負(fù)責(zé)選擇運(yùn)行它的機(jī)器,然后啟動(dòng)它。你還可以說(shuō)“我想要一個(gè)副本集”,這意味著“我想要這個(gè)特定模板的多個(gè)副本,我需要十個(gè)?!盞ubernetes 會(huì)確保你有十個(gè)副本。接著你還可以說(shuō)“我想要一個(gè)部署對(duì)象,這是一個(gè)版本管理的方式?!彼阅憧梢赃M(jìn)行版本升級(jí)等操作。我們?yōu)?Kubernetes 構(gòu)建了一層又一層的對(duì)象系統(tǒng)。

最核心的擴(kuò)展性功能是所謂的 自定義資源定義(CRDs)。它允許你在 Kubernetes 中創(chuàng)建新的對(duì)象,擴(kuò)展 Kubernetes 的模式,以便你可以將自己的東西引入。如果你不喜歡 Kubernetes 中的部署方式,因?yàn)樗鼰o(wú)法按照你想要的方式進(jìn)行藍(lán)綠部署,你可以編寫(xiě)一個(gè)與部署對(duì)象類似的對(duì)象,稱之為藍(lán)綠部署,它可以實(shí)現(xiàn)你想要的邏輯。

這實(shí)際上是擴(kuò)展了 Kubernetes 的模式,然后運(yùn)行一段代碼,執(zhí)行之前 Nova 提到的協(xié)調(diào)循環(huán),這是 Kubernetes 實(shí)現(xiàn)分布式系統(tǒng)的核心。

令人興奮的是,大家不僅將這一模式應(yīng)用于更領(lǐng)域特定的問(wèn)題上。例如,你可以管理 MySQL 實(shí)例或 Kafka 實(shí)例的部署,而不僅僅是應(yīng)用程序的部署。我們開(kāi)始看到大家將操作知識(shí)轉(zhuǎn)化為代碼,并在 Kubernetes 上運(yùn)行這些代碼。這樣你就可以用 Kubernetes 來(lái)創(chuàng)建一個(gè)類似 Amazon RDS 的系統(tǒng),既可以描述你想要的東西,也可以實(shí)現(xiàn)如何運(yùn)行這個(gè) RDS 類似系統(tǒng)的邏輯。

同時(shí)我們還看到人們將這種控制模式應(yīng)用到其他領(lǐng)域,不僅僅是運(yùn)行 Kubernetes 上的東西,還可以用于配置硬件負(fù)載均衡器、在特定云中配置服務(wù)等。我還聽(tīng)說(shuō)有人在企業(yè)內(nèi)部創(chuàng)建了一個(gè)自定義資源定義,用于描述團(tuán)隊(duì)及其成員……一旦你定義了這個(gè),它就會(huì)自動(dòng)為你創(chuàng)建 Bitbucket 倉(cāng)庫(kù)、Slack 頻道,并設(shè)置 CI/CD 系統(tǒng),所有這些都是基于你聲明的團(tuán)隊(duì)文檔。這就是 Kubernetes 賦予我們的分布式系統(tǒng)內(nèi)核的強(qiáng)大力量,它為 Kubernetes 注入了第二波活力。

Kris Nova: 當(dāng)我和 Kubernetes 新手交談時(shí),試圖向他們解釋 Joe 剛才提到的 CRD 的強(qiáng)大之處,我通常會(huì)先定義 CRD 中的兩個(gè)重要元素,這在 Kubernetes 的每個(gè)對(duì)象中都能看到:一個(gè)是 spec,它是你想要的定義;另一個(gè)是 status,它是對(duì)象當(dāng)前的實(shí)時(shí)狀態(tài)。正是因?yàn)槲覀兺瑫r(shí)擁有這兩者,協(xié)調(diào)這一原理才能發(fā)揮作用,這也是我們能夠構(gòu)建復(fù)雜的協(xié)調(diào)循環(huán)、控制器和運(yùn)算符的原因,無(wú)論我們想要做什么,作為軟件工程師都可以做到這一點(diǎn)。我認(rèn)為很多人沒(méi)有意識(shí)到 Kubernetes 在定義這些運(yùn)算符和控制器時(shí)賦予我們的強(qiáng)大能力和智慧。

Johnny Boursiquot: 嗯,我想他們現(xiàn)在肯定會(huì)關(guān)注這個(gè)了……[笑]

Joe Beda: 我會(huì)說(shuō)的是,編寫(xiě)這些控制器實(shí)際上比應(yīng)該的要難……這是目前的一個(gè)活躍探索領(lǐng)域,人們正在研究如何讓 Kubernetes 更易于使用,也更容易編程。我們還有很長(zhǎng)的路要走,才能讓這些東西更加可消費(fèi),更容易使用。

我想推薦一本書(shū)。這不是我的書(shū),也不是 Kris 的書(shū),而是由 Stefan Schimanski 和 Michael Hausenblas 編寫(xiě)的《Programming Kubernetes》[11]。我手里有一本……如果你想了解如何使用 Go 編寫(xiě) Kubernetes 代碼并開(kāi)始做一些 CRD 和控制器循環(huán)的開(kāi)發(fā),這是一本很好的入門(mén)書(shū)。這是一本 O'Reilly 出版的書(shū)。

Mat Ryer: 謝謝。

Johnny Boursiquot: 很棒。

Kris Nova: 是的,我覺(jué)得還需要指出的是,這個(gè)領(lǐng)域也有很多工具。我們從一個(gè)原型開(kāi)始,有一個(gè)名為 operator framework[12] 的解決方案,它來(lái)自 Red Hat 和 Core OS 的開(kāi)發(fā)者。我們還有一個(gè)開(kāi)源的上游項(xiàng)目 Kubebuilder[13]……所以我們正在尋找構(gòu)建控制器和運(yùn)算符的框架,但這仍然是一個(gè)不斷迭代和完善的過(guò)程,我們還沒(méi)有完全到達(dá)目標(biāo)。

Joe Beda: 說(shuō)到 Go,我認(rèn)為現(xiàn)在 Go 是編寫(xiě)這些東西的首選語(yǔ)言……所以,這就是了。 [笑聲]

Mat Ryer: 是的,我本來(lái)想問(wèn)這個(gè)問(wèn)題……如果你看 github.com/kubernetes/kubernetes 倉(cāng)庫(kù),我猜這是 Kubernetes 的主代碼庫(kù)……

Joe Beda: 我們叫它 KK。 [笑] Kubernetes/Kubernetes。

Mat Ryer: 好的!我們不會(huì)再嵌套了。

Joe Beda: 哈哈。 [笑聲]

Mat Ryer: 我注意到在語(yǔ)言構(gòu)成中,超過(guò) 90% 是 Go。那為什么一開(kāi)始 Kubernetes 選擇了 Go 作為開(kāi)發(fā)語(yǔ)言呢?

Joe Beda: 嗯,我想剩下的 10% 大概是 Bash,那都是我的錯(cuò),抱歉…… [笑聲] 我們選擇 Go 的第一個(gè)原因是 Docker 是其中一個(gè)關(guān)鍵因素,而 Docker 當(dāng)時(shí)也是現(xiàn)在也是用 Go 編寫(xiě)的。這對(duì)我們有很大的影響。我實(shí)際上堅(jiān)持使用 Go,因?yàn)榱硪晃粍?chuàng)始人 Brendan Burns 的最初 Kubernetes 原型是用 Java 編寫(xiě)的。我們同時(shí)也受到了 Mesosphere 的影響,它是一個(gè)較早的系統(tǒng);Mesosphere 也使用了一些不同的擴(kuò)展和編程理念,但本質(zhì)上它是一個(gè)龐大的 C++ 代碼庫(kù)。

(譯者注: 現(xiàn)在該公司叫D2iQ,Mesos背后的公司,可參考 曾經(jīng) Mesos 背后的公司,如今在干嘛?[14])

因此,我在考慮“我們是要像 Mesos 那樣做 C++ 嗎?還是要像 Apache Hadoop 那樣用 Java?又或者我們要看看社區(qū)、代碼質(zhì)量以及 Docker 生態(tài)系統(tǒng)中的互動(dòng)性?”我認(rèn)為 Go 是一個(gè)很好的選擇,它既足夠系統(tǒng)級(jí)別,又不像 C++ 那么難以接近,同時(shí)比 C++ 更加高效。因?yàn)橐业叫碌呢暙I(xiàn)者,并讓他們?cè)谝粋€(gè)龐大的 C++ 代碼庫(kù)中快速上手,這非常困難。盡管有人批評(píng) Kubernetes 是“Java 開(kāi)發(fā)者用 Go 寫(xiě)的”,但我覺(jué)得 Go 作為一個(gè)易于接近的系統(tǒng)級(jí)語(yǔ)言,最終是 Kubernetes 的正確選擇。

Kris Nova: 如果你對(duì)那些批評(píng) Kubernetes 是基于面向?qū)ο蟮?Go 系統(tǒng)感興趣,我去年在 FOSDEM 上做了一場(chǎng)演講,叫《You Can't Have a Cluster \[BLEEP\] Without a Cluster》[15]。在那次演講中我提到了許多 Go 編程語(yǔ)言中的反模式,這些模式可能源自傳統(tǒng)的面向?qū)ο笏季S。不想太多批評(píng)你和 Brendan,Joe……

Joe Beda:  是的,你知道,社區(qū)發(fā)展得太快了,很多人加入項(xiàng)目時(shí)并不了解 Go……這在一定程度上推動(dòng)了 Go 的發(fā)展,但也意味著他們可能是有經(jīng)驗(yàn)的程序員,但不一定擅長(zhǎng) Go……所以這就是我們看到的結(jié)果。我敢打賭,很多代碼庫(kù)看起來(lái)都很相似,基于相同的動(dòng)態(tài)。

Kris Nova: 但它是一個(gè)成功的模式,對(duì)我們而言是有效的。再次回到那個(gè)隨時(shí)間演變的教訓(xùn),我們是如何走到今天的,并不是一開(kāi)始就決定要以這種方式構(gòu)建系統(tǒng)的。真的很有趣。

Johnny Boursiquot: 讓我真正感受到 Kubernetes 價(jià)值的一個(gè)方面是,它最初的討論總是圍繞著“我們?cè)谔摂M機(jī)之上進(jìn)行容器編排,Kubernetes 為你提供了這種抽象,賦予你 pod 這個(gè)概念。”因此,你可以更高層次地處理部署,而不必直接處理虛擬機(jī)。那么現(xiàn)在“無(wú)服務(wù)器”---我做了個(gè)引號(hào)---已經(jīng)成為一種趨勢(shì),盡管我們都知道這更多是個(gè)市場(chǎng)術(shù)語(yǔ),但支持 Kubernetes 上的無(wú)服務(wù)器確實(shí)是件事,對(duì)吧?通過(guò) virtual-kubelet 項(xiàng)目[16],這變得可能。

從這個(gè)角度來(lái)看,你認(rèn)為 Kubernetes 是否會(huì)成為下一代部署模式的平臺(tái)?從虛擬機(jī)到容器,再到函數(shù)即服務(wù)……無(wú)論下一步是什么,Kubernetes 是否有能力通過(guò)其擴(kuò)展性來(lái)應(yīng)對(duì)?

Joe Beda: 我希望如此,但我無(wú)法預(yù)測(cè)未來(lái)……首先我們要認(rèn)識(shí)到,作為開(kāi)發(fā)者和工程師,我們總有一種“唯一正確的方式”的心態(tài)。所以我們看到新技術(shù)時(shí),它們很吸引人,大家都為之興奮……但實(shí)際上,隨著時(shí)間的推移,我們只會(huì)增加技術(shù)層面,而不會(huì)移除舊的東西。比如主機(jī)業(yè)務(wù)對(duì) IBM 來(lái)說(shuō)仍是一個(gè)增長(zhǎng)業(yè)務(wù)。所以虛擬機(jī)不會(huì)很快消失。

我認(rèn)為我們可以把它視為一個(gè)光譜,并為不同的場(chǎng)景提供合適的工具。沒(méi)有哪種應(yīng)用程序是完全無(wú)服務(wù)器的、容器化的或虛擬機(jī)的。你可以說(shuō),“我會(huì)用函數(shù)即服務(wù)平臺(tái)來(lái)處理大部分工作,但我有一個(gè)需要用容器的機(jī)器學(xué)習(xí)模型,此外,我可能還需要運(yùn)行一個(gè)遺留的單體架構(gòu)?!边@可以是一個(gè)應(yīng)用程序使用的多種技術(shù)組合。我覺(jué)得這就是我們更常見(jiàn)的場(chǎng)景,新技術(shù)不會(huì)完全取代舊的東西。希望 Kubernetes 能夠足夠靈活,成為下一代技術(shù)的良好起點(diǎn)。

Mat Ryer: 是的,Jon Calhoun曾告訴我,很多人會(huì)把Kubernetes的代碼庫(kù)當(dāng)作模式和示例的參考。他提到了一些編寫(xiě)代碼時(shí)需要不同思維方式的地方......顯然,這里面有很多好的示例,Jon也說(shuō)這些是被廣泛使用的。那么,關(guān)于代碼組織是否還有其他具體的地方呢?

Jon提到的其中一件事是Kubernetes必須迅速演變,你無(wú)法從一開(kāi)始就設(shè)計(jì)出一個(gè)干凈、完美的設(shè)計(jì);每個(gè)人的代碼都會(huì)自然演變,我認(rèn)為這本身就是一個(gè)很好的教訓(xùn)。那么,關(guān)于代碼結(jié)構(gòu)或者這個(gè)項(xiàng)目,或者Go開(kāi)發(fā)者從Kubernetes代碼庫(kù)中可以汲取到的東西,還有什么值得注意的嗎?

Kris Nova: 我認(rèn)為Kubernetes代碼庫(kù)在我看來(lái),可能是使用Go接口的最佳示例之一。 特別是當(dāng)你在看Go中一些不太常規(guī)的原則時(shí),比如組合(composition)和嵌入(embedding),我們?cè)谑褂肙bjectMeta時(shí)做得很好,ObjectMeta[17]嵌入在每個(gè)Kubernetes對(duì)象中。這是一個(gè)很好的例子,展示了我們?nèi)绾味x通用部分,然后將它們分享給包含其他特定部分的對(duì)象中。

所以我認(rèn)為這多少暗示了面向?qū)ο螅∣O)風(fēng)格的思維模式,但這些是Go的一級(jí)特性,而我認(rèn)為Kubernetes在巧妙利用這些特性方面做得非常出色。

Joe Beda: 我是看到了問(wèn)題......[笑聲] 我認(rèn)為Kubernetes經(jīng)歷了從一個(gè)單一代碼庫(kù)到嘗試拆分的過(guò)程......現(xiàn)在它算是半拆分狀態(tài),我甚至不想描述當(dāng)前的狀態(tài),這個(gè)拆分的過(guò)程是痛苦的。所以我認(rèn)為這里可能有一些值得汲取的教訓(xùn),比如單一代碼庫(kù)的利與弊。

不過(guò),我認(rèn)為我們做對(duì)的一件事是,我們希望Kubernetes成為一個(gè)結(jié)構(gòu)良好的分布式系統(tǒng)。所以我們并沒(méi)有一開(kāi)始就創(chuàng)建一個(gè)單一的二進(jìn)制文件,而是將不同的功能拆分成不同的二進(jìn)制文件,并讓它們通過(guò)基本上所有人都能訪問(wèn)的相同API進(jìn)行通信。

所以從結(jié)構(gòu)上看,創(chuàng)建多個(gè)可以通過(guò)網(wǎng)絡(luò)通信的二進(jìn)制文件,并堅(jiān)持沒(méi)有私有接口的原則---這是一個(gè)值得汲取的教訓(xùn)。也許這不完全是Go的事情,但當(dāng)你開(kāi)始構(gòu)建分布式系統(tǒng)時(shí),創(chuàng)建正確的機(jī)制來(lái)幫助保持架構(gòu)的整潔度是非常重要的。

Mat Ryer: 我猜,你們也是在不斷自我驗(yàn)證的過(guò)程中?

Kris Nova: 是的,完全正確。我們完全是在使用自己的客戶端。如果你查看Go中的官方客戶端,看看人們?nèi)绾螛?gòu)建與Kubernetes交互的Go程序,它實(shí)際上就是我們?cè)贙ubernetes內(nèi)部使用的相同的源代碼。所以我們實(shí)際上是在運(yùn)行我們建議大家用來(lái)解決自己?jiǎn)栴}的代碼......我認(rèn)為這是一個(gè)非常好的模式。

Mat Ryer: 是的,我同意這個(gè)觀點(diǎn)。即便是它被頻繁使用的事實(shí),你也能發(fā)現(xiàn)其中的任何問(wèn)題......但是我們?cè)贛achine Box也注意到了一些其他有趣的副作用,Machine Box也是類似的情況---我們使用SDK,我們有一個(gè)用于Machine Box API的Go SDK,并在我們的集成測(cè)試中使用它。所以我們盡可能多地將測(cè)試整合到一起,以同時(shí)測(cè)試盡可能多的內(nèi)容。但它確實(shí)提供了一定的穩(wěn)定性,這真的很有趣。

Johnny Boursiquot: John在頻道里問(wèn)到,Kubernetes作為一個(gè)開(kāi)源項(xiàng)目,是否迫使你們?cè)诖a結(jié)構(gòu)、組織方式和包管理上走上一條特定的道路......如果這是一個(gè)私有代碼庫(kù)或私有項(xiàng)目,你們會(huì)做得不同嗎?

Joe Beda: 從代碼結(jié)構(gòu)上講,我不認(rèn)為我們會(huì)有很大的不同。我確實(shí)認(rèn)為,社區(qū)的擴(kuò)展和代碼是共同演變的,這是一個(gè)有趣的現(xiàn)象。隨著項(xiàng)目的增長(zhǎng),我們需要有方法來(lái)管理誰(shuí)負(fù)責(zé)、誰(shuí)決定功能、如何推動(dòng)項(xiàng)目前進(jìn)......我認(rèn)為Kubernetes現(xiàn)在所使用的是我們稱之為開(kāi)放治理的模式,基本上是由一群公開(kāi)的人員決定項(xiàng)目的未來(lái),而不是由某個(gè)公司控制。我認(rèn)為在代碼結(jié)構(gòu)的某些地方,我們確實(shí)看到了這種演變。

Kubernetes的可擴(kuò)展性機(jī)制確實(shí)適合這種開(kāi)源的“讓事情變得廣泛”的模式......如果沒(méi)有開(kāi)源的角度,我們可能不會(huì)在可擴(kuò)展性上投入這么多。

我覺(jué)得我們幾乎“打破”了GitHub項(xiàng)目的規(guī)模和工作流......Kubernetes社區(qū)開(kāi)發(fā)了一個(gè)叫Prow的系統(tǒng),基本上是GitHub的自動(dòng)化工具。幾乎沒(méi)有人真正擁有Kubernetes GitHub組織的管理員權(quán)限。相反,一切都是通過(guò)/test、/approve或/lgtm命令來(lái)完成的,然后Prow機(jī)器人會(huì)處理這些內(nèi)容。所以我們能夠在此基礎(chǔ)上構(gòu)建一個(gè)更豐富的所有權(quán)模型和權(quán)限模型。這些東西都是用Go編寫(xiě)的。但這不是代碼本身的問(wèn)題,而是社區(qū)和代碼處理流程的一部分。

Kris Nova: 關(guān)于Kubernetes的快速迭代速度,有很多值得一提的地方。我們已經(jīng)提到過(guò)幾次,作為一個(gè)開(kāi)源項(xiàng)目,它的進(jìn)展非常迅速,我認(rèn)為這可以從Kubernetes K/K代碼庫(kù)中反映出來(lái),看看我們?cè)谄渲杏卸嗌俣M(jìn)制文件,以及我們引入了多少依賴項(xiàng)。雖然我不想在Go Time節(jié)目中提起依賴管理問(wèn)題......但我認(rèn)為它發(fā)展得很快,因此我們看到了代碼庫(kù)呈現(xiàn)出一種獨(dú)特的形態(tài),這在其他情況下可能不會(huì)出現(xiàn)。

Johnny Boursiquot: 說(shuō)到治理和公司對(duì)項(xiàng)目的影響,每當(dāng)一個(gè)流行的開(kāi)源項(xiàng)目---或者說(shuō)支持這些項(xiàng)目的組織---被收購(gòu)時(shí),總會(huì)有一種膝跳反應(yīng)式的擔(dān)憂,人們會(huì)想,“哦,看來(lái)我們的項(xiàng)目完了?,F(xiàn)在我們將開(kāi)始看到對(duì)某一家公司有利的東西,而對(duì)其他公司不利?!睆耐饨鐏?lái)看,Kubernetes似乎沒(méi)有受到Heptio被VMware收購(gòu)的影響......但我也很好奇,從你的角度來(lái)看,自從收購(gòu)以來(lái),有沒(méi)有哪些優(yōu)勢(shì)對(duì)Kubernetes有益?

Joe Beda: 我首先要說(shuō)的是,Heptio確實(shí)為Kubernetes做出了貢獻(xiàn),但我們并不是最大的貢獻(xiàn)者。我認(rèn)為我們可能在公司規(guī)模上做得超出預(yù)期,但我們參與的池子非常大。

我認(rèn)為我的聯(lián)合創(chuàng)始人在Google時(shí)做得很好的一件事就是啟動(dòng)了云原生計(jì)算基金會(huì)(CNCF),并把大家聚集在一起。我的聯(lián)合創(chuàng)始人Craig McLuckie是Heptio的共同創(chuàng)始人。這最終成為了一個(gè)中立的廠商平臺(tái),用來(lái)托管Kubernetes。CNCF和Linux基金會(huì)有它們的優(yōu)缺點(diǎn)......這是另一個(gè)可以在喝酒時(shí)討論的話題。但總的來(lái)說(shuō),讓這個(gè)項(xiàng)目不被任何一個(gè)公司擁有,是項(xiàng)目成功的關(guān)鍵之一,也讓它能夠繼續(xù)發(fā)展,無(wú)論是Heptio還是其他任何公司。

至于Heptio加入VMware的事情,我認(rèn)為我們能夠激活VMware內(nèi)部的很多人,帶更多的人進(jìn)入社區(qū),真正開(kāi)始彌補(bǔ)我們通過(guò)客戶視角看到的一些空白。我們確實(shí)非常注重確保我們?yōu)轫?xiàng)目投入的比從中獲取的更多。

Kris Nova: 回到之前關(guān)于治理的討論,我認(rèn)為Kubernetes是第一個(gè)成功完成CNCF畢業(yè)流程的項(xiàng)目,設(shè)定了基調(diào)和參考架構(gòu)。如果你看像Joe提到的Prow工具,它現(xiàn)在已經(jīng)是一個(gè)開(kāi)源工具,你可以引入它進(jìn)行使用。你會(huì)看到CNCF生態(tài)系統(tǒng)中很多項(xiàng)目都在使用它。我們?cè)诒镜氐腇alco項(xiàng)目中也在使用它,我知道還有很多其他項(xiàng)目也在使用它。同樣,我們要感謝Kubernetes,因?yàn)樗堑谝粋€(gè)通過(guò)CNCF畢業(yè)流程的項(xiàng)目,設(shè)定了很多后續(xù)流程的標(biāo)準(zhǔn)。

Johnny Boursiquot: 非常酷。隨著時(shí)間的推移,我很好奇接下來(lái)Kubernetes的重大步驟或改進(jìn)是什么?你們認(rèn)為代碼庫(kù)會(huì)變得更加穩(wěn)定,還是還有很多大塊的功能需要完成,以使平臺(tái)更加完善?

Kris Nova: 我有個(gè)答案,當(dāng)然我有些偏見(jiàn)。如果你看看我們作為社區(qū)已經(jīng)解決的問(wèn)題---我們已經(jīng)解決了存儲(chǔ)問(wèn)題,并迭代了幾次;我們也完成了網(wǎng)絡(luò)問(wèn)題,完成了計(jì)算問(wèn)題,甚至包括我們?nèi)绾味x應(yīng)用程序以及如何管理狀態(tài)的方式都已經(jīng)有了進(jìn)展......但如果你看看安全問(wèn)題,目前還沒(méi)有一個(gè)好的解決方案。我認(rèn)為這是Kubernetes需要解決的最后一個(gè)領(lǐng)域。

關(guān)于在Kubernetes中運(yùn)行應(yīng)用程序并保持其安全,甚至是保持整個(gè)Kubernetes集群的安全,有很多已知的問(wèn)題。所以在我看來(lái),這是在生態(tài)系統(tǒng)中存在的一個(gè)比較大的問(wèn)題,正如Joe之前提到的那樣。

Joe Beda: 需要澄清的是,這些問(wèn)題是可以解決的。我認(rèn)為只是目前還不夠簡(jiǎn)單或直觀,或者說(shuō)沒(méi)有達(dá)到一鍵式的便捷程度。我認(rèn)為在安全性方面,隨著時(shí)間的推移,Kubernetes將成為安全最佳實(shí)踐的標(biāo)桿,因?yàn)槟隳塬@得大量關(guān)于運(yùn)行程序、它們?nèi)绾芜\(yùn)行、是誰(shuí)決定運(yùn)行這些程序、誰(shuí)采取了哪些操作的數(shù)據(jù)。這些數(shù)據(jù)在傳統(tǒng)的DevOps環(huán)境中往往是看不到的。但我認(rèn)為我們看到了這種潛力;不過(guò)我們還沒(méi)有完全實(shí)現(xiàn)這一點(diǎn)。所以我完全同意Kris的看法。

我們?cè)贙ubernetes核心項(xiàng)目中經(jīng)常談?wù)摰囊患虑槭牵孠ubernetes變得“無(wú)趣”。好的基礎(chǔ)設(shè)施應(yīng)該是無(wú)趣的。我記得Brad Fitzpatrick曾經(jīng)在談?wù)撃硞€(gè)Go的版本發(fā)布時(shí)說(shuō),“這個(gè)Go版本沒(méi)有什么特別的地方,這其實(shí)是一件好事。”Go從那時(shí)起變得更有趣了,但曾經(jīng)有一個(gè)時(shí)期,Go本身非常穩(wěn)定,以至于發(fā)布說(shuō)明只是“我們改進(jìn)了垃圾回收器,并提高了性能,但從用戶的角度來(lái)看,幾乎沒(méi)有什么變化?!?/p>

我們也希望Kubernetes能夠到達(dá)這個(gè)階段,核心部分非常無(wú)趣,所有有趣的事情都發(fā)生在核心之外。我認(rèn)為我們正在朝這個(gè)方向前進(jìn)。所以我覺(jué)得這對(duì)我們來(lái)說(shuō)是一個(gè)好地方,能夠讓生態(tài)系統(tǒng)中的事情變得更有趣,而不是核心項(xiàng)目本身。

Kris Nova:  我第一次聽(tīng)到有人用“無(wú)趣”來(lái)形容軟件的時(shí)候,好像是Rob Pike在Go剛推出時(shí)的某個(gè)早期演講中提到的。

Mat Ryer: 是的。我有個(gè)快速問(wèn)題,如果我寫(xiě)k8s……

Joe Beda: 哈哈哈!

Mat Ryer: ……我是讓自己難堪了嗎?這是“潮”還是“不潮”啊?我不確定,這還流行嗎,還是……

Joe Beda: 還流行啊。

Mat Ryer: 還流行啊。

Joe Beda: 對(duì)于那些不清楚的人來(lái)說(shuō)---這就像我們寫(xiě)國(guó)際化或本地化一樣,i...

Johnny Boursiquot: i18n...

Joe Beda: i18n,類似的東西?;蛘逜ndreessen Horowitz的a16z……[笑聲] 這是同樣的邏輯,k和s之間有8個(gè)字母。但我們還有一個(gè)優(yōu)勢(shì),那就是你可以把它叫做“kates”。因此很多人在讀它時(shí),不叫Kube或Kubernetes,而是叫kates。我不知道是誰(shuí)開(kāi)始這么叫的......這既酷,因?yàn)樗且粋€(gè)簡(jiǎn)寫(xiě),但它也增加了Kubernetes世界的新手學(xué)習(xí)的難度,因?yàn)橛侄嗔艘粋€(gè)術(shù)語(yǔ)。人們會(huì)想,“好吧,我知道Kubernetes,但我看到k8s......這到底是怎么回事???!”

Mat Ryer: 是的。

Kris Nova: 我喜歡它的原因是,它讓我在Twitter上談?wù)揔ubernetes時(shí)可以最少化字符數(shù)。

Johnny Boursiquot: 這確實(shí)有幫助。說(shuō)到更多術(shù)語(yǔ)......是“kube cuttle”,還是“kube control”?[笑聲]

Joe Beda: “Queue Beck tall”!

Johnny Boursiquot: [笑聲]

Joe Beda: 這就像是I/O控制,你是說(shuō)“I/O控制”還是“eye octal”(ioctl)?我們經(jīng)常在這些發(fā)音上爭(zhēng)論不休。我們?cè)贖eptio有一位員工,現(xiàn)在在VMware---她堅(jiān)持把Kubernetes錯(cuò)誤發(fā)音成Kapernikes(Copernicus) [笑聲] 這成了我們團(tuán)隊(duì)的一個(gè)游戲,看看誰(shuí)能找到最糟糕的發(fā)音。

Johnny Boursiquot: 太棒了。

Mat Ryer: 最后一個(gè)問(wèn)題,Nova......K/K代碼庫(kù)有85,000多個(gè)提交記錄。你最喜歡哪個(gè)?可以直接給個(gè)簡(jiǎn)短的哈希值。

Kris Nova: 我最喜歡的提交記錄......讓我們稱之為Joe的提交吧。Joe是第一個(gè)在開(kāi)源代碼庫(kù)中提交代碼的人,如果沒(méi)有他的提交,我想我們現(xiàn)在都不會(huì)在這里。

Mat Ryer: 這是個(gè)好答案。

Johnny Boursiquot: 答案揭曉。

Joe Beda: 我必須反駁一下......在我們把代碼庫(kù)移到GitHub之前,我們其實(shí)有一個(gè)內(nèi)部代碼庫(kù)。我只是做了一些清理工作,準(zhǔn)備發(fā)布代碼......[笑聲] 所以我不能說(shuō)那都是我寫(xiě)的代碼。我只是負(fù)責(zé)在我們準(zhǔn)備發(fā)布時(shí)整理了代碼。

Mat Ryer: 我認(rèn)為GitHub的歷史不會(huì)騙人,它在法庭上也是可以接受的證據(jù)。

Johnny Boursiquot: [笑聲] 你知道你可以修改那個(gè)歷史記錄,對(duì)吧?我只是說(shuō)一下。

Mat Ryer: 真的可以嗎?

Johnny Boursiquot: [笑聲] 好吧。我覺(jué)得這是我參與過(guò)的最有趣的一期節(jié)目之一,因?yàn)槲覍?duì)基礎(chǔ)設(shè)施充滿了熱情,作為一個(gè)SRE,知道無(wú)趣的技術(shù)才是我們想要的讓我感到安心......因?yàn)楫?dāng)我值班時(shí),我不希望有有趣的事情發(fā)生,所以......[笑聲] 知道項(xiàng)目的方向真是太棒了,今天能有你們來(lái)節(jié)目真是太好了。

Joe,你經(jīng)常主持TGI Kubernetes直播,我們經(jīng)??茨闩紶栍龅近c(diǎn)小麻煩,但大多數(shù)時(shí)候你都能順利完成任務(wù),還有社區(qū)的幫助......

Joe Beda: 是的,我想我們已經(jīng)做了90多期了。我們每周五都會(huì)直播......Nova在她還在Heptio工作時(shí)也主持了很多期。我知道她現(xiàn)在也在計(jì)劃在Twitch上做一些自己的直播。

Johnny Boursiquot: 嗯,期待你的直播,Nova。

Kris Nova: 是的,我們已經(jīng)做了第一次直播,正在努力完善。我想我們會(huì)更多地聚焦于Kubernetes和其他容器編排,拓寬一些話題范圍......當(dāng)然,我們是一家安全公司,所以肯定會(huì)有很多安全相關(guān)的討論。

Mat Ryer: 太好了,我們也很期待觀看......

Kris Nova: 是的,我想“觀看”是個(gè)合適的詞。

Mat Ryer: 謝謝你。 [笑聲] 我只是確認(rèn)一下。

Johnny Boursiquot: 等待確認(rèn)......[笑聲]

Joe Beda: 有趣的是,YouTube/Twitch的直播和播客有著不同的感覺(jué),我認(rèn)為它們的消費(fèi)方式也不一樣......所以看到不同的媒介找到自己的方式很有趣。

Kris Nova: 是的,當(dāng)你開(kāi)始直播時(shí),總有那么一瞬間,你會(huì)意識(shí)到自己已經(jīng)在一個(gè)小房間里,一個(gè)人對(duì)著空氣說(shuō)了30分鐘......[笑聲] 很容易陷入這種自說(shuō)自話的狀態(tài)。

Johnny Boursiquot: 太棒了。非常感謝你們來(lái)參加我們的節(jié)目,感謝所有現(xiàn)場(chǎng)收聽(tīng)的聽(tīng)眾,感謝你們?cè)陬l道里提問(wèn)。如果你們之后再聽(tīng)到這期節(jié)目,希望你們也會(huì)喜歡。

Reference

[1] Kubernetes and Cloud Native: https://changelog.com/gotime/105

[2] Johnny: https://github.com/jboursiquot

[3] Mat: https://github.com/matryer

[4] Kris Nova: https://github.com/krisnova

[5] Joe Beda: https://github.com/jbeda

[6] SpringOne: https://springone.io/

[7] Cluster API 項(xiàng)目: https://github.com/kubernetes-sigs/cluster-api

[8] Kubeadm 工具: https://github.com/kubernetes/kubeadm

[9] Kops: https://github.com/kubernetes/kops

[10] Kubicorn: https://github.com/kubicorn/kubicorn

[11] 《Programming Kubernetes》: https://book.douban.com/subject/33393681/

[12] operator framework: https://github.com/operator-framework

[13] Kubebuilder: https://github.com/kubernetes-sigs/kubebuilder

[14] 曾經(jīng) Mesos 背后的公司,如今在干嘛?: https://2d2d.io/s1/mesos/

[15] 《You Can't Have a Cluster [BLEEP] Without a Cluster》: https://www.youtube.com/watch?v=CLVIbCs2VJY

[16] virtual-kubelet 項(xiàng)目: https://github.com/virtual-kubelet/virtual-kubelet

[17] ObjectMeta: https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/common-definitions/object-meta/

責(zé)任編輯:武曉燕 來(lái)源: 旅途散記
相關(guān)推薦

2023-03-06 07:19:50

2021-04-25 10:26:58

云計(jì)算云原生

2022-04-07 10:17:18

云原生服務(wù)器優(yōu)化

2023-03-03 07:54:21

2025-01-03 08:08:56

2022-11-08 08:55:31

2023-03-07 07:56:37

Sqoopk8s底層

2024-06-12 13:21:06

2022-10-14 07:42:50

LuceneHTTPWeb

2021-08-13 07:00:41

云原生k8sspringboot

2021-08-26 07:20:05

云原生K8sSpringboot

2022-11-06 21:31:11

云原生Sentinel集群模式

2022-07-18 18:48:32

Kubernetes云原生

2023-02-08 07:55:33

K8sHPA服務(wù)器

2024-06-06 09:19:09

2023-03-01 07:42:12

HBase編排部署數(shù)據(jù)

2024-06-21 09:28:05

2024-06-18 13:22:42

Nginx云原生Kubernetes

2023-02-01 07:46:51

k8s云原生巧妙用法

2021-06-04 06:01:49

Yarn workspTypeScript云原生
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)