作者 | afotostock、Shutterstock
編輯 | 言征
出品 | 51CTO技術(shù)棧(微信號(hào):blog51cto)
6 月 6 日是Kubernetes發(fā)布 10 周年紀(jì)念日。
值得回想一下 2014 年,當(dāng)時(shí) Kubernetes 是當(dāng)時(shí)推出的眾多管理容器的方法之一。當(dāng)時(shí)已經(jīng)存在像 Apache Mesos 這樣的大型開源項(xiàng)目,而啟動(dòng)容器化的公司Docker則通過其 Docker Swarm 提供了一個(gè)很好的選擇。各家公司也在研究像 AWS ECS 管理工具這樣的方法,以及如何將它們用于特定的容器管理。
那么,為什么 Kubernetes 會(huì)勝出呢?我們最終會(huì)選擇 Kubernetes 作為云原生應(yīng)用的平臺(tái)嗎?還是說這其中存在一些障礙?
1.從無狀態(tài)到有狀態(tài)的工作負(fù)載
大家起初認(rèn)識(shí)Kubernetes時(shí),是作為一個(gè)容器管理和編排平臺(tái),它可以更輕松地管理微服務(wù)應(yīng)用程序中的所有軟件容器。Kubernetes 基于Google 的內(nèi)部容器管理服務(wù)Borg,該服務(wù)可處理數(shù)千個(gè)實(shí)例,最終以開源形式發(fā)布,供其他人利用來運(yùn)行容器。
首先,必須指出的是,Kubernetes 起步并不顯眼。雖然一開始它被寄希望基于 Google 用于管理大量工作負(fù)載和流程的工具,但它事實(shí)上并沒有準(zhǔn)備好在其他組織中承擔(dān)這一角色。它非常適合管理無狀態(tài)應(yīng)用程序容器,并協(xié)調(diào)如何創(chuàng)建、使用以及在不再需要時(shí)拆除這些容器。但它一開始只專注于應(yīng)用程序組件。
這與構(gòu)成應(yīng)用程序基礎(chǔ)架構(gòu)的所有其他元素并不相符。雖然您的應(yīng)用程序可能在云中運(yùn)行并執(zhí)行處理,但它也會(huì)創(chuàng)建必須隨時(shí)間存儲(chǔ)的數(shù)據(jù)。它必須與現(xiàn)有的數(shù)據(jù)源進(jìn)行交互。它必須安全地運(yùn)行,這樣信息就不會(huì)泄露,攻擊者也無法訪問這些組件。這些元素在 Kubernetes 的初始發(fā)布中不受支持。事實(shí)上,在考慮這些工作負(fù)載之前,又花了兩年時(shí)間才獲得StatefulSets支持和 Kubernetes Operators 的發(fā)布。
圖片
StatefulSets 提供了對(duì)穩(wěn)定且唯一的網(wǎng)絡(luò)標(biāo)識(shí)符以及穩(wěn)定且持久的存儲(chǔ)的支持。它還可以執(zhí)行更有序、更優(yōu)雅的部署和擴(kuò)展,以及更有序、更自動(dòng)化的滾動(dòng)更新。除此之外,Kubernetes Operators 的推出還允許開發(fā)人員隱藏將 Kubernetes 原語與其他應(yīng)用程序一起使用的復(fù)雜性。如果沒有這兩項(xiàng)附加功能,在 Kubernetes 中運(yùn)行有狀態(tài)工作負(fù)載需要進(jìn)行一些嚴(yán)肅的 Kubernetes 核心黑客攻擊才能使其正常工作。
除此之外,社區(qū)也在努力讓有狀態(tài)工作負(fù)載在 Kubernetes 上有效運(yùn)行。雖然圍繞運(yùn)行 MySQL 和 PostgreSQL 等數(shù)據(jù)庫的討論始于 Reddit 和 Stack Overflow,但需要更正式的合作才能將其從好主意轉(zhuǎn)變?yōu)檎鎸?shí)且可持續(xù)的項(xiàng)目。像Kubernetes 上的數(shù)據(jù)社區(qū)這樣的組織齊心協(xié)力為這種合作提供了正確的框架,使公司和個(gè)人更容易做出貢獻(xiàn)。
圖片
這項(xiàng)工作至關(guān)重要,因?yàn)橐婚_始在 Kubernetes 上運(yùn)行數(shù)據(jù)庫時(shí)有很多阻力。對(duì)于熟悉設(shè)計(jì)應(yīng)用程序的12 個(gè)因素方法的人來說,后端服務(wù)應(yīng)被視為附加資源。當(dāng)時(shí),這對(duì)于想要在容器中運(yùn)行但又必須管理與托管在不同環(huán)境中的數(shù)據(jù)庫或存儲(chǔ)系統(tǒng)的交互的開發(fā)人員來說是個(gè)問題。理想的方法(也是我們現(xiàn)在擁有的)是數(shù)據(jù)庫應(yīng)該以與應(yīng)用程序組件完全相同的方式在集群中運(yùn)行,因?yàn)檫@使得從一個(gè)點(diǎn)控制和管理整個(gè)服務(wù)的基礎(chǔ)架構(gòu)變得更加容易。
2.開源的作用
Kubernetes 成功的主要原因之一是它是開源的。Kubernetes 被捐贈(zèng)給云原生計(jì)算基金會(huì),以便它能夠得到更廣泛的組織而不是一家控制供應(yīng)商的支持。這有助于分散貢獻(xiàn)方面的負(fù)擔(dān)并提高接受度。當(dāng)用戶考慮如何在云計(jì)算平臺(tái)上下注時(shí),選擇一個(gè)不依賴于特定云提供商并且可以在其中任何一個(gè)上獨(dú)立運(yùn)行容器的平臺(tái)被視為更明智的選擇。
圖片
這需要一個(gè)愿意支持 Kubernetes 項(xiàng)目的社區(qū),并且他們必須為它的成功而投資。為了建立這個(gè)社區(qū),Kubernetes 必須是開源的,正如 Kubernetes 聯(lián)合創(chuàng)始人 Brendan Burns在 Dev Interrupted播客中解釋的那樣。如果不開源,開發(fā)人員貢獻(xiàn)或選擇 Kubernetes 作為容器管理工具的動(dòng)力就會(huì)小得多。
隨著時(shí)間的推移,Kubernetes 已從眾多容器編排工具之一發(fā)展成為云原生應(yīng)用程序的平臺(tái)。它使開發(fā)人員能夠在任何云平臺(tái)或自己的數(shù)據(jù)中心環(huán)境中構(gòu)建和運(yùn)行他們的應(yīng)用程序,然后將該工作負(fù)載轉(zhuǎn)移到他們未來想要使用的任何平臺(tái)上。作為其中的一部分,Kubernetes 已從專注于應(yīng)用程序組件發(fā)展到支持云中的所有內(nèi)容。
Kubernetes 并不完美。例如,Kubernetes 仍需要在自動(dòng)擴(kuò)展和管理數(shù)據(jù)和存儲(chǔ)等資源方面做更多工作,以便公司能夠更有效地控制成本。但這項(xiàng)工作正在多家公司和社區(qū)的支持下進(jìn)行,因此未來每個(gè)人都可以受益。