1. 程式人生 > >容器技術及其應用白皮書(上)-- 容器技術

容器技術及其應用白皮書(上)-- 容器技術

內容摘要

近年來,容器技術及相關應用得到了國內外越來越多的關注度,研發和應用推廣發展勢頭迅猛。在國外,容器技術已經形成了較成熟的生態圈;在國內,金融企業、網際網路企業、IT企業積極投入容器技術研發和應用推廣,發展勢頭迅猛。為了積極引導我國容器技術和應用發展,我們編寫本白皮書。其主要內容包括:

  • 一、針對容器技術現狀進行研究和分析。一是梳理了容器技術從開始到現在的發展歷程,對現有容器發展的生態結構進行分析,其中包括開源社群、產業聯盟、解決方案廠商等;二是對容器技術框架進行了詳細的描述,對技術框架各層涉及的技術點進行了介紹;三是結合已釋出的國家和國際標準,將現有容器技術對於參考架構的實現情況進行分析;四是分析了容器技術與大資料、物聯網、SDN之間的關係。
  • 二、容器技術發展路線及技術架構。通過列舉容器技術典型4個應用場景,包括PaaS平臺建設、軟體定義資料中心、容器即服務、持續整合和釋出等,分析了容器技術在各種場景下的關鍵成功因素。
  • 三、容器未來發展趨勢。結合容器發展現狀和應用場景應用情況,分析了容器技術在應用過程中面臨的問題,同時提出了容器今後發展的生態圖,對未來容器技術發展進行了展望。

一、概述

1.1 背景

繼虛擬化技術出現後,容器技術逐漸成為對雲端計算領域具有深遠影響的變革技術。容器技術的發展和應用,將為各行業應用雲端計算提供了新思路,同時容器技術也將對雲端計算的交付方式、效率、PaaS平臺的構建等方面產生深遠的影響,具體體現在以下幾個方面:

簡化部署:容器技術可以將應用打包成單一地址訪問的、Registry儲存的、
僅通過一行命令就可以部署完成的元件。不論將服務部署在哪裡,容器都可以從根本上簡化服務部署工作。 
快速啟動:容器技術對作業系統的資源進行再次抽象,而並非對整個物理機資源進虛擬化,通過這種方式,打包好的服務可以快速啟動。 
服務組合:採用容器的方式進行部署,整個系統會變得易於組合,通過容器技術將不同服務封裝在對應的容器中,之後結合一些指令碼使這些容器按照要求相互協作,這樣操作不僅可以簡化部署難度還可以降低操作風險。 
易於遷移:容器技術最重要的價值就是為在不同主機上執行服務提供一個輕便的、一致的格式。容器格式的標準化加快交付體驗,允許使用者方便地對工作負載進行遷移,避免侷限於單一的平臺提供商。 
為更好地推進容器及相關技術在中國的落地與實踐,推動容器技術在國內的落地,並建立順應國際技術發展趨勢、符合中國本地化特徵的容器標準體系,中國開源雲聯盟容器工作組開展了本白皮書的研製工作,白皮書立足於容器技術發展的演進路線圖,分析容器技術在應用過程中的應用場景以及面臨的具體問題和關鍵成功因素,描繪容器技術未來的發展趨勢和方向。本白皮書的釋出,旨在與業界分享我們在容器技術領域的研究成果和實踐經驗,呼籲社會各界共同關注容器技術的同時,共同推動容器技術的發展,提升容器技術在雲端計算領域中實踐和服務能力。

1.2 相關術語

  • 表1.1 術語
術語 定義/解釋
映象 系統檔案及其應用檔案以特殊的檔案形式進行備份製作成單一的檔案。
微服務架構 微服務架構是一種特定的軟體應用程式設計方式——將大型軟體拆分為多個獨立可部署服務組合而成的套件方案。
開發運維一體化 可定義為是一種過程、方法、文化、運動或實踐,主要是為了通過一條高度自動化的流水線來加強開發和其他IT職能部門之間的溝通和協作,加速軟體和服務的交付。
執行時引擎 指使用者用來執行容器映象的軟體系統

