新國脈文旅科技有限公司 朱振武
隨著IT技術的不斷發展,新興的基于容器的PaaS云計算技術憑借自身啟動快、資源損耗小、輕量級的、容器中運行的服務功能相對單一等優點迅速被各大企業接受,越來越多的公司開始部署基于容器的PaaS云平臺并將之應用于生產中,本文著重論述大中型企業如何建設企業自己的基于容器的PaaS私有云系統。
私有云計算是一種將企業的計算資源統一管理、統一分配、按需分配的IT服務模式。目前,多數大中型企業在數字化轉型中已實現基于IaaS的云計算,IaaS云技術在一定程度上提升了計算資源的使用率和運維效率。但隨著企業的發展,企業在IT運營和管理上遇到了眾多新挑戰,主要是IT系統越來越龐雜、IT資源越來越多、應用微服務化后,IaaS云技術存在對算力的管理和分配不夠輕便靈活、難于管理海量微服務、自身較重等諸多問題。
為了解決上述問題,大中企業紛紛采用最新IT技術,將企業IT基礎架構從IaaS云逐步升級到PaaS容器云或兩者并存的時代,利用容器云的輕量級、容器化等特點來管理海量微服務、提高資源的利用率、增強系統可靠性、降低IT運營成本。
LXC(Linux Container)是Linux的內核虛擬化技術,LXC通過Namespace實現了進程資源的隔離,通過Cgroups(Control Groups)控制每個Namespace中的資源分配。與傳統虛擬化技術(KVM)相比,LXC與宿主機使用同一個內核,不需要指令級模擬,容器與宿主機的資源可以共享,具有輕量、性能損耗小等優點。
要構建容器云,我們需要選擇一個合適的容器技術。目前,容器技術中具有代表性的有Docker技術和Mesos技術。從當前的容器技術發展分析,Docker技術是業界容器技術的主流和事實標準,是容器云的未來。
Docker是一個基于LXC內核容器技術實現的開源應用容器引擎[1],通過對LXC進行進一步封裝,實現應用程序級別的隔離,它的分層結構設計極大實現了共享資源,降低了系統的資源使用率,啟動非常快,擁有非常高的性能。
容器云架構下,一個業務較復雜的應用將被拆分成若干功能單一的微服務并在容器中運行,為了滿足IT系統的高可用和高并發等需求,一個微服務會有若干副本并行運行。故而容器云中將會有成千上萬的微服務實例,實例之間還進行著紛繁復雜的交互通信,為了高效管理這些微服務,業界一般采用容器編排技術實現海量容器的自動化的管理、監控、故障發現和隔離、故障遷移等工作。
目前成熟的容器編排技術有Swarm和Kubernetes(以下簡稱K8S)等技術。其中,K8S提供了豐富的容器編排和管理功能[2],諸如:服務注冊與發現、服務網關、服務自動遷移、灰度部署、服務治理等,功能涵蓋廣泛,能夠滿足絕大多數企業的IT需求。
我們以K8S和Docker為核心技術,探討如何構建企業級PaaS容器云,并從企業的IT治理等方面進一步闡述如何高效的管理和使用容器云。容器云平臺自底向上共分為IT資源層、服務調度層、云服務層、控制層、云接入層等五層。在IT資源層,使用K8S+Docker技術構建容器云基礎環境,實現對算力的統一管理、按需分配;在服務調度層,借助K8S強大的服務編排能力,實現對服務的注冊與發現、服務所需資源的彈性伸縮、服務生命周期管理等能力;在云服務層,通過對開源軟件進行集成結合自研方式,建設容器云主要支撐系統;在控制層,依托K8S的Ingress網關服務,構建訪問容器云的云網關;在云接入層,構建云服務治理系統及用于外部用戶統一接入容器云的能力開放系統。平臺的系統架構如圖1所示。

圖1 容器云平臺的系統架構Fig.1 System architecture of container cloud platform
容器云采用Master-Slave架構來統籌管理算力,管理節點(Master)及云核心服務軟件(代碼倉庫、鏡像倉庫等)可采用獨立服務器或容器部署,計算(Slave)節點可采用物理機或虛擬機部署(推薦使用物理機)。本文采用管理節點(Master)及云核心服務軟件獨立服務器部署方式,網絡拓撲圖如圖2所示。

