王駿翔, 郭 磊
(中遠(yuǎn)海運科技股份有限公司,上海200135)
隨著IaaS(Infrastructure-as-a-Service)基礎(chǔ)架構(gòu)層的服務(wù)器虛擬化技術(shù)不斷發(fā)展,如何進(jìn)一步對傳統(tǒng)服務(wù)資源進(jìn)行有效整合和再利用得到廣泛關(guān)注和深入研究。隨著企業(yè)級微服務(wù)應(yīng)用迅速發(fā)展,Containers容器技術(shù)雖然會在一定程度上模糊IaaS基礎(chǔ)設(shè)施即服務(wù)與PaaS(Platform-as-a-Service)平臺即服務(wù)之間的界限,但能大大提升傳統(tǒng)虛擬化和物理環(huán)境上的工作效率。由此,容器云被提出并得以實現(xiàn)。
目前,主流的微服務(wù)架構(gòu)技術(shù)方案都采用Docker容器技術(shù)。Docker是一個開源的應(yīng)用容器引擎,能極大程度地消除開發(fā)環(huán)境與運維環(huán)境的差異,便于進(jìn)行版本管理和持續(xù)交付,使開發(fā)者既能將其應(yīng)用和依賴包打包到一個可移植的容器中,并發(fā)布到任何流行的機器上,又可實現(xiàn)虛擬化。Docker的一些特性(如隔離、物理機制等)與微服務(wù)架構(gòu)有著天然的契合度,因此成為構(gòu)建容器云服務(wù)平臺的基礎(chǔ)。
對于大型企業(yè)而言,迫切需要構(gòu)建一套具備高可用性、高性能、高安全性和易擴展性的容器云服務(wù)平臺,用于承載微服務(wù)系統(tǒng)的應(yīng)用,而僅依靠Docker容器技術(shù)無法完全滿足該要求。因此,業(yè)界一些開源項目開始不斷涌現(xiàn)、發(fā)展和狀大,自我定位在服務(wù)編排和部署工具之上、傳統(tǒng)的PaaS平臺之下,在功能上既保證容器群集的高效編排和運維,又提供恰當(dāng)?shù)钠脚_層服務(wù),為系統(tǒng)研發(fā)人員和運維人員提供更大的發(fā)揮空間,如Docker Swarm、Google Kubernetes和Mesos/Marathon。
Kubernetes是由Google提出的一種全新的基于容器技術(shù)的分布式架構(gòu)方案,與Docker Swarm和Mesos相比,具有更完備的群集管理能力,包括多層次的安全防護(hù)和準(zhǔn)入機制、多租戶應(yīng)用支撐能力、透明的服務(wù)注冊和服務(wù)發(fā)現(xiàn)機制、內(nèi)建智能負(fù)載均衡器、強大的故障發(fā)現(xiàn)和自我修復(fù)能力、服務(wù)滾動升級和在線擴容能力、可擴展的資源自動調(diào)度機制及多顆粒度的資源配合管理能力。鑒于Kubernetes有Google強大的開源支撐和成功應(yīng)用的案例,基于Kubernetes和Docker構(gòu)建容器云服務(wù)平臺是大型企業(yè)構(gòu)建生產(chǎn)環(huán)境容器云服務(wù)平臺的較優(yōu)選擇之一。
某大型集團企業(yè)已利用虛擬化技術(shù)實現(xiàn)內(nèi)部私有云IaaS平臺的建設(shè),云計算虛擬化技術(shù)已給該企業(yè)帶來服務(wù)器運算資源集中、應(yīng)用開發(fā)速度提升、運維成本下降和系統(tǒng)穩(wěn)定性提高等顯著成效。同時,隨著微服務(wù)應(yīng)用的迅速發(fā)展及容器技術(shù)的逐漸成熟和廣泛應(yīng)用,該企業(yè)開始利用Docker容器技術(shù)對效率和穩(wěn)定性的進(jìn)一步提升進(jìn)行探索實踐——通過用輕量級的Docker Engine取代原有重復(fù)的虛擬化層(Hypervisor)和系統(tǒng)服務(wù)層(Guest OS),更靈活、高效地利用Linux Namespaces和Cgroups技術(shù)為應(yīng)用程序提供隔離性高、安全靈活的運行空間和運行資源(見圖1)。

