kubernetes的架構(gòu)非常適合大規(guī)模的組織,但是對于中小組織來說,它可能會過于復(fù)雜。
作為開源容器編排器,kubernetes已經(jīng)成為組織部署容器化應(yīng)用程序的實際解決方案。這其中有一些充分的理由,其中包括kubernetes提供高度的可靠性、自動化、可擴展性的事實。盡管如此,有此行業(yè)人士還是認為kubernetes架構(gòu)過于復(fù)雜。雖然已經(jīng)有6年以上的應(yīng)用歷史,但它還是有許多缺點。其中一些缺點是kubernetes本身所固有的,而另一些缺點則是圍繞該平臺成長起來的生態(tài)系統(tǒng)的產(chǎn)物。
在部署kubernetes之前,企業(yè)需要考慮以下開源容器編排器的一些問題。
1. kubernetes是為大規(guī)模的公司設(shè)計的
首先,kubernetes架構(gòu)始終是為需要管理超大規(guī)模應(yīng)用程序環(huán)境的組織而構(gòu)建的。對于谷歌公司來說(borg編排者構(gòu)成了成為開源kubernetes項目的基礎(chǔ)),kubernetes是一個很好的工具。而對于擁有數(shù)十個數(shù)據(jù)中心以及數(shù)千個分布在其中的應(yīng)用程序和服務(wù)的netflix、facebook、aws等其他大規(guī)模的公司來說,也是如此。
但是如果是一個規(guī)模較小的組織,并且只有一個可能只部署十幾個應(yīng)用程序的數(shù)據(jù)中心,那么kubernetes架構(gòu)無疑規(guī)模過于龐大,這可能就像駕駛推土機為后院花園翻土一樣大材小用。除非是大規(guī)模使用,否則配置和管理它需要解決大量的問題。
2. kubernetes有很多發(fā)行版
kubernetes架構(gòu)的另一個問題是,kubernetes有很多發(fā)行版,以及大量與其相關(guān)的不同的工具、理念和觀點。
當(dāng)然,在某種程度上,任何開源生態(tài)系統(tǒng)中都會發(fā)生分裂。例如,redhat linux與ubuntu linux具有不同的軟件包管理器、管理工具等。但是,redhat和ubuntu的相似之處遠大于區(qū)別。對于使用red hat系統(tǒng)的管理員來說,如果要遷移到ubuntu,則不需要花費六個月的時間自學(xué)新工具。
行業(yè)專家并不認為kubernetes也是如此。如果現(xiàn)在正在使用openshift,但又想切換到vmware tanzu,則其學(xué)習(xí)過程將非常艱巨。盡管這兩個kubernetes發(fā)行版都使用相同的基礎(chǔ)平臺kubernetes,但是它們添加的方法和工具卻截然不同。
基于云計算的kubernetes服務(wù)也有類似的分裂。google kubernetes engine(gke)與amazon eks(相當(dāng)于aws云)等平臺相比,具有截然不同的用戶體驗和管理工具套件。
當(dāng)然,這并不是kubernetes架構(gòu)本身的錯,而是不同供應(yīng)商嘗試使其kubernetes產(chǎn)品實現(xiàn)差異化的結(jié)果。但是從kubernetes用戶的角度來看,這仍然是一個現(xiàn)實問題。
3. kubernetes是多個部分組成的平臺
人們將kubernetes當(dāng)作一個平臺,但實際上它由6個以上的不同組件組成。這意味著當(dāng)安裝或更新kubernetes時,必須分別處理每個組件。而且大多數(shù)kubernetes發(fā)行版都缺乏執(zhí)行這些操作的自動化解決方案。
當(dāng)然,kubernetes是一個復(fù)雜的平臺,它需要多個部分組合才能工作。但是與其他復(fù)雜平臺相比,kubernetes在將其各個部分集成到一個易于管理的整體方面做得特別糟糕。典型linux發(fā)行版也包含許多不同的軟件。但是用戶能夠以集中、簡化的方式安裝和管理它們。kubernetes架構(gòu)并非如此。
4. kubernetes不會自動地保證高可用性
使用kubernetes的最常被提及的原因之一是,它以一種神奇的方式管理應(yīng)用程序,保證它們永遠不會失敗,即使部分基礎(chǔ)設(shè)施出現(xiàn)故障。
確實,kubernetes架構(gòu)可以做出明智的自動決策,以決定將工作負載放置在集群中的位置。但是,kubernetes并不是實現(xiàn)高可用性的靈丹妙藥。例如,它將在只有一個主節(jié)點的生產(chǎn)環(huán)境中運行,這是關(guān)閉整個集群的方法(如果主要服務(wù)器出現(xiàn)故障,則整個集群將基本上停止運行)。
kubernetes也不能自動保證在集群中運行的不同工作負載之間正確分配資源。要進行設(shè)置,用戶需要人工設(shè)置資源配額。
5.很難人工控制kubernetes
盡管kubernetes需要大量的人工干預(yù)才能提供高可用性,但是如果確實要這樣做,它會使人工控制變得相當(dāng)困難。
可以肯定的是,有一些方法可以修改kubernetes執(zhí)行的探測時間,以確定容器是否正常運行,或者強制工作負載在集群中的特定服務(wù)器上運行。但是,kubernetes架構(gòu)的設(shè)計并不期望管理員會進行這些人工更改。
如上所述,kubernetes首先是針對web規(guī)模的部署,這是有道理的。如果用戶有數(shù)千臺服務(wù)器和數(shù)百個工作負載,將不會人工配置許多東西。但是如果是一家規(guī)模較小的公司,并且想要更好地控制集群中工作負載的結(jié)構(gòu)方式,那么采用kubernetes很難做到這一點。
6. kubernetes監(jiān)視和性能優(yōu)化面臨挑戰(zhàn)
kubernetes試圖在保持工作負載正常運行方面做得很好(盡管如上所述,其能力取決于諸如用戶設(shè)置的管理者數(shù)量以及如何組織資源分配等因素)。
但是kubernetes架構(gòu)并不能幫助用戶監(jiān)視工作負載或確保它們表現(xiàn)最佳。它不會在出現(xiàn)問題時向用戶發(fā)出警報,而且從集群中收集監(jiān)視數(shù)據(jù)也不太容易。kubernetes發(fā)行版隨附的大多數(shù)監(jiān)視儀表板也無法提供對環(huán)境的深入可見性。采用第三方工具可以使用戶獲得可見性,但是如果要運行kubernetes,則必須設(shè)置、學(xué)習(xí)和管理這些工具。
同樣,kubernetes也不擅長幫助用戶優(yōu)化成本。它不會通知用戶集群中的服務(wù)器是否僅以20%%u7684容量使用,這可能意味著用戶在過度配置的基礎(chǔ)設(shè)施方面浪費了資金。同樣,第三方工具可以幫助用戶應(yīng)對諸如此類的挑戰(zhàn),但它們會增加復(fù)雜性。
7. kubernetes將所有內(nèi)容簡化為代碼
在kubernetes中,完成幾乎所有任務(wù)都需要用戶編寫代碼。通常情況下,其代碼采用yaml文件的形式,然后必須在kubernetes命令行上應(yīng)用它們。
許多人會把kubernetes架構(gòu)的所有代碼要求作為功能而不是錯誤。然而,雖然使用單一方法和工具(即yaml文件)可以管理整個平臺,但確實希望kubernetes能為需要它們的人提供其他選擇。
有時候,用戶不想編寫一個很長的yaml文件(或從github中提取一個文件,然后人工調(diào)整其中的隨機部分以適合其環(huán)境)來部署簡單的工作負載。用戶希望按下一個按鈕或運行一個簡單的命令(這指的是不需要十幾個參數(shù)的kubectl命令,其中許多參數(shù)都配置有必須復(fù)制和粘貼的數(shù)據(jù)串)。需要在kubernetes中做一些簡單的事情。但是這種情況很少發(fā)生。
8. kubernetes希望控制一切
kubernetes的最后一個問題是,它的設(shè)計并不能很好地與其他類型的系統(tǒng)配合。它希望成為用戶用來部署和管理應(yīng)用程序的唯一平臺。
如果用戶的所有工作負載都是容器化的,并且可以由kubernetes進行協(xié)調(diào),這是一個很好的結(jié)果。但是,如果用戶擁有無法作為容器運行的原有應(yīng)用程序怎么辦?或者,如果想在kubernetes集群上運行一部分工作負載,而又有一部分在外部運行呢?kubernetes不提供執(zhí)行這些操作的原生功能。其設(shè)計的前提是希望一直在容器中運行所有內(nèi)容。
結(jié)論
kubernetes其實是編排大型容器化應(yīng)用程序的強大工具。 kubernetes有很多適合的用例。
但是kubernetes架構(gòu)也有一些缺點??傮w而言,如果用戶要管理原有的工作負載或部署規(guī)模不足以證明kubernetes帶來的所有復(fù)雜性,那么就不是一個很好的解決方案。為了證明它的全部價值,kubernetes應(yīng)該解決這些問題,以便它可以完全匹配其在it生態(tài)系統(tǒng)某些領(lǐng)域中享有的聲譽。