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

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

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

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

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

圖5 Kubernetes Master和Etcd組件架構圖
3.3.1 Master服務Active-Active模式的實現
在部署Kubernetes Master服務時,通過對Kube-Controller-Manager和Kube-Scheduler服務添加--leader-elect=true參數來保證其服務的同時啟動,系統會自動選舉leader。
3.3.1.1 Kube-Controller-Manager服務
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服務
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服務集群環境的實現
在云計算時代,如何讓服務快速透明地接入到計算集群中,如何讓共享配置信息快速被集群中的所有機器發現,如何構建一套高可用、安全、易于部署和響應快速的服務集群,已成為迫切需要解決的問題,而Etcd服務可為有效解決該問題助力。
Etcd服務是一個高可用的鍵值存儲系統,主要用于配置共享和服務發現。Etcd是由CoreOS開發、維護的,借鑒Zoo Keeper和Doozer,使用Go語言編寫,并通過Raft一致性算法處理日志復制以保證強一致性。
Etcd Raft協議見圖6,每個Etcd節點都維護一個狀態機,且任意時刻至多存在1個有效的主節點。主節點處理所有來自于客戶端的寫操作,通過Raft協議保證寫操作對狀態機的改動會可靠地同步到其他節點。

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

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