圖1 Docker容器技術(shù)與傳統(tǒng)虛擬化技術(shù)架構(gòu)對比
應(yīng)用Docker容器技術(shù)給該企業(yè)的信息化建設(shè)帶來的好處包括:持續(xù)部署與測試;跨云平臺支持;環(huán)境標(biāo)準(zhǔn)化和版本控制;高資源利用率與隔離;容器跨平臺性與鏡像;易于理解和應(yīng)用;應(yīng)用鏡像倉庫。
微服務(wù)是開發(fā)一種單純、小型、有意義的功能作為一項單一服務(wù)。通過微服務(wù)能將功能分解到離散的各服務(wù)中去,降低系統(tǒng)的耦合性,提供更加靈活的服務(wù)支持。微服務(wù)的優(yōu)點包括:
1)體量小,用于實現(xiàn)一種特定的功能或業(yè)務(wù)需求;
2)可由一個小的開發(fā)組獨立完成開發(fā);
3)松耦合,服務(wù)之間可獨立進(jìn)行開發(fā)和部署;
4)可用不同的語言開發(fā);
5)可通過持續(xù)集成工具,便捷地自動集成部署;
6)易于理解、修改和維護(hù);
7)易擴展。
圖2為傳統(tǒng)應(yīng)用架構(gòu)與微服務(wù)架構(gòu)對比。Docker提供有編譯、上傳、下載、啟動和停止容器的所有必要功能,對于在單主機環(huán)境中容器數(shù)量最少的情況下管理這些過程而言是很合適的。但是,對于企業(yè)級應(yīng)用而言,當(dāng)需跨多個主機管理大量的Docker容器時,集群環(huán)境下的Docker宿主機所面對的網(wǎng)絡(luò)、負(fù)載均衡、服務(wù)發(fā)現(xiàn)和高可用等特殊需求都帶來了很大的困擾。