圖2 容器云平臺的網絡拓撲Fig.2 Network topology of container cloud platform
容器云基礎環境搭建主要是部署K8S、Docker等容器云核心服務,搭建容器云平臺對系統的軟硬件環境有一定的要求和建議,主要有以下幾個方面:(1)宿主機CPU要支持虛擬化技術并在BIOS中開啟;(2)宿主機操作系統基于X86_64架構的各種Linux發行版,Kernel在4.X以上;(3)Master節點的CPU、內存、存儲建議要高于2core、4G、20G;(4)Node節點的CPU、內存、存儲建議要高于4core 8G 40G;(5)核心軟件版本建議:K8S v1.15以上、Docker v1.15以上、Etcd v2.0以上。
生產環境下,選擇若干臺(一般3臺以上、奇數臺)高性能服務器作為Master節點集群,部署ETCD(有條件的情況下ETCD可以使用獨立服務器部署)、API-Server、Controller-Manager、Scheduler等服務。其中,ETCD作為K8S的運行時數據庫,存儲K8S集群運行時關鍵數據。API-Server負責和ETCD交互,并對外提供統一的API調用入口。Controller-Manager作為K8S集群的管理控制中心,負責集群內Node、Service、Replication等資源的管理。Scheduler負責Node節點資源管理,將Pod合理分配到相應的Node節點。
為了容器云能夠7×24h的高可用性運行,需對ETCD、API-Server等服務進行高可用配置??刹捎肊TCD和API-Server的原生集群能力,結合Keepalived、HA-Proxy實現Master節點的高可用。
Node(Slave)節點是容器云的算力節點,眾多的算力節點形成算力池,在Master統一調度下對外提供云服務。Node節點上需部署Docker、Kubelet、Kuberoute等服務。其中,Docker提供容器服務。Kubelet負責接收Scheduler的指令,維護Pod和上報Pod狀態。Kube-route作為容器云的網絡服務,是K8S Service的訪問代理和Pod的負載均衡器。
在容器云虛擬網絡選型上,我們選擇使用支持CNI網絡的Kube-router組件替代了Kube-proxy組件。相比業界常用的Overlay方式的Flannel網絡,CNI網絡的優點是網絡速度相對較快、帶寬損耗小等優點。如果企業對網絡穩定性有非常高的需求,也可以選擇最為穩定的Flannel網絡。
要使用容器云平臺能夠對外提供服務,我們還需要部署代碼倉庫、Docker鏡像倉庫、云DNS服務、接入網關等容器云配套服務軟件,主要包括如下軟件服務:(1)代碼倉庫:采用開源GitLib作為云平臺的代碼倉庫;(2)鏡像倉庫:選擇一臺服務器并安裝Docker,下載Registry鏡像并配置啟動;(3)容器云DNS:選用Kube-DNS作為云平臺內部DNS服務;(4)服務網關:選用Nginx-Ingress組件實現外部系統通過ClusterIP方式對容器云的訪問。
可利舊現網存儲系統(如:企業現有IaaS云存儲),如果條件允許,也可通使用NFS或GlusterFS等建設容器云專用存儲系統。
容器云基礎環境搭建完成后,平臺的各組件、各模塊的架構和調用關系如圖3所示。

圖3 容器云主要組件調用關系Fig.3 Container cloud's component invocation relationship
為了進一步提升容器云的可用性和自動化程度,還需為容器云配套建設一系列服務治理系統,主要包括基于DevOps的CI/CD自動化流水線子系統、云數據總線服務子系統、微服務日志中心子系統、微服務配置中心子系統等。
企業的容器云構建完成后,并不代表企業就此可以高效的使用容器云,為了更好發揮容器云的優勢,企業需從人力資源管理、IT管理流程和IT研發等方面制定適合自身的工作標準和制度,并在生產活動中持續完善和提升IT管理水平和容器云資源利用水平,為企業生產助力。