1.3 縮略語

  • 表1.2 縮略語
術語 解釋
CI/CD Continuous Integration/Continuous Delivery,持續整合和持續交付
CaaS Container as a Service ,容器即服務
CCRA Cloud Computing Reference Architecture,雲端計算參考架構
CLI command-line interface,命令列介面
DC/OS DataCenter Operating System,資料中西作業系統
DevOps Development and Operations,開發運維一體化
DNS Domain Name System,域名系統
IaaS Infrastructure as a Service,基礎設施即服務
PaaS Platform as a Service,平臺即服務
SaaS Software as a Service,軟體即服務
SDN Software Defined Network,軟體定義網路
LXC Linux Container,Linux容器
OCI Open Container Initiative,開放容器組織
VPS Virtual Private Server,虛擬機器專有服務
VM Virtual Machine,虛擬機器

二、容器技術現狀

2.1 容器技術發展演進路徑

  • 圖2.1 容器技術演變路徑

這裡寫圖片描述

容器技術最早可以追溯到1979年UNIX系統中的chroot,最初是為了方便切換root目錄,為每個程序提供了檔案系統資源的隔離,這也是OS虛擬化思想的起源。2000年,BSD吸收並改進了chroot技術,釋出了FreeBSD Jails。FreeBSD Jails除檔案系統隔離,還添加了使用者和網路資源等的隔離,每個Jail還能分配一個獨立IP,進行一些相對獨立的軟體安裝和配置。2001年,Linux釋出了Linux Vserver,Linux VServer依舊是延續了Jails的思想,在一個作業系統上隔離檔案系統、CPU時間、網路地址和記憶體等資源,每一個分割槽都被稱為一個 security context,內部的虛擬化系統被稱為VPS。2004年原SUN公司釋出了Solaris Containers,Solaris Containers作為Solaris 10中的特性發布的,包含了系統資源控制和zones提供的二進位制隔離,Zones 作為在作業系統例項內一個完全隔離的虛擬伺服器存在。2005 年SWsoft公司釋出了OpenVZ,OpenVZ和Solaris Containers非常類似,通過打了補丁的 Linux 核心來提供虛擬化、隔離、資源管理和檢查點。OpenVZ 標誌著核心級別的虛擬化真正成為主流,之後不斷有相關的技術被加入核心。2006 年Google 釋出了 Process Containers,Process Container 記錄和隔離每個程序的資源使用(包括CPU、記憶體、硬碟I/O、網路等),後改名為cgroups(Control Groups),並在2007年被加入Linux核心2.6.24版本中。2008年出現了第一個比較完善的LXC容器技術,基於已經被加入核心的cgroups和Linux namespaces 實現。不需要打補丁,LXC就能執行在任意vanila核心的Linux上。2011年,CloudFoundry釋出了Warden,和LXC不同,Warden可以工作在任何作業系統上,作為守護程序執行,還提供了管理容器的API。2013年Google公司建立了開源的容器技術棧lmctfy,Google開啟這個專案是為了通過容器實現高效能,高資源利用率,同時接近零開銷的虛擬化技術。目前 Kubernetes 中的監控工具 cAdvisor就起源於lmctfy專案,2015年Google將lmctfy的核心技術貢獻給了 libcontainer。2013年Docker誕生,Docker最早是dotCloud(Docker公司的前身,是一家PaaS公司)內部的專案,和Warden類似,Docker最初也用了LXC,後來才自己寫了 libcontainer 替換了 LXC。和其它容器技術不同的是,Docker 圍繞容器構建了一套完整的生態,包括容器映象標準、容器Registry、REST API、CLI、容器叢集管理工具Docker Swarm等;2014年CoreOS建立了rkt,為了改進Docker在安全方面的缺陷,重寫的一個容器引擎,相關容器工具產品包括:服務發現工具etcd和網路工具flannel等。2016年微軟公司釋出基於Windows 的容器技術Hyper-V Container,Hyper-V Container原理和Linux下的容器技術類似,可以保證在某個容器裡執行的程序與外界是隔離的,兼顧虛擬機器的安全性和容器的輕量級。