圖2 傳統(tǒng)應(yīng)用架構(gòu)與微服務(wù)架構(gòu)對比
該大型企業(yè)雖然已利用Docker容器技術(shù)陸續(xù)開展并實現(xiàn)容器化和微服務(wù)的轉(zhuǎn)型,但在大規(guī)模群集部署和應(yīng)用時,傳統(tǒng)的Docker應(yīng)用依然存在諸多問題:
1)多元化平臺不利于統(tǒng)一管理;
2)獨立的容器服務(wù)不利于企業(yè)進(jìn)行大規(guī)模信息系統(tǒng)的建設(shè);
3)高可用、高冗余副本缺失,靈活度低;
4)人工運維,缺乏自動的彈性伸縮。
調(diào)度和編排是集群管理的重要組成部分。當(dāng)應(yīng)用被擴展到多臺宿主機時,管理每個宿主系統(tǒng)和抽象化底層平臺的復(fù)雜性變得更高。編排是一個廣義的概念,是指容器調(diào)度、集群管理和可能的其他主機供應(yīng)配置。容器管理是控制一組宿主機的過程,包括從一個集群中添加或移除主機、獲取宿主機或容器當(dāng)前的狀態(tài)信息和啟動或管理進(jìn)程。集群管理與調(diào)度緊密相連,因為調(diào)度必須有權(quán)限通過集群中的每臺宿主機來管理服務(wù)。
Kubernetes作為Docker生態(tài)圈中的重要一員,是Google大規(guī)模容器管理技術(shù)的開源版本,基于Docker實現(xiàn)包括應(yīng)用部署、服務(wù)編排、高可用管理和彈性伸縮在內(nèi)的一系列功能,具有以下優(yōu)點:
1)提供高可用、高冗余的群集化管理模式;
2)為容器組件提供高效的彈性伸縮;
3)提供一整套易于對接的RESTfull API;
4)能與企業(yè)級微服務(wù)架構(gòu)無縫結(jié)合;
5)實現(xiàn)零停機的灰度發(fā)布。
通過合理的資源和組件架構(gòu)設(shè)計,按不同業(yè)務(wù)功能和模塊對該大型集團企業(yè)的各Docker容器資源進(jìn)行拆分,并納入到不同的容器群集服務(wù)中,通過借助Kubernetes的Pod和Service分組化管理實現(xiàn)不同業(yè)務(wù)類型服務(wù)器資源的最大隔離及促進(jìn)企業(yè)應(yīng)用微服務(wù)的合理有效拆分和運營[2]。
在容器集群規(guī)劃中,將承載微服務(wù)的Docker容器部署于Kubernetes集群體系中,利用其Master組件(APIs、Scheduler、Etcd)和多個Node節(jié)點組件(Kubelet、Kube-Proxy)及分布式存儲系統(tǒng)保障容器群集的高效、穩(wěn)定服務(wù)。將整個系統(tǒng)模塊分為運行在Node節(jié)點上的容器服務(wù)和運行在Master節(jié)點上的用于組成集群級別的控制管理服務(wù)。
Kubernetes節(jié)點有運行應(yīng)用容器必備的服務(wù),而這些都受Master的控制。每個節(jié)點上都需運行Docker服務(wù),用來負(fù)責(zé)所有具體的映像下載和容器運行。
Kubernetes體系主要由以下核心組件組成:
1)Etcd,負(fù)責(zé)提供和保存整個集群的狀態(tài);
2)APserver,負(fù)責(zé)提供資源操作的唯一入口,并提供認(rèn)證、授權(quán)、訪問控制、API注冊和發(fā)現(xiàn)等機制;
3)Controller Manager,負(fù)責(zé)維護(hù)集群的狀態(tài),如故障檢測、自動擴展和滾動更新等;
4)Scheduler,負(fù)責(zé)調(diào)度資源,按照預(yù)定的調(diào)度策略將Pod調(diào)度到相應(yīng)的機器上;
5)Kubelet,負(fù)責(zé)容器的生命周期維護(hù)及Volume(CVI)和網(wǎng)絡(luò)(CNI)管理;
6)Container runtime,負(fù)責(zé)鏡像管理及Pod和容器的真正運行(CRI);
7)Kube-Proxy,負(fù)責(zé)為Service提供Cluster內(nèi)部的服務(wù)發(fā)現(xiàn)和負(fù)載均衡。
Kubernetes的體系架構(gòu)見圖3。
鏡像倉庫作為Docker容器環(huán)境的重要組成部分,主要用來存儲和管理容器鏡像。Docker有公共的鏡像倉庫,考慮到定制化、便捷性和安全性等因素,大部分企業(yè)都會基于自身環(huán)境需求構(gòu)建內(nèi)部專屬的鏡像倉庫進(jìn)行統(tǒng)一運營和維護(hù)。

圖3 Kubernetes的體系架構(gòu)
根據(jù)該企業(yè)業(yè)務(wù)系統(tǒng)的結(jié)構(gòu)和功能特色,定制化地設(shè)計相應(yīng)的基于應(yīng)用商店的Docker鏡像倉庫,并通過利用Kubernetes的RC副本復(fù)制機制和NFS共享存儲保證其服務(wù)可靠和運行穩(wěn)定。
2.3.1 通過Replication Controller/Replicat Set服務(wù)提供Pod組件的冗余性[3]
RC是Kubernetes集群中用來保證Pod服務(wù)組件高可用的API對象。通過旁路監(jiān)控運行中的Pod來保證集群中運行指定數(shù)目的Pod副本。指定的Pod Replication數(shù)目既可是多個,也可是1個;若運行中的Pod少于指定數(shù)目,RC就會啟動并運行新的Pod副本;若運行中的Pod多于指定數(shù)目,RC就會消除多余的Pod副本。即使是在指定數(shù)目為1的情況下,通過RC運行Pod也比直接運行Pod更合理,因為RC也可發(fā)揮其高可用的能力,保證始終有1個Pod在運行。
Replicat Set是Kubernetes體系中的新一代RC,具有與RC相同的高可用能力,主要區(qū)別在于Replicat Set能支持更多種類的匹配模式,更靈活便捷。Replicat Set一般不單獨使用,而是作為Deployment的理想狀態(tài)參數(shù)使用。
2.3.2 通過多節(jié)點Master和Etcd群集保障群集服務(wù)的冗余性
鑒于Kubernetes中Master和Etcd組件的重要性,在設(shè)計容器云的部署架構(gòu)時,通過采用部署Active-Active的方式和Etcd服務(wù)集群的模式來保障其整個容器群集的冗余和穩(wěn)定。Kubernetes高可用群集架構(gòu)見圖4。

