近日,由InfoQ主辦的Qcon全球軟件開發(fā)大會在上海寶華萬豪酒店舉辦,QCon內容源于實踐并面向社區(qū),演講嘉賓依據(jù)熱點話題,面向5年以上工作經驗的技術團隊負責人、架構師、工程總監(jiān)、開發(fā)人員分享技術創(chuàng)新和實踐。在本次大會中,網易云容器編排負責人婁超分享了網易云容器平臺Kubernetes的持續(xù)升級實踐經驗。
據(jù)婁超介紹,網易云容器服務的前身是蜂巢,上線于2015年,也是國內第一個基于Kubernetes提供多租戶的微服務容器平臺。Kubernetes多用于私有云,并沒有租戶的概念,網易云在Kubernetes基礎上擴展了多租戶的能力,與IaaS做了無縫融合,支持集群虛擬機、物理機和GPU混布的異構計算;同時網易云提供的容器服務是無服務架構的,用戶只需關心鏡像和對計算資源的需求情況,底層可自動擴展和銷毀資源。
目前,網易云容器服務已經在線上持續(xù)運行三年多,歷經三個階段:初期,網易云容器服務是為開發(fā)者打造的容器云平臺,基于Kubernetes 1.0,支持多租戶,僅提供無狀態(tài)/有狀態(tài)兩種負載;發(fā)展期,網易云容器服務2.0基于Kubernetes 1.3/1.6,支持單用戶多Namespace,定制有狀態(tài)容器,做了全面的性能優(yōu)化和架構重構;融合期,網易云容器服務3.0符合Kubernetes一致性認證,可以同時支持K8s API和Serverless模式OpenAPI。婁超表示,Kubernetes自開源以來一直有著活躍的社區(qū)和用戶,版本升級周期已經穩(wěn)定在三個月,作為基于Kubernetes的容器服務應該選擇在何時升級,升到哪個版本都需要全面的考量。
升級面臨三大挑戰(zhàn)
升級是基于Kubernetes的云平臺和用戶必然會面臨的場景和挑戰(zhàn)。根據(jù)網易云的經驗,婁超總結了三大挑戰(zhàn):首先,社區(qū)更新快,版本變化大,升級工具不夠成熟;其次,容器形態(tài)的不斷演進促使網易云要持續(xù)發(fā)展才能跟上社區(qū)節(jié)奏;最后,平臺在升級的過程中要考慮用戶的使用模式和用戶業(yè)務的穩(wěn)定性。
如何升級?網易云總結四個經驗
那么,網易云容器集群是如何升級的?婁超首先例舉了GKE的升級模式,先升級Master,再升級Slave端,Master服務鏡像一鍵升級或自動升級,Nodes用戶手動滾動更新或配置自動升級,通過驅趕老Node用戶容器升級Nodes。為什么Google會采用這種對用戶并不太友好的升級方式呢?Ahmet是GKE的核心開發(fā)人員,曾在twitter上總結過業(yè)務零停服的Kubernetes升級建議,包括充分利用Kubernetes多副本,健康探測,信號處理,設置最長等待時間等特性。實際上,需要平臺供應商嚴格按照最佳實踐方式去用,才能保證業(yè)務的穩(wěn)定性。
回看網易云容器服務的Kubernetes的升級,主要經歷了三次升級過程。據(jù)婁超透露,網易云容器初期1.0線上用戶中,個人小用戶占了大多數(shù),有狀態(tài)單體容器占大部分,用法也比較隨意。在1.0升級到2.0的過程中,網易云主要要考慮了Kubernetes 1.3和1.0版本的差異,以及容器服務本身功能的變化。限于Kubernetes版本和Docker版本的兼容性并不好,這次升級主要做了三方面的探索:通過負載均衡幫用戶將流量平滑地遷移過去;保證K8s集群底層虛擬網絡互通,用戶可以通過自己的服務注冊服務發(fā)現(xiàn)服務實現(xiàn)遷移;對于將容器當做虛擬機來用的用戶,通過docker commit替換本地鏡像,幫用戶升級Node。
隨著容器技術的普及,網易云容器服務升級到2.0后,用戶對容器的使用也逐步趨于規(guī)范。婁超分享了在這次升級中對業(yè)務影響最小的熱升級方案:為了做到對所有容器無感知的升級,要做到不遷移Node,不重啟容器。據(jù)婁超介紹,為了達到這種Node In-Place升級,網易云主要通過kubelet v1.3可以無縫接管v1.0老容器,實現(xiàn)了容器的不重啟,通過容器網絡方案兼容實現(xiàn)了網絡的不中斷。
在升級的過程中,還會遇到Master與Node不兼容的問題。為了解決這個問題,婁超給出的解決方案是,先新建一個新版本的Master,在升級Node的時候,同時把API的地址改到新版本中去,保證升級時所有版本都是兼容的。此外,對于K8s多租戶的集群,升級的風險是很大的,網易云采用了灰度升級的方式。
最后,婁超總結了網易云容器平臺在持續(xù)升級實踐中的經驗教訓。首先,快速有效地對集群進行在線升級的前提是要做好開源選型,這是非常重要的基礎,比如Kubernetes就是容器編排領域的最佳選擇;第二,自己造特性需要謹慎,最好不要改開源系統(tǒng)本身的代碼,而要通過API去做功能的擴展;第三,要考慮是開源還是自研;第四,要保障版本的快速跟進。只有不斷改造原生K8s并與網易云基礎設施結合,才能緊跟社區(qū),支撐客戶業(yè)務多樣化的需求。
免責聲明:本網站內容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網站出現(xiàn)的信息,均僅供參考。本網站將盡力確保所提供信息的準確性及可靠性,但不保證有關資料的準確性及可靠性,讀者在使用前請進一步核實,并對任何自主決定的行為負責。本網站對有關資料所引致的錯誤、不確或遺漏,概不負任何法律責任。任何單位或個人認為本網站中的網頁或鏈接內容可能涉嫌侵犯其知識產權或存在不實內容時,應及時向本網站提出書面權利通知或不實情況說明,并提供身份證明、權屬證明及詳細侵權或不實情況證明。本網站在收到上述法律文件后,將會依法盡快聯(lián)系相關文章源頭核實,溝通刪除相關內容或斷開相關鏈接。