陌陌基于K8s和Docker容器管理平臺的架構實踐
原創(chuàng)【51CTO.com原創(chuàng)稿件】容器集群管理系統(tǒng)與容器云平臺的選擇非常重要,因為容器管理系統(tǒng)是否先進智能、容器云管理平臺是否靈活易用且高效,直接影響企業(yè)開發(fā)運維的效率與速度、資源利用率的高低。在這個競爭激烈,風云突變的時代,應用的開發(fā)效率、穩(wěn)定性、擴展性和安全性,決定了企業(yè)的競爭力與市值。
當下,K8s憑借在擴展性、管理、大數(shù)據(jù)分析、網(wǎng)絡場景、兼容性、負載均衡、灰度升級、失敗冗余、容災恢復、 DevOps 等方面的優(yōu)勢,受到部分企業(yè)的青睞。近日,由51CTO 主辦的第十六期以“Tech Neo”為主題的技術沙龍活動中,來自陌陌科技SRE團隊負責人王景學分享了陌陌在K8s容器方面的一些應用實踐。
為什么選擇使用K8s?
在使用k8s之前,陌陌在應用發(fā)布和運行環(huán)境方面遇到的具體問題,如下:
- 應用發(fā)布時間很長,主要是因為發(fā)布過程中需要做隔離、恢復等動作,還需要登錄查看實際狀態(tài)、日志。
- 當遇到晚高峰情況這樣的突發(fā)狀況,需要緊急擴容。這時業(yè)務方會申請機器,可新機需要進行環(huán)境初始化、相關配置,這樣導致效率非常低。
- 應用運行環(huán)境的軟件版本不一致,配置復雜,維護成本比較高。
- 硬件資源利用率不足,總體成本比較高。
針對以上遇到的問題,我們決定對架構進行改造,同時制定了一系列架構改進目標,如下:
- 提高服務可用性,可管理性??捎眯允钱斈骋慌_機器出現(xiàn)宕機,會自動切換到其他機器??晒芾硇允窃趹眯枰獢U容時,自動化去部署運行環(huán)境、相關配置。開發(fā)不需要再去考慮服務器的問題。
- 提高資源隔離性,實現(xiàn)服務混合部署。
- 應用級別的監(jiān)控,當機器需要擴容時,自動排查是哪個應用所致。
- 服務平滑遷移。
綜合這些問題和目標,陌陌選擇使用 Kubernetes來管理 Docker 集群,當 Kubernetes 滿足不了需求時,可在部署平臺開發(fā)相應的功能來滿足開發(fā)查看日志、監(jiān)控和報警等需求,盡量避免登錄主機和容器。
陌陌容器管理平臺的架構演進
陌陌從2015年下半年開始對Docker進行調(diào)研和實踐,2016年初開始調(diào)研k8s,嘗試架構方面的改進工作,基于自研發(fā)布系統(tǒng)及K8s、OVS和Docker構建容器管理平臺。實現(xiàn)了基于Docker集群的部署系統(tǒng),便于開發(fā)者便捷地部署自己的應用程序。最終達到部署環(huán)境干凈一致,可重復部署、迅速擴容和回滾。
如下圖,是容器管理平臺的架構圖:
容器管理平臺主要功能有集群管理和狀態(tài)展示、灰度發(fā)布和代碼回退、組件模板、應用管理、鏡像倉庫和權限管理等。它采用前后端分離的架構,前端使用 JS 渲染,后端使用 Python 提供 API。這樣開發(fā)者可以快速的進行發(fā)布和回退操作。
容器管理平臺在應用發(fā)布流程,集群調(diào)度策略,k8s節(jié)點網(wǎng)絡架構,阿里云支持,基礎監(jiān)控指標等方面進行了優(yōu)化改進。
應用發(fā)布流程
陌陌之前老版本發(fā)布系統(tǒng)是串行的,需要單臺進行替換。如下圖,是新架構下應用的發(fā)布流程:
新的發(fā)布系統(tǒng)是用戶提交代碼后,在發(fā)布系統(tǒng)選擇要部署的commit,點擊構建以后,系統(tǒng)會自動編譯,打包成鏡像,推送鏡像倉庫。如果構建成功,用戶點擊發(fā)布新版本的實例,灰度沒有問題,全量,下線老版本的實例。回退時代碼不需要構建,直接發(fā)布老版本實例。在某段時間內(nèi),新老版本是同時存在的。
集群調(diào)度策略
陌陌的集群調(diào)度策略是為應用配置默認的location(集群標簽),如果是線上應用,應用需要申請location,部署到正式的集群(機房要求,資源充足)。這里應用都不能獨占集群,均采用的是混合部署的方式。
同一個集群下,分成不同組并組定義標簽,應用支持獨占機器,同一個組之間的應用實例可以隨意飄移。
IDC網(wǎng)絡節(jié)點
在IDC網(wǎng)絡節(jié)點構建部分,陌陌使用的是全局IP地址,容器與容器之間、容器與主機之間都是互通的。這樣一來,通信可以不使用任何封裝等技術,相對來說比較高效且對現(xiàn)有網(wǎng)絡變動影響?。▋H需封裝trunk,無其他協(xié)議,mtu等變化)。
如下圖,是IDC網(wǎng)絡節(jié)點架構圖:
在這樣的架構下,網(wǎng)絡部署和擴展相對簡單,因為每臺機器的IP地址段是預先靜態(tài)配置的。
這里值得注意的是,服務器雙鏈路上聯(lián),trunk上聯(lián)物理交換機需要合理避免二層環(huán)路。
這樣的方式存在的不足是,當容器較多時,mac地址數(shù)量增多,給物理交換機Mac地址表帶來壓力,廣播域擴大就是需要嚴謹?shù)囊?guī)劃vlan 角色相關信息。
阿里云支持
當前,陌陌K8s master集群下節(jié)點包含IDC、阿里云及兩者混合三種方式,如下圖:
阿里云采用的網(wǎng)絡模式是Host-gw,陌陌搭建了一條IDC與阿里云的VPC專線和VPC的虛擬路由進行靜態(tài)配置。無論是IDC節(jié)點,還是阿里云節(jié)點上的應用都要適應IP動態(tài)變化。
基礎監(jiān)控指標
陌陌的監(jiān)控方案大多是基于Kublet cadvisor metrics接口去做的數(shù)據(jù)匯總。最初陌陌采用的方式是利用Python腳本,去調(diào)用接口,在取到一些CPU內(nèi)存、網(wǎng)絡、流量的數(shù)據(jù),存入ES,分析之后進行展示。之后的報警系統(tǒng),是利用Java應用去調(diào)取Kublet cadvisor metrics接口,進行數(shù)據(jù)的收集。
基礎監(jiān)控指標主要有內(nèi)存(total,rss,cache)、流量(incoming,outgoing)、網(wǎng)絡packets(drop,error, total)等。
應用遷移
應用遷移方面,陌陌做了很多適配工作,使得應用不需要太多的改動就可以無縫遷移。具體適配細節(jié)如下:
- 應用適應動態(tài)ip變化。
- 自定義構建過程(build.sh)。
- 應用使用不同的服務發(fā)現(xiàn)框架(nginx,rpc)(start.sh)。
- 應用銷毀過程中做一些額外處理(stop.sh)。
在應用遷移過程中,也遇到了一些問題,如Swap、cpu軟中斷優(yōu)化、資源利用率、Ip白名單、適用于內(nèi)網(wǎng)等問題。
當前,陌陌的容器業(yè)務規(guī)模服務器約400臺、線上容器6000、應用700+。應用的類型是java+php+node+python+tomcat。
未來展望
希望運維可以實現(xiàn)對應用請求量,線程數(shù),流量等指標的監(jiān)控。基準值部分,達到單實例可承載請求量,線程數(shù),流量。伸縮方面,做到最小保留實例數(shù),最大擴容實例數(shù),根據(jù)監(jiān)控反饋和基準值計算需要擴容和縮容的實例數(shù), 按照各個集群資源余量按比例伸縮。
【嘉賓簡介】
陌陌王景學,現(xiàn)任SRE團隊負責人,以前運維相關工作都做過,自動化,虛擬化,docker,k8s相關都非常熟悉。
Tech Neo技術沙龍 | 11月25號,九州云/ZStack與您一起探討云時代網(wǎng)絡邊界管理實踐,點擊圖片,立即報名。
【51CTO原創(chuàng)稿件,合作站點轉(zhuǎn)載請注明原文作者和出處為51CTO.com】