圖4 Kubernetes高可用群集架構(gòu)
1)Master服務(wù)的Active-Active設(shè)計。Kube-Controller-Manager和Kube-Scheduler服務(wù)通過添加--leader-elect=true參數(shù)來保證其服務(wù)同時啟動,系統(tǒng)會自動選舉leader;Kube-Apiserver原生則支持多節(jié)點同時運行,通過配置VIP對其進(jìn)行浮動指向。
2)Etcd服務(wù)的集群設(shè)計。Etcd支持集群化部署方式,規(guī)劃通過利用Static的方式對其集群進(jìn)行配置。
與傳統(tǒng)的IaaS和虛擬化平臺架構(gòu)不同,Kubernetes和Docker容器云服務(wù)平臺主要用來解決企業(yè)級的微服務(wù)應(yīng)用和Docker容器的孤島現(xiàn)象,提供統(tǒng)一的服務(wù)管理、彈性伸縮及高可用的容器集群、服務(wù)發(fā)現(xiàn)和服務(wù)編排的PaaS平臺。
Kubernetes提供并支持多種部署方式,如:適用于入門和基礎(chǔ)功能測試的Minikube方式;適用于開發(fā)測試環(huán)境的Kubeadm Cluster方式;適用于高可用生產(chǎn)環(huán)境的多組件冗余方式等。這里為滿足大型企業(yè)生產(chǎn)環(huán)境的高可用需求,計劃在底層環(huán)境的建設(shè)中在X86物理服務(wù)器上直接構(gòu)建,并通過一系列核心組件冗余的方式進(jìn)行設(shè)計部署,以確保其整個平臺的高可用和穩(wěn)定性[4]。
Docker引擎的環(huán)境部署可利用YUM的方式進(jìn)行,Docker.repo的配置源信息為:
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
Kubernetes基礎(chǔ)環(huán)境的部署可通過源碼下載,利用二進(jìn)制編譯的方式進(jìn)行systemctl服務(wù)注冊配置。
對于私有鏡像倉庫的配置,可通過利用Kubernetes的群集環(huán)境進(jìn)行Service和Replication Controller的配置部署,以保障其Pod服務(wù)的高可用。
Kubernetes系統(tǒng)的各組件需采用TLS證書對通信進(jìn)行加密,通過cfsslgencert生成證書和密鑰,并將.pem密鑰文件存放于各節(jié)點的/etc/kubernetes/ssl目錄中。同時,通過配置多Mater節(jié)點服務(wù)和Etcd群集的方式構(gòu)建Kubernetes高可用環(huán)境(見圖5)。