2.2 容器技術發展生態

隨著容器技術的演進,越來越多的機構開始重視並參與到容器技術的探索中來。從最初的以Unix或Linux專案到開源社群,到各種型別的容器技術創業公司、IT 企業及產業聯盟,容器技術的發展生態也在逐漸得到發展與豐富。在開源社群方面,附錄A中列出了國際上的OCI和CNCF(Cloud Native Computing Foundation,簡稱CNCF,下同),容器的開源專案也在附錄B中列出;在國內的IT 企業和創業公司方面,還提供了多個行業應用案例,這些行業應用案例在附錄 D 中列出;產業聯盟方面包括國際包括 CNCF,國內包括中國開源雲聯盟(COSCL)。容器的開源社群、創業公司、IT 企業、產業聯盟共同構成容器技術發展的生態圈。

2.3 容器技術框架

通過研究、梳理和分析現有的容器技術,形成容器相關技術的技術架構,如圖2.2所示。

這裡寫圖片描述
圖2.2 容器技術框架

2.3.1 伺服器層

當執行容器映象時,容器本身需要執行在傳統作業系統之上,而這個作業系統既可以是基於物理機,也可以是基於 VM。伺服器層包含了這兩種場景,泛指了容器執行的環境,同時容器並不關心伺服器層如何提供和管理,它的期望只是能獲得這些伺服器資源。

2.3.2 資源管理層

資源管理包含了伺服器、作業系統等資源的管理。其中如果是物理伺服器的話,需要涉及物理機管理系統(例如Rocks等);如果是虛擬機器的話,需要使用虛擬化平臺。此外,無論是物理伺服器還是虛擬機器,都需要對其中的作業系統加以管理(例如:Chef、Puppet、Ansible和SaltStack等)。而傳統的儲存和網路管理也包含在資源管理層。由於儲存,網路兩者選擇眾多,不一而足,因此不再列舉。

總而言之,資源管理層的核心目標是對伺服器和作業系統資源進行管理,以支援上層的容器執行引擎。

2.3.3 執行引擎層

容器執行引擎層主要指常見的容器系統,包括 Docker、rkt、Hyper、CRI-O。這些容器系統的共通作用包括啟動容器映象、執行容器應用和管理容器例項。執行引擎又可以分為管理程式和執行時環境兩個模組。 需要注意的是,執行引擎是單機程式,類似虛擬化軟體的KVM和Xen,不是叢集分散式系統。引擎運行於伺服器作業系統之上,接受上層集群系統的管理。
相關開源專案包括:
——資源隔離:Cgroup、Hypervisor;
——訪問限制:Namespace、Hypervisor;
——管理程式:Docker Engine、OCID、hyperd,RKT、CRI-O;
——執行時環境:runC(Docker)、runV(Hyper)、runZ (Solaris)

2.3.4 叢集管理層

可以把容器的叢集管理系統類和針對 VM 的叢集管理系統劃等號,都是通過對一組伺服器執行分散式應用。而這兩者的細微區別在於,VM 的叢集管理系統需要執行在物理伺服器上,而容器叢集管理系統既可以執行在物理伺服器上,也可以執行在 VM 上。 常見的容器叢集管理系統包括:Kubernetes、Docker Swarm、Mesos。這三者各有特色,但隨著時間推移,三者的融合將越發明顯。Kubernetes 在這三者中比較特殊,它的地位更接近 OpenStack。圍繞這 Kubernetes,CNCF 基金會已經建立了一個非常強大的生態體系,這是Docker Swarm和Mesos都不具備的。而CNCF基金會本身也正向著容器界的OpenStack基金會發展,值得大家重點關注。
叢集管理層涉及到的相關開源軟體專案包括:
——指揮排程:Docker Swarm、Kubernetes、Mesos等
——服務發現:Etcd、Consul、Zookeeper,DNS
——監控:Prometheous
——儲存:Flocker
——網路:Calico、Weave、Flannel

2.3.5 應用層

