網易蜂巢劉超:基于萬節點Kubernetes支撐大規模云應用實踐
12月2日,ArchSummit全球架構師峰會在北京開幕,作為面向高端技術管理者、架構師的技術大會,本屆峰會吸引了上千位技術管理者、CTO、架構師等。其中在云計算領域嶄露頭角的網易蜂巢受邀出席,網易蜂巢解決方案總架構師劉超就Kubernetes支撐大規模云應用的實踐進行了分享。
隨著云計算的普及,越來越多的企業開始在云端部署自己的應用,如何對這些應用進行管理、調度、優化、自主運維等,以實現應用的快速部署、快速迭代和實時監控,已然成為云計算服務的一大難題。
網易蜂巢從2012年正式上線私有云平臺,到2014年,95%的互聯網應用全部放到云平臺上,到2015年網易蜂巢容器云平臺正式對外開放,再到2016年上線DevOps和微服務。
作為網易云的基礎設施云服務,網易蜂巢一直走在行業前列,并形成了新一代云計算的雛形,實現了從虛擬機到容器,從傳統應用到微服務化,從傳統研發流程到DevOps,從私有云走向公有云的四個方面的轉變。
網易蜂巢已經從最初千級別節點數成長為萬級別節點數集群,并支撐了擁有億級用戶的網易考拉海購和網易云音樂。在雙十一等訪問峰值來臨的時候,網易蜂巢系統的彈性伸縮能力以及應用層的微服務化能力表現卓越。
據劉超介紹,網易蜂巢的技術優化可以追溯到IaaS層、PaaS層和CaaS層。
網易蜂巢基于OpenStack自主研發了IaaS服務,在計算虛擬化方面,通過裁剪KVM鏡像,優化虛擬機啟動流程等改進,實現了虛擬機的秒級別啟動。在網絡虛擬化方面,通過SDN和Openvswitch技術,實現了虛擬機之間的高性能互訪。在存儲虛擬化方面,通過優化Ceph存儲,實現高性能云盤。
在PaaS層,網易可以說更加的功力深厚,在數據庫,緩存,對象存儲方面都有非常多的優化。比如說數據庫RDS服務,網易是兼容開源的mysql數據庫的所有接口的,然而開源的mysql會出現性能不高,主備切換數據丟失等現象,這對于很多關鍵應用來講,是不能忍受的。網易是業內為數不多的具備mysql內核開發能力的公司之一,通過優化主備同步技術,可以實現主備切換數據零丟失,為了優化mysql性能,網易還優化了mysql并行復制技術和group commit技術,實現了可靠性和性能的兼顧平衡。當然數據庫的性能除了數據庫本身,SQL語句的撰寫也是十分重要的,直接影響著SQL查詢的性能和并發量,這雖然是應用層的事情,但是蜂巢根據自己多年的數據庫運維經驗,開發了SQL優化工具,用戶只要將SQL語句輸入這個優化工具,就可以發現SQL查詢的瓶頸以及修改建議,例如索引的設置問題,主鍵的設置問題等等。
不過劉超表示,傳統的私有云只能實現資源層面的彈性,應用層面的彈性往往通過腳本實現,而且很多互聯網應用由于要求上線時間快,多采取單體架構進行部署,從而喪失了三個方面的靈活性。
| 時間靈活性:應用快速迭代,縮短客戶需求到產品上線的時間
| 空間靈活性:應用彈性伸縮,應對業務量突然增長后較短時間恢復
| 管理靈活性:易部署,易遷移,服務發現,依賴管理,自動修復,負載均衡
網易蜂巢作為容器云平臺,相比于虛擬機實現了以資源為核心到以應用為核心的轉變,用戶可以通過對于應用的改造,實現微服務化和DevOps.
***板斧:去狀態、可擴展。
原來的很多應用程序都是有狀態的,所謂有狀態,就是將很多數據保存在內存中和本地文件系統,這樣的話,一旦容器宕機后被分發到其他機器上的時候,所有的狀態就都不見了。通過將內存中的數據放在外部的緩存系統,將用戶數據放在數據庫中,將本地文件放在分布式存儲系統中,通過狀態的外置化,將應用程序編程僅僅包含業務邏輯的實體,就可以進行橫向的彈性擴展,支撐大規模訪問了。對于外部的數據,緩存系統,數據庫系統,和存儲系統,都有自身的高可用的機制,不需要應用層過多關心這方面的事情。
第二板斧:容器化、可編排。
有的人將容器化和微服務化劃等號,其實不是的,不僅僅微服務可以容器化,一旦去狀態了,就可以容器化。一旦容器化,就可以使用容器編排系統kubernetes進行容器的管理了。
例如一個應用包含四個服務A,B,C,D,她們相互引用,相互依賴。如果使用了kubernetes,則服務之間的服務發現就可以通過服務名進行了,例如A服務調用B服務,不需要知道B服務的IP地址,只需要在配置文件里面寫入B服務服務名就可以了。如果中間的節點宕機了,kubernetes會自動將上面的服務在另外的機器上啟動起來,容器啟動之后,容器的IP地址就變了,但是不用擔心,kubernetes會自動將服務名B和新的IP地址映射好,A服務并無感知。這個過程叫做自修復和自發現。如果服務B遭遇了性能瓶頸,三個B服務才能支撐一個A服務,也不需要特殊配置,只需要將服務B的數量設置為3,A還是只需要訪問服務B,kubernetes會自動選擇其中一個進行訪問,這個過程稱為彈性擴展和負載均衡。
第三板斧:DevOps、可迭代。
在開發和運維的過程中,往往涉及開發環境,測試環境,聯調環境,生產環境。如果不同的環境都需要腳本進行維護,成本太大,不能滿足敏捷開發的要求。容器鏡像的不可改變性可以很好的解決這一點。
在容器的鏡像中,業務代碼,程序庫,系統依賴,文件目錄結構等,都已經打包在里面了,無論從哪里啟動起來,都是統一的環境,只需要通過環境變量和配置文件的形式將不同環境的差異注入即可。而且更加優雅的是,結合上面說的編排系統,服務之間的依賴可以通過服務名寫入配置文件,這樣不同的環境不需要修改配置文件就能夠找到對應系統的服務。結合代碼管理系統,通過web hook的方式,用戶提交代碼,馬上觸發web hook,調用到網易蜂巢的API,則網易蜂巢會在一分鐘內構建新的鏡像并更新應用,接下來可以進行自動化測試,如果測試通過,則運維人員就可以一鍵更新線上生產環境了。
對于尚不能一步實現微服務化和DevOps的用戶,網易蜂巢還提供了有狀態容器的方式,通過掛在遠程云盤保存狀態數據的方式,使得用戶方便從虛擬機模式向容器模式進行過度。
在CaaS層面,為了支撐大規模云應用,除了應用層面的改造,容器的網絡和存儲性能也是非常重要的。在網絡方面,很多容器的使用者使用默認的port mapping的方式進行網絡互聯,這樣對于應用的浸入性太大。也有使用開源的如Docker Network, Flannel, Calico, Weave, OVS等方案,存在二次虛擬化的問題,虛擬機的網絡互聯是一次虛擬化,為了實現容器跨虛擬機互聯,則需要進行二次虛擬化,大大降低性能。網易蜂巢基于SDN,將IaaS層的網絡互聯能力直接應用與容器,通過一次虛擬化就能夠實現容器的扁平化二層互聯。在存儲方面,如果使用容器的統一存儲策略,例如基于云盤搭建Ceph集群,也存在二次虛擬化的問題,云盤本身是一次虛擬化,將云盤作為普通的存儲,在其上搭建Ceph集群,則為二次虛擬化,大大降低性能,網易蜂巢基于Ceph,將云盤直接掛在到容器里面,實現一次虛擬化。
服務微服務化之后,容器數量會比較多,如果查找問題需要對于每個容器的日志進行查看,會比較難定位問題,網易蜂巢平臺提供統一的日志收集,分析,搜索服務,用戶可以通過關鍵字進行搜索,將某個訂單號在各個應用中的日志全部查詢出來,則問題就一目了然了。
除了問題的定位,性能瓶頸的定位也是一個挑戰,網易蜂巢引入服務端 APM 解決細粒度性能分析,通過不同應用之間的調用鏈,迅速發掘性能瓶頸。
當容器規模擴大到一定程度,kubernetes的調度就成為了瓶頸,開源的kubernetes是通過串行隊列Pod queue進行任務調度的,當任務規模比較大,但隊列不能滿足要求,網易蜂巢優化為多個優先級隊列,極大提高了任務的調度速度和容器的修復速度。另外由于kubernetes的數據是保存在etcd里面,當容器規模擴大的時候,單個etcd集群已經不能滿足讀寫性能,通過根據Pod/Node/Replication Controller等資源到拆分不同etcd集群,解決了集群擴展性的問題。
同時劉超表示,在這個“唯快不破”的互聯網時代,網易蜂巢將助力企業實現微服務化。
在如圖中的架構里面,用戶僅僅需要關心自己的應用的開發流程,實現微服務和DevOps,至于底層的IaaS層的計算,網絡,存儲,中間的PaaS的數據庫,緩存,對象存儲,上層的CaaS層的持續集成、鏡像倉庫、服務發現、服務編排、日志服務、APM等,以及對外的負載均衡和CDN服務,可以全部交給網易蜂巢平臺來實現。
更重要的是,網易蜂巢遵循開放、標準、穩定的原則,所有的層面全部使用開源的軟件和開放的接口,使得服務本身易遷移、無綁定。
作為一家擁有19年經驗的互聯網公司,網易在向客戶輸出穩定云服務的同時,還將輸出完善的知識體系,幫助企業更好的運用好云服務,并創造更大的價值。