圖5 Kubernetes Master和Etcd組件架構(gòu)圖
3.3.1 Master服務(wù)Active-Active模式的實現(xiàn)
在部署Kubernetes Master服務(wù)時,通過對Kube-Controller-Manager和Kube-Scheduler服務(wù)添加--leader-elect=true參數(shù)來保證其服務(wù)的同時啟動,系統(tǒng)會自動選舉leader。
3.3.1.1 Kube-Controller-Manager服務(wù)
Kube-Controller-Manager的Serivce配置為:
[Unit]
...
[Service]
Environment File=-/etc/kubernetes/config
Environment File=-/etc/kubernetes/controller-manager
ExecStart=/usr/bin/kube-controller-manager
$KUBE_LOGTOSTDERR
$KUBE_LOG_LEVEL
$KUBE_MASTER
$KUBE_CONTROLLER_MANAGER_ARGS
Restart=on-failure
Limit NOFILE=65536
[Install]
...
3.3.1.2 Kube-Scheduler服務(wù)
Kube-Scheduler的Serivce配置為:
[Unit]
...
[Service]
EnvironmentFile=-/etc/kubernetes/config
Environment File=-/etc/kubernetes/scheduler
ExecStart=/usr/bin/kube-scheduler
$KUBE_LOGTOSTDERR
$KUBE_LOG_LEVEL
$KUBE_MASTER
$KUBE_SCHEDULER_ARGS
Restart=on-failure
Limit NOFILE=65536
[Install]
...
3.3.2 Etcd服務(wù)集群環(huán)境的實現(xiàn)
在云計算時代,如何讓服務(wù)快速透明地接入到計算集群中,如何讓共享配置信息快速被集群中的所有機器發(fā)現(xiàn),如何構(gòu)建一套高可用、安全、易于部署和響應(yīng)快速的服務(wù)集群,已成為迫切需要解決的問題,而Etcd服務(wù)可為有效解決該問題助力。
Etcd服務(wù)是一個高可用的鍵值存儲系統(tǒng),主要用于配置共享和服務(wù)發(fā)現(xiàn)。Etcd是由CoreOS開發(fā)、維護(hù)的,借鑒Zoo Keeper和Doozer,使用Go語言編寫,并通過Raft一致性算法處理日志復(fù)制以保證強一致性。
Etcd Raft協(xié)議見圖6,每個Etcd節(jié)點都維護(hù)一個狀態(tài)機,且任意時刻至多存在1個有效的主節(jié)點。主節(jié)點處理所有來自于客戶端的寫操作,通過Raft協(xié)議保證寫操作對狀態(tài)機的改動會可靠地同步到其他節(jié)點。

圖6 Etcd Raft協(xié)議
Etcd工作原理的核心部分是Raft協(xié)議,主要分為選主、日志復(fù)制和安全性等3部分。Etcd具有以下4個特點:
1)簡單,基于HTTP+JSON的API使得通過curl命令就可輕松使用;
2)安全,可選SSL客戶認(rèn)證機制;
3)快速,每個實例每秒支持1 000次寫操作;
4)可信,采用Raft算法充分實現(xiàn)分布式。
利用云計算Kubernetes和Docker容器云技術(shù)實現(xiàn)大型集團企業(yè)資源整合是較為高效、穩(wěn)妥和冗余的建設(shè)方案。該大型集團企業(yè)建設(shè)容器云服務(wù)平臺前后的技術(shù)指標(biāo)對比見表1。

表1 某大型集團企業(yè)建設(shè)容器云服務(wù)平臺前后的技術(shù)指標(biāo)對比
從表1中可看出,容器云服務(wù)平臺的建設(shè)不僅使整體容器云服務(wù)的管理、伸縮性和性能等得到了提升,同時給整個架構(gòu)體系模式帶來了質(zhì)的飛躍。未來該企業(yè)所有的微服務(wù)系統(tǒng)和容器的需求都將在該Kubernetes和Docker容器云平臺上進(jìn)行統(tǒng)一的資源服務(wù)開設(shè)、管理和回收,將極大地降低企業(yè)運維成本和數(shù)據(jù)服務(wù)資源的生命周期管理成本。
如今越來越多的企業(yè)面臨IaaS和PaaS云平臺的建設(shè)及微服務(wù)系統(tǒng)的構(gòu)建和轉(zhuǎn)型。對此,在企業(yè)私有云平臺中構(gòu)建一個企業(yè)自身適用的應(yīng)用容器云服務(wù)體系尤為重要。