李英華
摘要:在云計算日益火爆的今天,云計算領域誕生了一個新興技術,使得整個計算機行業(yè)為之振奮。這就是Docker——一個全新的“容器”。Docker作為輕量級容器能夠為云計算3種模型(SaaS,PaaS,IaaS)之一的PaaS的構建提供可靠的支持。文章以Docker為基礎平臺,以Google開源的Kubernetes為平臺,Harbor為鏡像倉庫,Etcd為全局索引系統(tǒng),falcon-agent為監(jiān)控構建完整的集群資源管理系統(tǒng),提供大型集群環(huán)境部署及管理方案。
關鍵詞:云計算;容器;虛擬化;集群
1研究背景及意義
現(xiàn)行的大規(guī)模網(wǎng)絡集群都由巨量的服務器組成,多數(shù)計算型資源的服務器,的計算能力無法得到充分利用。例如LXC,KVM等虛擬化技術雖然對資源進行隔離,但LXC,KVM技術依賴于物理CPU,及內(nèi)存,是硬件級別,無法進行快速的部署、啟動和遷移。而Docker相當于操作系統(tǒng)之上的程序,利用操作系統(tǒng)containerzation技術,可以在KVM虛擬機上運行,容器占用系統(tǒng)資源很低,極大地提高了資源利用率。當今,面向互聯(lián)網(wǎng)的服務,一旦各種資源達到瓶頸,最簡單的方法就是提高服務器的數(shù)量。但是,需要大規(guī)模的部署系統(tǒng)及應用,且峰值過后,又需要遷移過量的機器。而Docker通過將多種依賴組件及服務打包成鏡像的方式,能夠實現(xiàn)快速的部署和實現(xiàn),且一臺主機可以同時運行多個實例,峰值過后,還可快速的銷毀,極大地提高了大型服務的伸縮能力。云計算技術使互聯(lián)網(wǎng)服務必須由巨量的服務所支撐。不同的服務有著不同的功能就如同不同的零件組裝成機器,而Docker容器就像一個集裝箱,把所需要的服務及環(huán)境都封裝在里面,想用的時候隨時可以拿走并使用,提供了一個快速啟動,快速部署,版本控制的方法。Docker與云計算平臺的結合產(chǎn)生了良好的化學反應。
2系統(tǒng)綜述
集群資源管理系統(tǒng)實現(xiàn)資源的統(tǒng)一管理和使用,同時監(jiān)視集群的資源負載情況,為上層業(yè)務系統(tǒng)提供靈活、快速、動態(tài)的多種資源服務,提供統(tǒng)一的系統(tǒng)資源管理基礎構架。整個系統(tǒng)由資源實體層、資源服務層、資源管理層等組成。
面向容器的集群資源管理系統(tǒng),管理計算資源,為不同服務提供資源及環(huán)境。其整體系統(tǒng)架構如圖1所示。
按照系統(tǒng)各組件之間的關聯(lián)關系,完整的系統(tǒng)需要的組件可分為以下部分:(1)Docker組件Kubernetes集群使用Docker作為基礎容器組件,容器啟動net=none網(wǎng)絡,通過assginer和pipwork配置容器的網(wǎng)絡。Docker在LXC之上融#AUFs分層鏡像管理機制,拋棄傳統(tǒng)虛擬機試圖模擬完整機器的思路,以應用為單元進行“集裝封箱”,是“輕量級”的虛擬化技術。Docker Engine可以自動化部署應用到可移植的容器中。Docker容器可以封裝任何有效負載,幾乎可以在任何服務器之間進行一致性運行。開發(fā)者構建的應用只需一次構建即可多平臺運行。運營人員只需配置他們的服務,即可運行所有應用。(2)Kubernetes組件Kubernetes Cluste中創(chuàng)建的每一個集群都對應一套Kubernetes環(huán)境。一套完整的Kubernetes集群包含一臺Kubernetes master和若干臺Kubernetes node。為了確保Kubernetes集群正常運轉,每一臺集群內(nèi)主機上首先需要配置好Docker組件,此外,整套集群需單獨部署如下組件:etcd:為Kubernetes集群配置提供存儲服務,記錄所有組件的信息和更新狀態(tài);另外,assginer也依賴于etcd,在提供的安裝腳本中,Kubernetes和assginer共用同一套etcd集群。(3)監(jiān)控組件。容器資源管理的監(jiān)控系統(tǒng)是在小米開源的open-falcon基礎上進行修改實現(xiàn)的。一套完整的監(jiān)控系統(tǒng)需要如下組件:agent:采集信息并上報組件,需要在集群中所有node節(jié)點部署。
3系統(tǒng)具體功能實現(xiàn)
Kubenetes通過scheduler通過Apiserver查詢資源充足的機器分配Pod,過程如下:通過客戶端提出需求,可以通過Apiserver的Restful API,也可以使用kubectl命令行工具。支持的數(shù)據(jù)類型包括JsON和YAML。具體步驟為:(1)Apiserver獲取資源申請請求,并存儲到etcd;(2)調(diào)度器通過Apiserver查詢請求。嘗試為Pod分配主機;(3)過濾主機:調(diào)度器根據(jù)請求需要的資源過濾資源剩余不足的節(jié)點;(4)進一步評估剩余機器,尋找負載最低的機器;(5)選擇主機:將選擇的結果存儲到etcd中;(6)對應機器根據(jù)kubelet查詢的結果執(zhí)行創(chuàng)建Pod操作。
Docker容器申請流程及說明:通常在生產(chǎn)環(huán)境中,往往需要對大規(guī)模需求進行快速的響應部署。通常情況下都是以rc為對象創(chuàng)建一一對應的實例。通過yaml文件描述需求具體情況及資源分配。通過yaml文件將Ip池導入etcd,具體命令操作為:Assigner import import.yaml$ETCDPATH。然后再資源上線:通過kubectl命令行操作,具體命令如下:Kubectl creme-fxx.yaml。
通過commiter對穩(wěn)定的Docker容器進行版本固化:commiter是一款由go語言開發(fā)的,基于Kubernetes集群的系統(tǒng)鏡像資源和IP資源的管理系統(tǒng)。該系統(tǒng)的功能實現(xiàn)需要assigner和Kubernetes的配合。Commiter為用戶提供可配置的鏡像倉庫地址、Apiserver地址、ftp地址;以組件為單位,將組件內(nèi)所有的業(yè)務容器打包成鏡像,鏡像命名規(guī)則為:registory/app-component-ip:tag,其中tag為當天日期;將鍵值對<鏡像名:容器IP>寫入ETCD中/commiter/ips目錄下,其中鏡像名不包含倉庫信息,即:app-component-ip:tag;將鏡像上傳到鏡像倉庫;對該組件內(nèi)每個業(yè)務容器,增加對應Kubernetes Pod標簽,標簽內(nèi)容為IP=containerip;根據(jù)組件rc模板文件,為該組件內(nèi)每個業(yè)務容器生成一個單獨的pod_rc控制文件,該pod_rc命名規(guī)則為:appre-component-ipyaml,其中該pod_rc控制文件中鏡像名為該pod中業(yè)務容器利用commiter打包生成的鏡像名;將生成的pod_rc文件上傳到ftp對應/app/component目錄下;針對生成的pod_rc,調(diào)用Kubernetes,執(zhí)行create操作,完成pod_rc對該組件控制rc的接管(組件內(nèi)所有的pod_rc全部執(zhí)行完才算完全接管)。
容器IP配置的說明:(1)編寫import.yaml文件將ip池導入etcd按指定目錄存儲;(2)創(chuàng)建pod容器成功后通過assigner查詢etcd中對應IP池提取未被占用的IP;(3)通過pipework為指定容器分配IP。
4結語
隨著移動互聯(lián)網(wǎng)的迅速發(fā)展,海量的數(shù)據(jù)使得企業(yè)級應用承受了巨大的壓力。云計算,大數(shù)據(jù)的作用越來越大。也催生了虛擬機及容器技術。例如Docker。又由此催生了一系列管理容器的服務,例如Kubernets。
現(xiàn)在許多企業(yè)都在加大對容器技術的使用力度。對于大型集群而言,容器技術,可以提升資源利用率。提高資源分配效率及彈性伸縮能力。結合鏡像的使用方式,可實現(xiàn)服務的快速部署及啟動。京東在雙11部署了15萬+的容器,使業(yè)務效率提升了N個等級。阿里云也正在推進容器化。