泛指所有運行於容器之上的應用程式,以及所需的輔助系統,包括:監控、日誌、安全、編排、映象倉庫等等。
——監控模組,相關開源專案包括:Prometheous、cAdvisor、Sysdig等;
——日誌,相關開源專案包括:Fluented、LogStash等;
——安全,包括容器映象的安全掃描,執行環境的安全隔離,叢集環境的安全管理等功能;
——編排,相關開源專案包括:Docker Compose、CoreOS Fleet等;
——CI/CD,相關開源專案包括:Jenkins、Buildbot、Gitlab CI、Drone.io;
——映象倉庫:Docker Hub、VMware Harbor、Huawei Dockyard。

2.4 容器技術對參考架構的實現情況

國家標準GB/T 32399-2015《資訊科技 雲端計算 參考架構》(簡稱CCRA,修改採用ISO/IEC 17789)是2015年釋出的國家標準,描述了雲端計算的利益相關者,雲端計算系統的基本特徵,雲端計算的基本活動和功能元件,我國是該國際標準的立項推動國之一,積極參與了該國際標準的編制,該標準的誕生標誌著國際三大標準化組織ISO、IEC和ITU首次在雲端計算領域統一認識並達成一致,是國際國內雲端計算領域的最重要的基礎性標準。在該標準中描述了雲端計算的功能架構,功能架構包含了支撐雲端計算活動所需的功能,如圖2.3。圖中標藍色的部分是現有容器技術已經實現的內容。

這裡寫圖片描述
圖2.3 CCRA功能元件圖

2.5 容器技術的關鍵技術內容

2.5.1 映象

容器的映象通常包括作業系統檔案、應用本身的檔案、應用所依賴的軟體包和庫檔案。為了提高容器映象的管理效率,容器的映象採用分層的形式存放。容器的映象最底層通常是Linux的rootfs和系統檔案,再往上則是各種軟體包層。這些檔案層在疊加後成為完整的只讀檔案系統,最終掛載到容器裡面。在執行過程中,容器應用往往需要寫入檔案資料,容器引擎為此需再建立一個可寫層,加在映象的只讀檔案系統上面。使用分層的容器映象之後,映象的下載和傳輸更加便利,因為只需要在宿主機上把缺少的映象檔案層次下載即可,無需整個映象傳送。

在Linux中,聯合檔案系統UnionFS能夠把多個檔案層疊加在一起,並透明地展現成一個完整的檔案系統。常見的聯合檔案系統有AUFS(AnotherUnion File System),btrfs,OverlayFS和DeviceMapper等。

2.5.2 執行時引擎

容器執行時引擎和容器映象兩者的關係類似於虛擬化軟體和虛擬機器映象的關係。容器執行時引擎的技術標準主要是由OCI基金會領導社群進行制定。目前OCI已經發布了容器執行時引擎的技術規範,並認可了runC(Docker公司提供)和runV(Hyper公司提供)兩種合規的執行引擎。

2.5.3 容器編排

容器編排工具通過對容器服務的編排,決定容器服務之間如何進行互動。容器編排工具一般要處理以下幾方面的內容:
1) 、容器的啟動。選擇啟動的機器、映象和啟動引數等;
2) 、容器的應用部署。提供方法對應用進行部署;
3) 、容器應用的線上升級。提供方法可以平滑地切換到應用新版本。
容器的編排一般是通過描述性語言YAML或者JSON來定義編排的內容。目前主要的編排工具有Docker compose和基於Google的Kubernetes helm等。

2.5.4 容器叢集

容器叢集是將多臺物理機抽象為邏輯上單一排程實體的技術,為容器化的應用提供資源排程、服務發現、彈性伸縮、負載均衡等功能,同時監控和管理整個伺服器叢集,提供高質量、不間斷的應用服務。容器叢集主要包含以下技術:
資源排程:主要以集中化的方式管理和排程資源,按需為容器提供 CPU、記憶體等資源;

服務發現:通過全域性可訪問的註冊中心實現任何一個應用能夠獲取當前環境的細節,自動加入到當前的應用叢集中;

