鄒理賢
(云宏信息科技股份有限公司 廣東省廣州市 510650)
過去幾十年來,IT 機(jī)構(gòu)的發(fā)展經(jīng)歷了單機(jī)架構(gòu)、分布式架構(gòu)和云計(jì)算架構(gòu)的過程[1]。當(dāng)前,國內(nèi)外基于服務(wù)器虛擬化的云計(jì)算平臺(tái)發(fā)展已經(jīng)較為成熟,很多企業(yè)應(yīng)用已經(jīng)遷移到了云端。這些應(yīng)用大部分基于傳統(tǒng)的設(shè)計(jì)方法,并沒有充分利用和發(fā)揮云的特點(diǎn)。近年來,云原生[2]的理念應(yīng)運(yùn)而生,主要特點(diǎn)是為云而生,充分利用云的彈性及分布式優(yōu)勢。云原生涵蓋了容器、微服務(wù)、服務(wù)網(wǎng)格等技術(shù)[3]。隨著 Docker 的出現(xiàn)與流行,基于容器的云計(jì)算平臺(tái)逐漸火熱,而現(xiàn)階段 Docker 使用大多集中于操作系統(tǒng)虛擬化,基于 Docker 容器環(huán)境的云存儲(chǔ)在線應(yīng)用系統(tǒng)較少,雖然 Docker Hub 中提供了多種數(shù)據(jù)庫的開源 Docker 鏡像,但是目前鮮有企業(yè)級(jí)應(yīng)用。
本文針對(duì)上述問題,主要研究如下幾個(gè)內(nèi)容:
(1)研究容器技術(shù),形成搭建支撐云存儲(chǔ)在線應(yīng)用的基礎(chǔ)架構(gòu)平臺(tái);
(2)研究與實(shí)現(xiàn)云存儲(chǔ)在線應(yīng)用系統(tǒng)及其相關(guān)聯(lián)服務(wù)微服務(wù)化,實(shí)現(xiàn)平臺(tái)應(yīng)用服務(wù)組件的模塊化,使管理者可通過 UI 界面控制容器引擎,完成應(yīng)用服務(wù)的自動(dòng)化部署和運(yùn)維;
(3)在此基礎(chǔ)上進(jìn)行分布式云存儲(chǔ)在線應(yīng)用系統(tǒng)的服務(wù)內(nèi)容設(shè)計(jì)。
容器運(yùn)行于多個(gè)計(jì)算節(jié)點(diǎn)上,共同組成一個(gè)應(yīng)用的微服務(wù)架構(gòu)。容器編排技術(shù)為容器化的應(yīng)用提供資源調(diào)度、部署運(yùn)行以及服務(wù)的發(fā)現(xiàn)、擴(kuò)容、縮容等一整套功能。
容器編排為高可用容器集群管理軟件架構(gòu)。集群中的機(jī)器被劃分為一個(gè)(或多個(gè))管理節(jié)點(diǎn)和一群計(jì)算節(jié)點(diǎn)(Node),其中管理節(jié)點(diǎn)上運(yùn)行著集群管理相關(guān)的一組進(jìn)程API 服務(wù)、多種控制管理器、調(diào)度器和分布式數(shù)據(jù)庫四個(gè)組件,其中前三個(gè)組件構(gòu)成了集群的總控中心,負(fù)責(zé)對(duì)集群中所有資源進(jìn)行管控和調(diào)度。在每個(gè)計(jì)算節(jié)點(diǎn)上運(yùn)行工作者、服務(wù)訪問代理和容器代理三個(gè)組件,負(fù)責(zé)對(duì)本節(jié)點(diǎn)的容器的生命周期進(jìn)行管理,以及實(shí)現(xiàn)服務(wù)代理的功能。另外,在所有節(jié)點(diǎn)皆可運(yùn)行編排的命令行工具,提供集群管理工具集。
每個(gè)編排計(jì)算節(jié)點(diǎn)上運(yùn)行一個(gè)編排的工作者,其監(jiān)聽管理節(jié)點(diǎn)的api 資源,通過監(jiān)聽到本節(jié)點(diǎn)的任務(wù)來編排本節(jié)點(diǎn)上的容器。當(dāng)一個(gè)容器部署到本節(jié)點(diǎn)上時(shí),節(jié)點(diǎn)訪問代理就設(shè)置對(duì)應(yīng)的訪問規(guī)則來設(shè)定集群的訪問能力,如網(wǎng)絡(luò)端口,路由策略等。每個(gè)節(jié)點(diǎn)上都有個(gè)虛擬網(wǎng)絡(luò)節(jié)點(diǎn),其互相通信,通過加密虛擬網(wǎng)絡(luò)包的方式實(shí)現(xiàn)集群內(nèi)節(jié)點(diǎn)的安全通訊。
1.1.1 資源調(diào)度
集群中的調(diào)度器,負(fù)責(zé)容器在集群節(jié)點(diǎn)中的調(diào)度分配。接收控制管理器創(chuàng)建的新容器,為其安排一個(gè)目標(biāo)計(jì)算節(jié)點(diǎn),目標(biāo)節(jié)點(diǎn)上的工作者服務(wù)進(jìn)程接管后續(xù)工作負(fù)責(zé)容器整個(gè)生命周期。
編排器的作用是將帶調(diào)度的容器按照特定的調(diào)度算法和調(diào)度策略綁定到集群中的某個(gè)計(jì)算節(jié)點(diǎn)上,并將綁定信息寫入數(shù)據(jù)庫中。在整個(gè)調(diào)度過程中涉及三個(gè)對(duì)象,分別是:待調(diào)度容器列表、可用計(jì)算節(jié)點(diǎn)列表,以及調(diào)度算法和策略。
調(diào)度器默認(rèn)的調(diào)度流程分為以下兩步。
(1)預(yù)選調(diào)度過程,即遍歷所有目標(biāo)計(jì)算節(jié)點(diǎn),篩選出符合要求的候選節(jié)點(diǎn)。編排器內(nèi)置了多種預(yù)選策略。
(2)確定最優(yōu)節(jié)點(diǎn),采用優(yōu)先策略計(jì)算出每個(gè)候選節(jié)點(diǎn)的積分,積分高者勝出。
調(diào)度策略支持支持基于容器名稱和服務(wù)名稱的容器調(diào)度設(shè)置,可以指定容器運(yùn)行的主機(jī),支持主機(jī)親和性/反親和性調(diào)度,支持容器親和性/反親和性調(diào)度。
1.1.2 服務(wù)發(fā)現(xiàn)
編排集群內(nèi)部包含服務(wù)發(fā)現(xiàn)控制器,負(fù)責(zé)服務(wù)的創(chuàng)建、注冊、監(jiān)控、發(fā)現(xiàn)以及容器與服務(wù)之間的通訊。服務(wù)是一個(gè)定義容器集合的抽象,或則被訪問者看作一個(gè)訪問策略,有時(shí)也被稱作微服務(wù)。服務(wù)是一種資源對(duì)象與容器相似??梢酝^API 服務(wù)的POST 接口創(chuàng)建一個(gè)新的實(shí)例。
集群服務(wù)實(shí)現(xiàn)上主要通過集群內(nèi)部的域名解析DNS 來實(shí)現(xiàn),DNS 服務(wù)器通過API 服務(wù)監(jiān)控與服務(wù)相關(guān)活動(dòng)。當(dāng)監(jiān)控到服務(wù)創(chuàng)建時(shí),DNS 服務(wù)器為每個(gè)Service 創(chuàng)建以一系列DNS 記錄,通過DNS 來查找服務(wù),NDS 返回的結(jié)果是集群IP(虛擬IP、集群IP)。
集群內(nèi)的容器就可以通過對(duì)應(yīng)的服務(wù)來解析出對(duì)應(yīng)的IP,最終來實(shí)現(xiàn)集群內(nèi)的容器服務(wù)發(fā)現(xiàn)通訊。
1.1.3 彈性伸縮
集群內(nèi)部包含副本控制器,其核心作用是確保在任何時(shí)候集群中一個(gè)副本資源所關(guān)聯(lián)的容器都保持一定數(shù)量的容器副本處于正常運(yùn)行狀態(tài)。如果該類容器副本數(shù)量太多,則副本控制器會(huì)銷毀一些容器副本,反之副本控制器會(huì)添加容器副本,直到該類容器的副本數(shù)量達(dá)到預(yù)設(shè)的副本數(shù)量,實(shí)現(xiàn)自動(dòng)創(chuàng)建、補(bǔ)足、替換、刪除容器副本。
副本控制器常用的實(shí)用模式:
(1)重新調(diào)度。不管你想運(yùn)行1 個(gè)副本還是1000 個(gè)副本,副本控制器都能確保指定數(shù)量的副本存在于集群中,即使發(fā)生節(jié)點(diǎn)故障或容器副本被終止運(yùn)行等意外狀況。
(2)彈性伸縮。手動(dòng)或者通過自動(dòng)擴(kuò)容代理修改副本控制器的副本期望屬性值,可實(shí)現(xiàn)擴(kuò)大或縮小的副本數(shù)量。
圖1:基于容器環(huán)境的基礎(chǔ)架構(gòu)設(shè)計(jì)
(3)滾動(dòng)更新。副本控制器被設(shè)計(jì)成通過逐個(gè)替換容器的方式來輔助服務(wù)的滾動(dòng)更新。推薦的方式是創(chuàng)建一個(gè)新的只有一個(gè)副本的資源,若新的資源副本數(shù)量加1,則舊的副本數(shù)量減1,直到這個(gè)舊的副本數(shù)量為零,然后刪除該舊的容器。
1.1.4 編排服務(wù)
編排是集群內(nèi)部的管理控制中心內(nèi),負(fù)責(zé)集群內(nèi)的計(jì)算節(jié)點(diǎn)、容器副本、服務(wù)端點(diǎn)、命名空間、服務(wù)賬號(hào)、資源定額等的管理并執(zhí)行自動(dòng)化修復(fù)流程,確保集群處于預(yù)期的工作狀態(tài)。
其通過一個(gè)統(tǒng)一的編排服務(wù)接口,提供各個(gè)編排資源的提交及注冊,其分為用戶期望及編排狀態(tài)兩部分。當(dāng)用戶保存對(duì)應(yīng)的信息后,編排控制器把對(duì)應(yīng)的任務(wù)下發(fā)到各個(gè)對(duì)應(yīng)的控制管理器上,讓其編排調(diào)度。
1.1.5 健康檢查
監(jiān)控檢測為資源的正常服務(wù)狀態(tài)的檢查,其分為準(zhǔn)備態(tài)和健康態(tài)。準(zhǔn)備態(tài)為容器服務(wù)從無到有準(zhǔn)備完成可以提供正常服務(wù)了。健康態(tài)為容器服務(wù)運(yùn)行很長時(shí)間后,編排引擎通過它來檢測對(duì)應(yīng)服務(wù)是否正常運(yùn)行。
用戶可以設(shè)置不用的規(guī)則,讓監(jiān)控檢查來檢測對(duì)應(yīng)的服務(wù),如端口是否打開,api 請(qǐng)求是否正常等。
1.1.6 生命周期管理
編排對(duì)容器的生命周期管理主要指其通過資源在集群內(nèi)的狀態(tài)其實(shí)現(xiàn)其副本數(shù),對(duì)應(yīng)節(jié)點(diǎn)存活遷移等。其主要通過各個(gè)節(jié)點(diǎn)的編排工作者來實(shí)現(xiàn)對(duì)應(yīng)的生命周期管理。
編排工作者通過觀察控制器對(duì)應(yīng)的api 接口,然后通過容器調(diào)度標(biāo)準(zhǔn)接口來控制本節(jié)點(diǎn)的容器。其直接調(diào)用容器運(yùn)行管理器器內(nèi)建編排插件,通過方法調(diào)用來進(jìn)行交互,從而減少遠(yuǎn)程的開銷。
1.1.7 負(fù)載均衡管理
通過設(shè)置容器的入口點(diǎn)規(guī)則,生成對(duì)應(yīng)負(fù)載均衡器的負(fù)載均衡規(guī)則。然后把動(dòng)態(tài)生成的規(guī)則下發(fā)到各個(gè)節(jié)點(diǎn)的負(fù)載均衡器上。最終實(shí)現(xiàn)對(duì)集群內(nèi)部服務(wù)的負(fù)載均衡的訪問,實(shí)現(xiàn)高可用。
1.1.8 容器多集群管理
容器的多集群管理指的是集群通過集群命名空間的方式實(shí)現(xiàn)集群內(nèi)部的租戶環(huán)境劃分。每個(gè)命名空間內(nèi)包含多個(gè)容器服務(wù),并建立對(duì)應(yīng)的容器服務(wù)。各個(gè)命名空間件的容器服務(wù)不可互相訪問,只能通過命名空間的服務(wù)來訪問。以此實(shí)現(xiàn)通過命名空間對(duì)環(huán)境的隔離。
以提升用戶的體驗(yàn)和滿意度,提高云存儲(chǔ)系統(tǒng)質(zhì)量為目標(biāo),建設(shè)基于容器環(huán)境的云存儲(chǔ)在線應(yīng)用系統(tǒng),研究基于Docker 技術(shù)快速構(gòu)建容器基礎(chǔ)設(shè)施,構(gòu)建一套容器云平臺(tái),解決容器的多種資源編排和調(diào)度統(tǒng)一管理問題,實(shí)現(xiàn)云存儲(chǔ)在線應(yīng)用系統(tǒng)的輕量級(jí)自動(dòng)化部署與管理功能。容器云環(huán)境的基礎(chǔ)架構(gòu)如圖1 所示。
針對(duì)云存儲(chǔ)在線應(yīng)系統(tǒng)的建設(shè)要求,實(shí)現(xiàn)如下幾個(gè)關(guān)鍵功能:
(1)大規(guī)?;A(chǔ)設(shè)施管理,實(shí)現(xiàn)容器與現(xiàn)有IaaS 平臺(tái)融合和統(tǒng)一管理,實(shí)現(xiàn)大規(guī)模集群資源的自動(dòng)化接入和管理,支持云存儲(chǔ)在線應(yīng)用系統(tǒng)的應(yīng)用服務(wù)及合作伙伴系統(tǒng)的IT 資源需求,支持一鍵式的應(yīng)用部署和應(yīng)用管理功能。
(2)資源編排和調(diào)度:研究容器的Kubernetes、Mesos、Swarm、Cattle 等多種業(yè)界主流編排引擎支持問題,滿足云存儲(chǔ)在線應(yīng)用生態(tài)圈建設(shè)的用戶對(duì)各種類型資源編排和調(diào)度需求。
(3)實(shí)現(xiàn)彈性擴(kuò)容機(jī)制,以應(yīng)用為顆粒度進(jìn)行動(dòng)態(tài)的負(fù)載管理,配合持續(xù)部署規(guī)則,實(shí)現(xiàn)復(fù)雜場景下的應(yīng)用全自動(dòng)彈性伸縮。
(4)支持云存儲(chǔ)在線應(yīng)用的按照預(yù)先配置的策略,完成應(yīng)用的自動(dòng)化打包封裝和交付過程。
(5)持續(xù)部署技術(shù),支持云存儲(chǔ)在線應(yīng)用的按可通過全自動(dòng)化的策略驅(qū)動(dòng),配合可定制的部署模板及調(diào)度策略,實(shí)現(xiàn)應(yīng)用的一鍵部署及自動(dòng)運(yùn)維。
(6)無狀態(tài)容器的分布式存儲(chǔ)后端設(shè)計(jì)。
容器鏡像是一種自包含格式,即包含云應(yīng)用及其所有依賴,運(yùn)行容器時(shí)無需任何外部依賴,可以充分保證云應(yīng)用的遷移性。如果容器應(yīng)用需要持久保存數(shù)據(jù),即有狀態(tài)容器,如何保證數(shù)據(jù)的遷移性就成為一個(gè)迫切需要解決的問題。解決問題的思路是分別處理容器和數(shù)據(jù)的生命周期,在容器引擎或容器云層面實(shí)現(xiàn)持久存儲(chǔ)。
圖2:基于容器環(huán)境的微服務(wù)基礎(chǔ)架構(gòu)示意
圖3:云存儲(chǔ)在線應(yīng)用的功能架構(gòu)設(shè)計(jì)圖
第一種是基于單臺(tái)宿主機(jī)器的持久存儲(chǔ)解決方案,由該宿主機(jī)負(fù)責(zé)持久保存容器的數(shù)據(jù)。以Docker 容器引擎為例,運(yùn)行容器時(shí)指定數(shù)據(jù)卷參數(shù),能把宿主機(jī)系統(tǒng)的文件系統(tǒng)映射到容器內(nèi)部文件系統(tǒng)。即使容器宕機(jī),數(shù)據(jù)也仍然持久保存在當(dāng)前宿主機(jī)上。當(dāng)然,容器不再具備遷移性,因?yàn)閿?shù)據(jù)仍然保留在宿主機(jī)器上。
第二種是基于多臺(tái)宿主機(jī)器的持久存儲(chǔ)解決方案。從Docker容器引擎1.8 版開始,提供了卷插件功能,確立容器引擎與存儲(chǔ)后端的標(biāo)準(zhǔn)接口和交互方式。容器云Kubernetes 提供持久卷功能,支持有狀態(tài)容器集合的運(yùn)行。Apache Mesos 也提供類似的持久卷和共享持久卷功能。由此可見,主流容器云實(shí)現(xiàn)都提供支持有狀態(tài)容器的前端接口,問題的關(guān)鍵變成如何選擇合適的持久存儲(chǔ)后端。
為了運(yùn)行有狀態(tài)容器,需要存儲(chǔ)后端提供存儲(chǔ)資源池。本項(xiàng)目擬研究一種由容器云統(tǒng)一管理的分布式存儲(chǔ)系統(tǒng),不僅支持物理節(jié)點(diǎn)、虛擬機(jī)節(jié)點(diǎn)和容器節(jié)點(diǎn)存儲(chǔ)的匯集和釋放,還同時(shí)提供了對(duì)象存儲(chǔ)、塊存儲(chǔ)和文件存儲(chǔ)接口,滿足部署和運(yùn)行有狀態(tài)云原生應(yīng)用的需求。實(shí)現(xiàn)原理是首先實(shí)現(xiàn)swift 存儲(chǔ)系統(tǒng)的自動(dòng)部署和運(yùn)維,然后實(shí)現(xiàn)與容器持久存儲(chǔ)接口兼容的對(duì)象存儲(chǔ)、塊存儲(chǔ)和文件存儲(chǔ)。
基于Docker 容器環(huán)境,研究云存儲(chǔ)在線應(yīng)用系統(tǒng)架構(gòu)的微服務(wù)化,解決項(xiàng)目的微服務(wù)應(yīng)用,支撐PaaS 應(yīng)用的快速開發(fā)應(yīng)用,以及支持項(xiàng)目服務(wù)應(yīng)用的創(chuàng)新發(fā)展。究基于容器環(huán)境的服務(wù)基礎(chǔ)架構(gòu)如圖2 所示。
如圖2 所示:
(1)服務(wù)注冊中心微服務(wù)改造,解決項(xiàng)目的服務(wù)定位問題,以實(shí)現(xiàn)云端中間層服務(wù)發(fā)現(xiàn)和故障轉(zhuǎn)移。通過服務(wù)發(fā)現(xiàn)與注冊,實(shí)現(xiàn)只需要使用服務(wù)的標(biāo)識(shí)符,便能訪問到服務(wù)。
(2)構(gòu)建統(tǒng)一配置中心,為各應(yīng)用的所有環(huán)境提供了一個(gè)中心化的外部配置。通過構(gòu)建統(tǒng)一配置中心,支持應(yīng)用服務(wù)可以通過部署管道來進(jìn)行測試或者投入生產(chǎn);平臺(tái)可以分別為這些環(huán)境創(chuàng)建配置,并且在需要遷移環(huán)境的時(shí)候獲取對(duì)應(yīng)環(huán)境的配置來運(yùn)行。
(3)服務(wù)網(wǎng)關(guān)是微服務(wù)架構(gòu)中一個(gè)不可或缺的部分。通過服務(wù)網(wǎng)關(guān)統(tǒng)一向外系統(tǒng)提供REST API 的過程中,除了具備服務(wù)路由、均衡負(fù)載功能之外,它還具備了權(quán)限控制等功能;通過將權(quán)限控制這些較重的非業(yè)務(wù)邏輯內(nèi)容遷移到服務(wù)路由層面,使得服務(wù)集群主體能夠具備更高的可復(fù)用性和可測試性。
云存儲(chǔ)在線應(yīng)用系統(tǒng)以分布式存儲(chǔ)技術(shù)來構(gòu)建存儲(chǔ)層,并在云存儲(chǔ)架構(gòu)的基礎(chǔ)上,研發(fā)文件管理、工作空間、信息交流等服務(wù)體系。
云存儲(chǔ)在線應(yīng)用服務(wù)內(nèi)容設(shè)計(jì)如圖3 所示。
(1)結(jié)合容器技術(shù)的特點(diǎn)研發(fā)項(xiàng)目云存儲(chǔ)在線應(yīng)用與開發(fā)的應(yīng)用中心,支持合作伙伴在平臺(tái)的應(yīng)用開發(fā)和快速部署;通過多應(yīng)用服務(wù)接入,共同營造云存儲(chǔ)在線應(yīng)用的服務(wù)生態(tài)圈。支持包括iPhone、Android、PC 和Web 等多平臺(tái)訪問,用戶可以隨時(shí)隨地享受本項(xiàng)目帶來的移動(dòng)互聯(lián)信息服務(wù),輕松實(shí)現(xiàn)移動(dòng)辦公。
(2)基于容器環(huán)境的云存儲(chǔ)在線應(yīng)用系統(tǒng)核心模塊設(shè)計(jì),該系統(tǒng)采用分層概念設(shè)計(jì),將應(yīng)用和核心模塊分離,逐步打造云存儲(chǔ)的PaaS 平臺(tái)和針對(duì)各行業(yè)的垂直SaaS 服務(wù)。核心模塊研究的關(guān)鍵技術(shù)如下:系統(tǒng)采用模塊化設(shè)計(jì),同時(shí)將接口以HTTP REST API 的方式開放,支持多種方式接入;對(duì)用戶數(shù)據(jù)和文件采用分布式存儲(chǔ),保證用戶資料的安全,確保每個(gè)數(shù)據(jù)都有多個(gè)備份;提供日志管理功能,包括日志記錄,及報(bào)表分析和用戶行為數(shù)據(jù)挖掘;研究對(duì)象緩存技術(shù),幫助用戶將常用的數(shù)據(jù)和對(duì)象裝載到內(nèi)存數(shù)據(jù)庫中,保證數(shù)據(jù)的快速訪問;研究數(shù)據(jù)安全技術(shù),通過訪問控制、備份策略、加密技術(shù)、認(rèn)證等方式保證用戶數(shù)據(jù)的傳輸安全和存儲(chǔ)安全。
本系統(tǒng)基于云原生技術(shù),研究云存儲(chǔ)在線應(yīng)用系統(tǒng),解決了容器后端持久化存儲(chǔ)及開放API 的問題,滿足大規(guī)模云存儲(chǔ)在線應(yīng)用,實(shí)現(xiàn)信息存儲(chǔ)、分發(fā)、共享等功能。