第二,容器啟動速度問題。申請容器時可以開一個相對比較大的KVM,第一個容器啟動會有KVM啟動時間,第二個容器啟動就沒有KVM啟動時間,你就會立刻體會到容器的好處。
第三,容器的規(guī)模問題。大家都開始使用公有云之后,容器規(guī)模會迅速擴大,也會導致整個Kubernetes集群迅速擴大,從千節(jié)點現(xiàn)在已經(jīng)到了15000節(jié)點。
第四,容器的租戶隔離問題。除了CPU、MEMORY的隔離,網(wǎng)絡隔離、存儲隔離也是一個問題。
網(wǎng)易蜂巢平臺及優(yōu)化
這是基于OpenStack上PaaS平臺再往上的容器和編排的平臺。在容器這一層我們提供了自己的鏡像倉庫,因為在國外訪問,由于防火墻的問題實在是太慢了,當然本地需要做一個cache,鏡像取下來的時間幾乎可以忽略不計。微服務場景下,必須要有日志服務,把一個東西拆成了很多個東西以后如果出現(xiàn)了問題,日志挨個看太多,所以日志服務采取類似ELK的方式,把日志收集起來,提供統(tǒng)一的搜索引擎,這樣做之后交易的整個過程,哪個環(huán)節(jié)出了問題都一目了然。再往上就是編排,除了Kubernetes本身帶的彈性伸縮和服務發(fā)現(xiàn)能力之外,我們做了有狀態(tài)容器,彌補了從傳統(tǒng)的虛擬機到最現(xiàn)代化的容器中間的過渡階段。還有調(diào)度優(yōu)化,為什么要做調(diào)度優(yōu)化?當集群規(guī)模特別大的時候,原來Kubernetes自己的調(diào)度機制已經(jīng)不能滿足這么多節(jié)點的調(diào)度性能。作為一個分布式系統(tǒng)最核心的就是調(diào)度系統(tǒng),這就是為什么很多大型的分布式系統(tǒng)最后都是在修改調(diào)度系統(tǒng),比如OpenStack會把原來的調(diào)度系統(tǒng)分成很多的子服務,也是在做調(diào)度方面的優(yōu)化。我們的多租戶是全方位的多租戶,不光是普通的隔離。
Kubernetes是有多租戶的想法和機制的,比如有Namespace,但沒有辦法隔離節(jié)點、網(wǎng)絡,網(wǎng)絡和存儲其實還是需要我們通過自己的機制來進行隔離的。節(jié)點的隔離是不同租戶是不會共享節(jié)點的,這時候需要有一個LABEL做控制。網(wǎng)絡隔離是利用IaaS層的能力進行網(wǎng)絡間的隔離,不同租戶會有自己的VXLAN ID。調(diào)度性能優(yōu)化,Kubernetes本身是串型隊列優(yōu)化,如果都是這個方式,當集群大的時候任務隊列會特別多,會有很多人上來提交任務,這個時候一個隊列并不能解決問題,我們就改為了多個優(yōu)先級隊列解決問題,這樣就可以多線程的處理。集群擴展性,Kubernetes會把數(shù)據(jù)放到ETCD里,Agent節(jié)點會到里面發(fā)現(xiàn)自己需要做哪些事情。我們后來發(fā)現(xiàn)集群規(guī)模大了以后,單獨的一個ETCD集群不能放下這么多數(shù)據(jù)量,根據(jù)Pod、Node等資源,當一個用戶有一個操作時,我們知道這是屬于哪個用戶,進行負載量均衡的拆分。
這是虛擬機啟動優(yōu)化做的事情。我們發(fā)現(xiàn)虛擬機啟動之所以在分鐘級就要分析一下,虛擬機啟動用了多長時間,并不完全每一次都是一分鐘,有時候長有時候短。OpenStack會調(diào)用DHCPServer,根據(jù)上面拉下來的東西進行本地的初始化,初始化由于各種問題會導致時間非常不可控。其實IP是可以靜態(tài)化的,比如虛擬機的啟動、容器的啟動,剛啟動的時候數(shù)據(jù)庫就可以給它分配一個IP,Agent就知道將要用哪個IP,就不需要再通過DHCP的方式再分配IP。網(wǎng)卡打到虛擬機,虛擬機里的網(wǎng)卡會再放到Docker的Namespace里面,這樣Docker訪問網(wǎng)卡就只有一層的虛擬化。有一些傳統(tǒng)應用,有些東西是放在虛擬機里的,新的應用是放在容器里面的,它們之間的相互調(diào)用不希望用外部NAT方式,因為性能會下降。如果可以統(tǒng)一管理,就可以做到只有一層虛擬化,如果虛擬機、容器里面的應用屬于同一個租戶的話就可以相互互聯(lián)了。
蜂巢特色
蜂巢的特色首先就是聚焦應用,客戶只需要做好自己的微服務和DevOps就可以了。哪怕不能完全做好,下面有跨主機的二層網(wǎng)絡、有狀態(tài)容器、外部統(tǒng)一存儲這三個,并沒有意識到用容器的方式和虛擬機有太大差別。公用的監(jiān)控、鏡像、彈性伸縮、持續(xù)集成的服務。下面有我們的PaaS層數(shù)據(jù)庫、分布式存儲,如果用蜂巢,不需要關(guān)心數(shù)據(jù)庫的數(shù)據(jù)會不會丟失,自己要不要起個數(shù)據(jù)庫,要不要起個DBA,這樣就避免了麻煩。你只需要關(guān)心微服務化和DevOps,盡快把自己的服務上線,站在風口上就可以了。