彈性伸縮:在資源層面,監控叢集資源使用情況,自動增減主機資源;在應用層面,可通過策略自動增減應用例項來實現業務能力的彈性伸縮;

負載均衡:當應用壓力增加,叢集自動擴充套件服務將負載均衡至每一個執行節點;當某個節點出現故障,應用例項重新部署執行到健康的節點上。

2.5.5 服務註冊和發現

容器技術在構建自動化運維場景中,服務註冊和發現是重要的兩個環節,一般通過一個全域性性的配置服務來實現。其基本原理類似公告牌資訊釋出系統,A 服務(容器應用或者普通應用)啟動後在配置伺服器(公告牌)上註冊一些對外資訊(比如IP和埠),B服務通過查詢配置伺服器(公告牌)來獲取A註冊的資訊(IP和埠)。

2.5.6 熱遷移

熱遷移(Live Migration),又稱為動態遷移或者實時遷移,是指將整容器的執行時狀體完整儲存下來,同時可以快速地在其他主機或平臺上恢復執行。容器熱遷移主要應用在兩個方面:一是有多個操作單元執行任務,熱遷移能迅速地複製與遷移容器,做到無感知執行作業;二是可以處理資料中心中叢集的負載均衡,大量資料湧來無法執行計算時,可利用熱遷移建立多個容器處理運算任務,調節資訊資料處理峰谷,配置管理負載均衡比例,降低應用延遲。

2.6 容器技術與相關技術的關係

2.6.1 容器與雲端計算

虛擬化是雲端計算的重要基礎,容器定義了一套從構建到執行的標準化體系,改變了傳統的虛擬化技術,深度影響了雲端計算領域,容器是雲端計算的未來。以Docker 為代表的容器技術越來越深刻地影響雲端計算,也改變我們的日常開發、運維和測試。相比於虛擬機器,容器的輕量、快速啟動和低開銷,以及基於此的按業務打包和微服務模式,這些特點被用來改進 DevOps,很多場景下更適合做大規模叢集管理和搭建靈活的分散式系統。通過深度整合了IaaS、PaaS 及容器技術,提供彈性計算、DevOps 工具鏈及微服務基礎設施等服務,幫助企業解決IT、架構及運維等問題,使企業更聚焦於業務,構建了新一代的雲端計算生態體系。

2.6.2 容器與大資料

大資料平臺如果能採用容器方式釋出,與Spark、Hadoop、Cassandra等相關技術的整合與對接,可降低整個系統的搭建難度,縮短交付和安裝週期,減少安裝失敗風險。容器化後,各類大資料平臺元件可以輕鬆實現遷移的目的,也能實現多複本控制和高可用。

2.6.3 容器與物聯網

物聯網(IoT)技術發展日新月異,而容器技術剛好遇到這樣的機遇,將在幾個方面促進物聯網的發展。

首先,運用容器技術後,可通過容器封裝,可簡化下載、安裝部署、啟動和後續應用更新。這將大大加速物聯網應用開發部署。其次,容器技術還可以滿足物聯網在自動監控,集中式維護管理方面的需求。最後,資料採集端環境千變萬化,如果需要手動適配工作量巨大,如果採用容器化技術,只要打包幾類典型的容器映象,如ARM,X86,x86_64等,就可以事半功倍實現終端的釋出工作。

2.6.4 容器與SDN

隨著容器部署規模的增大,跨主機、跨網路的容器遷移成為常態。而容器更多地關注於輕量化本身,對於網路架構並沒有太多關注。過於複雜的體系結構和管理過程,容易讓整個容器網路和系統陷入不可控的非穩定狀態。通過SDN和Overlay網路結合,將控制轉發分離、集中控制管理理念應用於容器網路,還可以最大程度增強容器網路的彈性伸縮能力和簡化網路管理。

另外,SDN與容器的配合,是相得益彰、互相促進的。業界的SDN控制器和系統一般都比較龐大,安裝、執行都極為複雜。通過Docker技術,能夠實現SDN控制器的輕量級快速部署、安裝、執行。